๐ 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๋ฅผ ์ฌ์ฉํ์ง ์์์ ๋
// 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๋ฅผ ํธ์ถํฉ๋๋ค.

ํธ์คํธ 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)๋ ๋ ์ด์์ ์ ๋ ฅ ๋๋ ์กฐ์์ด ๋์์ ์ด๋ฃจ์ด์ง๋ ์ํ๋ฅผ ์ผ์ปซ์ต๋๋ค. ์ด๋ฐ ์ํ์์๋ ์ ์์ ์ธ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๊ฒ ๋ ์ํ์ด ์๋๋ฐ ์ด๋ฅผ ๊ฒฝ์ ์ํ์ด๋ผ๊ณ ํฉ๋๋ค.
์ ์ฐํ์์ ๊ฒฝ์ ์ํ๋ ๊ณต์ ์์์ ๋ํด ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผ์ ์๋ํ๋ ์ํ๋ฅผ ์๋ฏธํ๋ฉฐ, ๋์ ์ ๊ทผํ ๋ ์๋ฃ์ ์ผ๊ด์ฑ์ ํด์น๋ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ํ๋ก์ธ์ค ํ๋ ฅ ๊ธฐ๋ฒ์ด ํ์ํฉ๋๋ค.
์ฐธ๊ณ
๐ ๋ฐ์ดํฐ ์์ํ
๋ถ๋ ์์์ ๋จ์์ ํฐ ๊ฐ์ ๋คํธ์ํฌ๋ก ์ฃผ๊ณ ๋ฐ์ ๋, ํจํท์ ์์ ์ค์ด๋ ํธ๋ฆญ์ด ๊ฐ๋ฅํ ์ํฉ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์บ๋ฆญํฐ ์์น 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