Docsํ™ˆํŽ˜์ด์ง€ โ†—
ํ•œ๊ตญ์–ด

์šฉ์–ด์ง‘

๐Ÿ“š Burst Time

Burst time์€ ํฌ๊ฒŒ CPU burst time ๊ณผ Device burst time์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.

- CPU burst time

ํŠน์ • ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ CPU ๋งŒ ์—ฐ์‚ฐํ•˜๋Š” ์‹œ๊ฐ„. CPU burst time ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ CPU ์ฝ”์–ด ์ ์œ ์œจ์€ 100 ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- Device burst time

ํŠน์ • ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ CPU๊ฐ€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ Device burst time ์ค‘์ธ ์Šค๋ ˆ๋“œ์˜ CPU ์ฝ”์–ด ์ ์œ ์œจ์€ 0 ์ž…๋‹ˆ๋‹ค. CPU๊ฐ€ ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ์˜ ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ๋Š” ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ค‘, DB ์ฟผ๋ฆฌ ์‹คํ–‰ ์ค‘, ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋กœ์˜ ์„œ๋น„์Šค ์‘๋‹ต ๋Œ€๊ธฐ ์ค‘์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š C++ Singleton

C++ ์–ธ์–ด์—์„œ Singleton๊ณผ ์ „์—ญ ๋ณ€์ˆ˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋Š” WinMain() ์ด๋‚˜ main() ์˜ ์‹คํ–‰ ์‹œ ์ข…๋ฃŒ ์ง์ „์— ํŒŒ๊ดด๋˜์ง€ ์•Š๊ณ , ํ•˜์œ„ ํ˜ธ์ถœ ํ•จ์ˆ˜๋“ค์—์„œ ํŒŒ๊ดด๋ฉ๋‹ˆ๋‹ค. ์ „์—ญ ๋ณ€์ˆ˜๋“ค์˜ ํŒŒ๊ดด ์ˆœ์„œ๋Š” ํ•œ ๊ฐœ์˜ C++ ํŒŒ์ผ์˜ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฌผ์—์„œ๋‚˜ ๋ณด์žฅ๋˜๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ C++ ํŒŒ์ผ๋“ค์˜ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฌผ ๊ฐ„์˜ ํŒŒ๊ดด ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ C++ singleton ์€ WinMain() ์ด๋‚˜ main() ์ด ๋ฆฌํ„ดํ•˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ฒ˜์Œ์œผ๋กœ singleton์„ ์ ‘๊ทผํ•˜๋Š” ์ˆœ๊ฐ„ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ, ํŒŒ๊ดด๋˜๋Š” ์ˆœ์„œ๋„ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ ์—ญ์ˆœ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ „์—ญ ๋ณ€์ˆ˜๋ณด๋‹ค ๋” ์•ˆ์ „ํ•œ ์ƒ์„ฑ/ํŒŒ๊ดด ๊ทœ์น™์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

โžก๏ธ C++ singleton ๊ตฌํ˜„ ์˜ˆ์‹œ
class A
{
    A(){}
public:
    static A& Instance()
    {
        static A inst;
        return inst;
    }
    void Goo() {}
};
 
 
 
void Foo()
{
    A::Instance().Goo();
}

์œ„ ๊ตฌํ˜„์€ ์งง์€ ์‹œ๊ฐ„์— ๋™์‹œ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ singleton์„ ์ ‘๊ทผํ•œ๋‹ค๋ฉด ์ƒ์„ฑ์ž๊ฐ€ 2ํšŒ ์ด์ƒ ํ˜ธ์ถœ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด์„œ๋„ singleton ์ ‘๊ทผ์— ๋Œ€ํ•œ critical section ๋ถ€ํ•˜๊ฐ€ ์—†๋Š” ํด๋ž˜์Šค Proud.CSingleton ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š DB Constraints

ํ•„๋“œ์— ๋“ค์–ด๊ฐˆ ๊ฐ’์ด ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ๋“ค์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค.

Primary Key Unique Index ๊ธฐํƒ€ ๋“ฑ๋“ฑ ( >, <, =, != ) Constraints ๋Š” Unique Index, Trigger ๋“ฑ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“š Fast Heap

ProudNet์˜ Fast heap์€ Lookaside allocator ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋А๋ฆฌ์ง€๋งŒ OS ํ™˜๊ฒฝ์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น/ํ•ด์ œ ์†๋„๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ๋‹ค์–‘ํ•œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์„ ํ• ๋‹น/ํ•ด์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ProudNet์˜ Fast heap์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” Proud.CFastHeap ์ž…๋‹ˆ๋‹ค. Proud.CFastHeap ๋˜ํ•œ Lookaside allocator์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์ด ํŒŒ๊ดด๋œ ํ›„์—์•ผ Proud.CFastHeap ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Fast heap์„ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๋จผ์ € Proud.CFastHeap.New ๋ฉ”์„œ๋“œ๋กœ fast heap ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ „์—ญ ๊ฐ์ฒด๋กœ ์ƒ์„ฑํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

  • Proud.CFastHeap.Alloc ๋ฉ”์„œ๋“œ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  • ํ•ด์ œ๋Š” Proud.CFastHeap.Free ๋กœ ํ•ฉ๋‹ˆ๋‹ค. CFastHeap.Realloc ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋Ÿญ์„ ํ•ด์ œํ•œ ํ›„ Proud.CFastHeap ๊ฐ์ฒด๋ฅผ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š P2P ๊ทธ๋ฃน

๋งŒ์•ฝ ๋‘ ํด๋ผ์ด์–ธํŠธ A,B๊ฐ€ ์„œ๋กœ P2P ํ†ต์‹ ์„ ํ•˜๋ ค๋ฉด A,B๊ฐ€ ๊ฐ™์€ ์ตœ์†Œํ•œ 1๊ฐœ์˜ P2P ๊ทธ๋ฃน์— ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ๋“ค์ด 1๊ฐœ์˜ ์ฑ„ํŒ…์ฐฝ์—์„œ ์„œ๋กœ ์ฑ„ํŒ…์„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„ํŒ…์ฐฝ์„ ๋งŒ๋“ค์–ด์„œ ๋‹ค์ค‘ ์ฑ„ํŒ…๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ์ฑ„ํŒ…์ฐฝ์—์„œ๋Š” ์ฑ„ํŒ…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ProudNet์€ ์ธํ„ฐ๋„ท ๋ฉ”์‹ ์ €์—์„œ ๊ฐ ์ฑ„ํŒ…์ฐฝ์€ P2P ๊ทธ๋ฃน์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋งŒ, ์ฑ„ํŒ…์ฐฝ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฑ„ํŒ…์ฐฝ์— ๋“ค์–ด๊ฐ€๋Š” ๊ถŒํ•œ์ด ์„œ๋ฒ„์—๋งŒ ์žˆ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. P2P ๊ทธ๋ฃน ์‹๋ณ„์ž ๋˜ํ•œ Proud.HostID ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

๐Ÿ“š PIDL

PIDL์€ RMI๋ฅผ ์œ„ํ•œ ์ž์ฒด ์ œ์ž‘๋œ ์ปดํŒŒ์ผ๋Ÿฌ ์ž…๋‹ˆ๋‹ค.

ํŠน์ • ํŒŒ์ผ์— Protocol์„ ์ •์˜ ํ›„ ์„ค์ •ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์ด๋•Œ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Server์™€ Client์—์„œ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— Common(๊ณต์šฉ) Project๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“š Reliable ๋ฉ”์‹œ์ง•

Reliable ๋ฉ”์‹œ์ง•(๋˜๋Š” reliable send)์€ ์†ก์‹  ์ธก์—์„œ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ๊ณผ ์ˆœ์„œ๊ฐ€ ํ•ญ์ƒ ์ˆ˜์‹  ์ธก์—์„œ ๋™์ผํ•˜๊ฒŒ ๋ฐ›๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์‹œ์ง€ A,B,C,D,E๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฐ›๋Š” ์ธก์—์„œ๋„ A,B,C,D,E ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ ์†์‹ค์—†์ด ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์‹ ๋ขฐ์„ฑ(reliablility)์ด ์žˆ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๊ฐ€๋” ์ˆ˜์‹ ๋˜๋Š” ์‹œ๊ฐ„์ด Unreliable ๋ฉ”์‹œ์ง• ์— ๋น„ํ•ด ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š RMI

RMI(Remote Method Invocation, ์›๊ฒฉ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ) ๋Š” ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ํ˜น์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•˜๋ฉฐ, ์†ก์ˆ˜์‹  ๋ฃจํ‹ด๊ณผ ๋ฉ”์‹œ์ง€(Message) ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋”ฉ ์ž‘์—…์„ ์‚ฌ๋žŒ ๋Œ€์‹  ๊ธฐ๊ณ„๊ฐ€ ํ•ด์คŒ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋ฅผ ํž˜๋“ค๊ฒŒ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž‘์—… (๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ์ฒด ์ •์˜, ์†ก์‹  ํ•จ์ˆ˜, ์ˆ˜์‹  ํ•จ์ˆ˜ ์ž‘์„ฑ)์„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ํ˜•ํƒœ๋กœ ๊ฐ„์†Œํ™”ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ RMI ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์„ Proxy, ํ˜ธ์ถœ ๋ฐ›๋Š” ์ชฝ์„ Stub์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

RMI ๊ฐœ๋…
RMI ๊ฐœ๋…2

- RMI๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

// Message header ID definitions
#define Message_Knight_Move_ID 12
#define Message_Knight_Attack_ID 13
 
// Message format definitions
struct Message
{
    int m_msgID;
};
struct Message_Knight_Move:public Message
{
    int m_id;
    float m_x,m_y,m_z;
};
struct Message_Knight_Attack:public Message
{
    int m_id;
    int m_target;
    int m_damage;
};
 
// A function which send a formatted message
void Knight_Move(int id,float x,float y,float z)
{
    Message_Knight_Move msg;
    msg.m_msgID=Message_Knight_Move_ID;
 
    msg.m_id=id;
    msg.m_x=x;
    msg.m_y=y;
    msg.m_z=z;
 
    Send(msg);
}
 
// A function which send a formatted message
void Knight_Attack(int id,int target,int damage)
{
    Message_Knight_Attack msg;
    msg.m_msgID=Message_Knight_Attack_ID;
 
    msg.m_id=id;
    msg.m_target=target;
    msg.m_damage=damage;
 
    Send(msg);
}
 
// Identified a received message 
// and call an appropriate function for message handling
void DoReceivedMessage(Message* msg)
{
    switch(msg->m_msgID)
    {
    case Message_Knight_Move_ID:
    {
        Message_Knight_Move* msg2=
            (Message_Knight_Move*)msg;
 
        Do_Knight_Move(
            msg2->m_id,
            msg2->m_x,
            msg2->m_y,
            msg2->m_z);
    }
    break;
    // ... cases for other message types
    case Message_Knight_Attack_ID:
    {
        Message_Knight_Attack* msg2=
            (Message_Knight_Attack*)msg;
 
        Do_Knight_Attack(
            msg2->m_id,
            msg2->m_target,
            msg2->m_damage);
    }
    break;
    // ... cases for other message types
    }
}c

ํ•˜์ง€๋งŒ RMI๋ฅผ ์“ฐ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์งง์€ ์ฝ”๋“œ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Knight_Move([in] int id,[in] float x,[in] float y,[in] float z);
Knight_Attack([in] int id,[in] int target,[in] int damage);

์œ„ ํ˜•์‹์€ IDL(Interface Description Language) ํ˜•์‹์˜ ์–ธ์–ด๋กœ์„œ, ์ปดํŒŒ์ผํ•˜๋ฉด C++ ๋˜๋Š” C# ์†Œ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๋งŒ๋“ค์–ด์ง„ ์†Œ์Šค ํŒŒ์ผ์€ ๋ฉ”์‹œ์ง€ ๊ตฌ์กฐ์ฒด ์„ ์–ธ, ์†ก์‹  ํ•จ์ˆ˜, ์ˆ˜์‹  ์ฒ˜๋ฆฌ ํ•จ์ˆ˜ ๋“ฑ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ ๋ฃจํ‹ด์„ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ PIDL ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ ์ค‘ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ๋ฉ”์‹œ์ง€๋กœ ๋ฐ”๊พธ์–ด ๋„คํŠธ์›Œํฌ๋กœ ๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์„ proxy, ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์œ ์ € ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“ˆ์„ stub์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ A์—์„œ RMI ํ•จ์ˆ˜ X๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์‹ค์ œ๋กœ X์˜ proxy๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ proxy๋Š” ๋„คํŠธ์›Œํฌ ๋ฉ”์‹œ์ง€๋กœ ๋ฐ”๊พธ์–ด ๊ทธ๊ฒƒ์„ ํ˜ธ์ŠคํŠธ B๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜ธ์ŠคํŠธ B๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ stub์— ๋ณด๋‚ด๋ฉฐ, stub์€ ๋ถ„์„ํ•œ ํ›„ ์œ ์ €๊ฐ€ ์ž‘์„ฑํ•œ ํ•จ์ˆ˜ X๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

RMI ์ฒ˜๋ฆฌ ์ˆœ์„œ

ํ˜ธ์ŠคํŠธ A์—์„œ ํ˜ธ์ŠคํŠธ B์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ๋ชจ์–‘์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์—ฌ์„œ Remote Method Invocation(์›๊ฒฉ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ)์ด๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฒŒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š Stored Procedure

Stored Procedure ์€ DBMS ์ž์ฒด์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” SQL ๊ตฌ๋ฌธ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. Database ๋ฅผ ์ ‘๊ทผํ•  ๋•Œ์—๋Š” ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ๋ฌธ์ž์—ด์„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด ๋˜์ง€์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ๋ฃจํ‹ด์„ Stored Procedure ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ์ €์žฅํ•ด๋‘๊ณ , ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ Stored Procedure ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์„ฑ๋Šฅ๊ณผ ์•ˆ์ •์„ฑ(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž ๊ธˆ ์ •์ฑ… ๋“ฑ)์—์„œ ๋” ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š Unreliable ๋ฉ”์‹œ์ง•

Unreliable ๋ฉ”์‹œ์ง•(ํ˜น์€ unreliable send)์€ ์†ก์‹  ์ธก์—์„œ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ๊ณผ ์ˆœ์„œ๊ฐ€ ํ†ต์‹ ์„ ์˜ ๊ธธ์ด์™€ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜์‹  ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฉ”์‹œ์ง€ A,B,C,D,E๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฐ›๋Š” ์ธก์—์„œ๋Š” A,B,C,D,E๋ฅผ ๋ฐ›๊ธฐ๋„ ํ•˜์ง€๋งŒ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋‘ ๋ฒˆ ๋ฐ›๊ฑฐ๋‚˜(A,B,B,C,C,D,E) ๋ฉ”์‹œ์ง€๊ฐ€ ์ค‘๊ฐ„์— ์†Œ์‹ค๋˜๊ฑฐ๋‚˜(A,B,D) ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๊ฒŒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(A,C,B,E,D)

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์‹œ์ง€ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊นจ์ง€๋Š” ์ผ์€ ์—†์Šต๋‹ˆ๋‹ค. Unreliable ๋ฉ”์‹œ์ง•์ด ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ Reliable ๋ฉ”์‹œ์ง• ๋ณด๋‹ค ์†ก๋‹ฌ๋˜๋Š” ์‹œ๊ฐ„์ด ๋น ๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ“š UUID ๋˜๋Š” GUID

Unique or global universal identifier (UUID ๋˜๋Š” GUID)๋Š” 16๋ฐ”์ดํŠธ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ ๋ธ”๋ก์œผ๋กœ, ์ƒ์„ฑํ•œ GUID ๋Š” ํ™•๋ฅ  ์ƒ ์ „์„ธ๊ณ„์—์„œ ์œ ์ผํ•ฉ๋‹ˆ๋‹ค.

ProudNet DB ์—์„œ๋Š” UUID ๋ฅผ ๊ฐ Gamer, Hero, WorldObject ๋งˆ๋‹ค ๋ฐฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋ก UUID ๊ฐ€ 16bytes ์ด๊ธฐ ๋•Œ๋ฌธ์— ํฌ๊ธฐ๊ฐ€ ํฐ ํŽธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, UUID ๊ฐ€ ์ง€๊ตฌ ์ƒ์—์„œ ์ค‘๋ณต๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ผ€์ด์Šค์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์ด์šฉ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ๋Š” ์„œ๋ฒ„ ํ†ตํํ•ฉ, ๊ฒŒ์ด๋จธ ๊ณ„์ • ์ด๋™, ๊ฒŒ์ด๋จธ ID์˜ ๋ณ€๊ฒฝ ๋“ฑ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ „์—ญ ๊ณ ์œ  ์‹๋ณ„์ž

๐Ÿ“š ๊ฒฝ์Ÿ ์ƒํƒœ (Race Condition)

๊ณตํ•™ ๋ถ„์•ผ์—์„œ ๊ฒฝ์Ÿ ์ƒํƒœ(race condition)๋ž€ ๋‘˜ ์ด์ƒ์˜ ์ž…๋ ฅ ๋˜๋Š” ์กฐ์ž‘์ด ๋™์‹œ์— ์ด๋ฃจ์–ด์ง€๋Š” ์ƒํƒœ๋ฅผ ์ผ์ปซ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํƒœ์—์„œ๋Š” ์ •์ƒ์ ์ธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๊ฒŒ ๋  ์œ„ํ—˜์ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ๊ฒฝ์Ÿ ์œ„ํ—˜์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ „์‚ฐํ•™์—์„œ ๊ฒฝ์Ÿ ์ƒํƒœ๋ž€ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ๋™์‹œ ์ ‘๊ทผํ•  ๋•Œ ์ž๋ฃŒ์˜ ์ผ๊ด€์„ฑ์„ ํ•ด์น˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ์„ธ์Šค ํ˜‘๋ ฅ ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

๊ฒฝ์Ÿ ์ƒํƒœ - Wiki

๐Ÿ“š ๋ฐ์ดํ„ฐ ์–‘์žํ™”

๋ถ€๋™ ์†Œ์ˆ˜์  ๋‹จ์œ„์˜ ํฐ ๊ฐ’์„ ๋„คํŠธ์›Œํฌ๋กœ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ, ํŒจํ‚ท์˜ ์–‘์„ ์ค„์ด๋Š” ํŠธ๋ฆญ์ด ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์บ๋ฆญํ„ฐ ์œ„์น˜ x๊ฐ’์€ 100 ~ 200 ์‚ฌ์ด์—์„œ๋งŒ ๊ฒฐ์ •๋˜๊ณ  ์†Œ์ˆ˜์  ๋‘˜์งธ์ž๋ฆฌ ์ดํ•˜์˜ ์ •๋ฐ€๋„๋Š” ๋ฌด์‹œ๋˜์–ด๋„ ๋  ์ •๋„๋ผ๋ฉด, ์ด ๊ฐ’์€ 100 * 100 = 10000 ์ดํ•˜์˜ ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ double(8๋ฐ”์ดํŠธ)๋ฅผ word(2๋ฐ”์ดํŠธ)๋กœ ์ ˆ์•ฝํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠธ๋ฆญ์„ ์–‘์žํ™”(quantization)์ด๋ผ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค.

์ด ํด๋ž˜์Šค๋Š” ์–‘์žํ™” ๋ฐ ์–‘์žํ™”์˜ ๋ฐ˜๋Œ€ ๊ธ‰๋ถ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Proud::CQuantizer q(-10000,10000,65535); // -10000~10000 ์‚ฌ์ด์˜ ๊ฐ’์„ 65535 ๋“ฑ๋ถ„์˜ ์ •๋ฐ€๋„๋กœ ์–‘์žํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ
double a = 3423.38274f;
int b = q.Quantize(a);      // ์–‘์žํ™”
double c= q.Dequantize(b);  // ์–‘์žํ™”๋œ ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์‹ค์ œ๊ฐ’์„ ๋ณต์›

๐Ÿ“š ๋ฆฌ์Šค๋‹ ํฌํŠธ (Listening Port)

ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ์™€ ํฌํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์ ‘์†์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฆฌ์Šค๋‹ ํฌํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ๋Š” 111.222.111.222 ๋˜๋Š” mycomputer.mydomain.com ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ์ธํ„ฐ๋„ท ์ƒ์—์„œ์˜ ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค. ํฌํŠธ๋Š” 1,000~65,500 ์‚ฌ์ด์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๋Š”2๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ™์€ ๋ฆฌ์Šค๋‹ ํฌํŠธ๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ํ•œ ์–ผ๋งˆ๋“ ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ๋งˆ์ƒฌ๋ง (Marshaling)

RMI ํ˜ธ์ถœ์„ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์‹œ์ง€๋กœ๋ถ€ํ„ฐ RMI๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ’์„ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์„ ๋งˆ์ƒฌ๋ง(marshaling) ์ด๋ผ๊ณ  ์นญํ•ฉ๋‹ˆ๋‹ค. ProudNet์—์„œ๋Š” int๋‚˜ float ๋“ฑ ๊ธฐ๋ณธ์ ์ธ ํƒ€์ž…์— ๋Œ€ํ•œ ๋งˆ์ƒฌ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ

ํ•œ ๊ฐœ์˜ ๋ฉ”์‹œ์ง€๋ฅผ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ์—๊ฒŒ ํ•œ ๋ฒˆ์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์„ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ, ๋ฉ”์‹œ์ง€๋ฅผ ํ•œ ํ˜ธ์ŠคํŠธ์—๋งŒ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์œ ๋‹ˆ์บ์ŠคํŠธ ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ“š ์Šค๋ ˆ๋“œ ํ’€ (Thread Pool)

์Šค๋ ˆ๋“œ 1๊ฐœ๋ฅผ ์ƒ์„ฑ ํ›„ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ •์€ ๋งŽ์€ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ์ค‘์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋งŽ๋‹ค๋ฉด ์šด์˜ ์ฒด์ œ์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ตœ๋Œ€ํ•œ ์ ์€ ์ˆ˜์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ œ๊ฑฐ ๋ฐ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์œ„ํ•ด ์ผ์ • ๊ฐฏ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ ์ง‘ํ•ฉ์„ ๋‘์–ด ํ•„์š” ์‹œ์—๋งŒ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ , ํ•„์š” ์—†์„ ๋• ์ง‘ํ•ฉ์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ์Šค๋ ˆ๋“œ ํ’€์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์ฆ‰, ์Šค๋ ˆ๋“œ ํ’€์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฏธ๋ฆฌ ์ค€๋น„๋œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํ•œ ๊ฐœ์˜ ์ง‘ํ•ฉ์„ ์ง€์นญํ•ฉ๋‹ˆ๋‹ค.

- ์˜ˆ์‹œ

ํด๋ผ์ด์–ธํŠธ A,B,C๊ฐ€ ์„œ๋ฒ„์— ์ˆ˜์šฉ๋œ ์ƒํƒœ์—์„œ ๊ฐ๊ฐ RMI ๋˜๋Š” ์ด๋ฒคํŠธ๋กœ ์ธํ•˜์—ฌ Proud.CNetServer ๋‚ด์˜ queue์—์„œ ๋Œ€๊ธฐ ์ค‘์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

A1,A2,A3 -> ํด๋ผ์ด์–ธํŠธ A์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋˜๋Š” RMI B1,B2,B3 -> ํด๋ผ์ด์–ธํŠธ B์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ๋˜๋Š” RMI ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ๋Š” ์ด 2๊ฐœ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ๊ทœ์น™์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

  • A1,A2,A3๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • B1,B2,B3 ์™€ C1,C2,C3 ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋™์‹œ์— ์‹คํ–‰๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

  • A1,A2,A3 ์ค‘ ํ•˜๋‚˜์™€ B1,B2,B3 ์ค‘ ํ•˜๋‚˜, C1,C2,C3 ์ค‘ ํ•˜๋‚˜๋Š” ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์Šค๋ ˆ๋“œ ํ’€์˜ ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜๊ฐ€ 2๊ฐœ ๋ฟ์ด๋ฏ€๋กœ A,B,C ์ค‘ 2๊ฐœ๊ฐ€ ์„ ๋ณ„๋˜์–ด ์ฝœ๋ฐฑ๋˜์ง€๋งŒ, ์ฝœ๋ฐฑ ๋ฃจํ‹ด์ด ๋จผ์ € ์™„๋ฃŒ๋œ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ ๋ณ„๋˜์ง€ ๋ชปํ•œ ํด๋ผ์ด์–ธํŠธ์˜ RMI ํ˜น์€ ์ด๋ฒคํŠธ ์ฝœ๋ฐฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์Šค๋ ˆ๋“œ ํ’€ ์‹คํ–‰ ์˜ˆ์‹œ

๐Ÿ“š ์ถ”์ธก ํ•ญ๋ฒ•(dead reckoning)

ProudNet์—์„œ๋Š” ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ์˜ ๋งค๋ˆํ•œ ์œ„์น˜ ํ‘œํ˜„์„ ์œ„ํ•ด์„œ ์ถ”์ธก ํ•ญ๋ฒ•(dead reckoning)์œ„ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ถ”์ธก ํ•ญ๋ฒ•์€ ๋Œ€๋žต์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ A์—์„œ ์›€์ง์ด๋Š” ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜์™€ ์†๋„๋ฅผ ํ˜ธ์ŠคํŠธ B๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์ „์†ก ์ฃผ๊ธฐ๋Š” 1์ดˆ๋‹น 2~10ํšŒ์ž…๋‹ˆ๋‹ค.

  • ์ „์†ก ์ฃผ๊ธฐ๋Š” ๋™์ ์ธ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์บ๋ฆญํ„ฐ์˜ ๊ฐ€์†๋„๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋งŒ ์ „์†ก ์ฃผ๊ธฐ๋ฅผ ์งง๊ฒŒํ•˜๋ฉด ๋ณด๋‹ค ์ •ํ™•ํ•œ ์›€์ง์ž„์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์†๋„๊ฐ€ ํฐ ๊ฒฝ์šฐ๋ž€, ์บ๋ฆญํ„ฐ์˜ ์†๋„๊ฐ€ ๊ธ‰๊ฒฉํžˆ ๋ณ€ํ•  ๋•Œ๋‚˜ ์บ๋ฆญํ„ฐ๊ฐ€ ๋‹ค๋ฅธ ๋ฌผ์ฒด์— ๋ถ€๋”ชํžˆ๋ฉด์„œ ์ด๋™ ๋ฐฉํ–ฅ์ด ๊ธ‰๊ฒฉํžˆ ๋ณ€ํ•  ๋•Œ ๋“ฑ์ž…๋‹ˆ๋‹ค. (์•„๋ž˜ ํ‘œ ์ฐธ๊ณ )

  • ํ˜ธ์ŠคํŠธ B์—์„œ๋Š” ํ˜ธ์ŠคํŠธ A๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์ฐฉํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„(๋ ˆ์ดํ„ด์‹œ)์„ pinging์„ ํ†ตํ•ด ์–ป์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ B์—์„œ ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜,์†๋„ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณต์‹์œผ๋กœ ํ˜ธ์ŠคํŠธ A์˜ ์บ๋ฆญํ„ฐ์˜ ์‹ค์ œ ์œ„์น˜๋ฅผ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. P: ์˜ˆ์ธกํ•œ ์œ„์น˜, V: ๋ฐ›์€ ์†๋„, T: ๋ ˆ์ดํ„ด์‹œ, P0: ๋ฐ›์€ ์œ„์น˜ P = (V * T) + P0

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๋Š” ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ณ„์‚ฐ๋œ ์œ„์น˜ ๊ฐ’์„ ๋ Œ๋”ํ•˜๋ฉด ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๊ฐ€ ๋š๋š ๋Š๊ธฐ๋Š” ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Proud.CPositionFollower ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Proud.CPositionFollower๋Š” ์›€์ง์ด๋Š” ํƒ€๊ฒŸ์˜ ์œ„์น˜๊นŒ์ง€ ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ๋„์ฐฉํ•˜๋„๋ก ์ถ”์ ์ž(follower)๋ฅผ ์ด๋™์‹œํ‚ค๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์›€์ง์ด๋Š” ํƒ€๊ฒŸ ์œ„์น˜๋ฅผ ์ง์„ ์œผ๋กœ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด, ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๋“ค์˜ ์บ๋ฆญํ„ฐ ์œ„์น˜๊ฐ€ ํŠ€๋Š” ํ˜„์ƒ์ด ์ค„์–ด๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ถ”์ธก ํ•ญ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋‚˜๋จธ์ง€ ๋‹จ๊ณ„๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ B์—์„œ ์˜ˆ์ธก๋œ ์œ„์น˜์™€ ์†๋„ ๊ฐ’์„ Proud.CPositionFollower ๊ฐ์ฒด์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํƒ€๊ฒŸ์˜ ์œ„์น˜, ์†๋„๋กœ์„œ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ B์—์„œ๋Š” ํ˜ธ์ŠคํŠธ A์˜ ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ Œ๋”ํ•˜๊ธฐ ์œ„ํ•ด Proud.CPositionFollower ๊ฐ์ฒด์˜ ์ถ”์ ์ž ์œ„์น˜๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

- ์ถ”์ธก ํ•ญ๋ฒ• ์˜ˆ์‹œ

P(t=0,1,2)๋Š” ์˜ˆ์ธก๋œ ์ง€์ ์ด๊ณ  ๋ถ‰์€ ์„ ์€ Proud.CPositionFollower ์— ์˜ํ•ด ๋ณด์ •๋œ ์บ๋ฆญํ„ฐ ์œ„์น˜์ž…๋‹ˆ๋‹ค. ํ†ต์ƒ์ ์œผ๋กœ, ํ˜ธ์ŠคํŠธ A์—์„œ ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ์™€ Proud.CPositionFollower ์—์„œ ์ถ”์ ์ž๊ฐ€ ํƒ€๊ฒŸ์˜ ์œ„์น˜์— ๋„๋‹ฌํ•˜๋Š” ์‹œ๊ฐ„ ์ œํ•œ์„ ๋™์ผํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ ์บ๋ฆญํ„ฐ ์œ„์น˜๋ฅผ ๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ๋Š” ์ƒํ™ฉ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ถŒ์žฅ ์˜ˆ์‹œ

์ƒํ™ฉ๋ณด๋‚ด๋Š” ๋ฐ์ดํ„ฐ ์ข…๋ฅ˜ํ‰๊ท  ๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ€์†๋„ ์˜ˆ์‹œ

๋Œ€๊ทœ๋ชจ์ „ RPG ๊ฒŒ์ž„(MMORPG)์˜ ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ

์œ„์น˜(xyz),์†๋„(xyz),๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ(z)

0.3

์บ๋ฆญํ„ฐ์˜ ์ด๋™ ๋ฐฉํ–ฅ ์ „ํ™˜, ์Šคํƒ ์Šค, ๋„ํŠธ, ๋ฒ„ํ”„

๋น„ํ–‰๊ธฐ ๋˜๋Š” ์ฐจ๋Ÿ‰

์œ„์น˜(xyz),์†๋„(xyz),๊ฐ€์†๋„(xyz), ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ(xyz)

0.3

์žฅ์• ๋ฌผ ์ถฉ๋Œ, ๊ธ‰๊ฒฉํ•œ ์„ ํšŒ

1์ธ์นญ ์ŠˆํŒ… ๊ฒŒ์ž„(FPS)์˜ ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ

์œ„์น˜(xyz), ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ(xyz)

0.03

์บ๋ฆญํ„ฐ ์ด๋™ ๋ฐฉํ–ฅ์ด ๋ฐ”๋€Œ๋Š” ์งํ›„, ์ €๊ฒฉ์ด ๋ฐœ์‚ฌ ์ˆœ๊ฐ„

๋ณด๋‚ด๋Š” ์ฃผ๊ธฐ๊ฐ€ ์งง์€ ๊ฒฝ์šฐ์—๋Š” ์†ก์‹ ๋Ÿ‰์ด ์ง€๋‚˜์น˜๊ฒŒ ์ปค์งˆ ์œ„ํ—˜์ด ์žˆ์œผ๋‹ˆ ์†ก์‹ ๋Ÿ‰ ์ž๋™ ์กฐ์ ˆ ๊ธฐ๋Šฅ (Throttling) ๋„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

- ๊ณก์„ ํ˜• ์ถ”์ ์ž(Spline based follower)

Proud.CPositionFollower ๋Š” ์ง์„  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณก์„ ์œผ๋กœ ํƒ€๊ฒŸ์„ ์ซ“์•„๊ฐ€๋„๋ก ํ•˜๋Š” follower๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” 3์ฐจ ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ๊ณก์„ ํ˜• ์ถ”์ ์ž(spline based follower) ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ง์„ ํ˜• follower๋ณด๋‹ค ๋” ๋งค๋ˆํ•œ ํ˜•ํƒœ๋กœ ์ซ“์•„๊ฐ€๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ํ•ญ์ƒ ๋งค๋ˆํ•œ ๋ชจ์Šต์„ ๋‚˜ํƒ€๋‚ด์ง„ ์•Š์œผ๋ฏ€๋กœ ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์—์„œ ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด์„œ ์„ ํƒํ•˜์‹œ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ณก์„ ํ˜• ์ถ”์ ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์•„๋ž˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

  • Proud.CPositionFollower.GetSplineFollowerPosition

  • Proud.CPositionFollower.GetSplineFollowerVelocity

๊ฐ๋„์— ๋Œ€ํ•œ ๋ณด์ • ์ฒ˜๋ฆฌ๋Š” ์•„๋ž˜์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Proud.CPositionFollower: ์œ„์น˜์— ๋Œ€ํ•œ ๋ณด์ • ์—ญํ• 

  • Proud.CAngleFollower: ๊ฐ๋„์— ๋Œ€ํ•œ ๋ณด์ • ์—ญํ• 

๐Ÿ“š ํ™€ ํŽ€์นญ (Hole Punching)

๊ณต์œ ๊ธฐ๊ฐ€ ๋ผ์šฐํ„ฐ์˜ ํŠน์„ฑ๋„ ํ•จ๊ป˜ ๊ฐ€์ง€๊ณ  ์žˆ์–ด Routing Table ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ P2P ํ†ต์‹ ์„ ๋ชฉ์ ์œผ๋กœ, ์‚ฌ์ „์— ์ƒ๋Œ€๋ฐฉ๊ณผ ํŒจํ‚ท์„ ์ฃผ๊ณ ๋ฐ›์•„ ๊ฐ์ž์˜ ๊ณต์œ ๊ธฐ์— Routing Table์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ ๋ช…์นญ์€ STUN (Simple Traversal of User Datagram Protocol Through Network Address Translators) ์ž…๋‹ˆ๋‹ค.

ํ™€ ํŽ€์นญ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Full Cone NAT

  • Restricted Cone

  • Port Restricted Cone

  • Symmetric Cone

๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.