- TEST
: Test์ ํ์์ฑ
1) ๋ฒ๊ทธ ์๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค๊ธฐ ์ํด
2) MMORPG ๊ฒ์ ๊ณ ์ ์ Test → ๋ถํ ํ ์คํธ(Stress Test), ์ฑ๋ฅ ์ธก์ (๋์ )
: Test์ ๋จ๊ณ
1) ์์ฑ์ ํ ์คํธ / QA ํ ์คํธ
2) ์ํ ํ ์คํธ (๋น ๊ด๊ณ์๋ฅผ ๋์, ๊ฐ์ ํ์ฌ, ๊ฐ๋ฐ์์ ๊ฐ์กฑ/์น๊ตฌ)
3) ํด๋ก์ฆ๋ ๋ฒ ํ ํ ์คํธ (๋ถํน์ ๋ค์ ๋์, ์ค์ ๋ถํ ํ ์คํธ์ ์์)
4) ์คํ ๋ฒ ํ ํ ์คํธ (๋ชจ๋ ์ฌ๋ ์๋๋ก ํ ์คํธ)
: Stree Test
- ๋ง์ ์ธ์์ด ๋์์ ์ ์ํด ํ ์คํธ ์งํ, ์ ์ ์ธ์์ด์์ ๋ ๋ณด์ด์ง ์์ ๋ฒ๊ทธ๋ค์ ๋ฐ๊ฒฌ ๊ฐ๋ฅ (๋ฉํฐ์ฐ๋ ๋!)
- ์๋ฒ ํ๋ก๊ทธ๋จ์ bottle-neck์ ๋ฐ๊ฒฌ ๊ฐ๋ฅ (DB, Network Overhead, Memory allocation Overhead, NPC AI Overhead)
- ๋ฌธ์ ) ๋ง์ ์ธ์์ ๋์ ์ฝ์ง ์์, ์ํ๋ ์๊ฐ ํ ์คํธ ํ๋ฆ, ํต์ ํ๋ฆ
→ ๋ฐ๋ผ์ ์๋ ํ ์คํธ ํ๋ก๊ทธ๋จ
- Dummy Client๋ผ๊ณ ๋ ๋ถ๋ฆผ, No visual (๋ถํ ๊ฐ์)
- ํ๋์ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ๊ฐ ์บ๋ฆญํฐ๋ก ๋์ ์ ์ (ํ ์คํธ ๋น์ฉ ๊ฐ์, ID ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ธฐ)
- ์๋ฐํ ํ๋ ๋ชจ๋ฐฉ ํ๋ก๊ทธ๋จ์ ์ด์ฉ (์ด๋, ์ ํฌ)
- ํ๊ณ ) AI์ ํ๊ณ - ๋ณต์กํ ์์ ์ํ ํ๋ฆ, ์ค์ ์ธ๊ฐ์ ํ๋๊ณผ๋ ์ฐจ์ด ์กด์ฌ
- ๊ตฌ์กฐ ) IOCP, Test_Thread์์ ํ๋ ์ด์ด ์ปจํธ๋กค (๋จ์ ๋๋ค ์ด๋, MAX_TEXT์ ๋ง์ถฐ ์ ์ ์ถ๊ฐ)
: ์๋ฒ ์ฑ๋ฅ์ ํ์ธ
- ๋ถํ๋ฅผ ์ฃผ๊ณ ์๋ฒ๊ฐ ๊ฒฌ๋๋์ง, ๋์ด ์๋์ง ํ์ธ
- ๋ถํ : ๋์ / HoySpot
- ๋ ์ธก์ = ํด๋ผ์์ ๋ณด๋ธ ์ ํธ๊ฐ ์๋ฒ์ ๊ฐ๋ค๊ฐ ๋๋์ ์ฌ ๋๊น์ง์ ์๊ฐ ์ธก์
struct sc_packet_move {
char size;
char type;
int id;
short x, y;
unsigned move_time; // millisecond ๊ฐ
};
struct cs_packet_move {
char size;
char type;
char direction;
unsigned move_time;
};
- ๊ฐ์ฅ ๋ง์ ๋ฐฉ๋ฒ → Move Packet์ ์ ์ก ์๊ฐ์ ์ถ๊ฐํด์ ์ธก์
: ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ํฐ ์์ธ → Move ํจ์ (WSASend)
: ํด๊ฒฐ๋ฐฉ์ → ์์ผ์ฒ๋ฆฌ
- ์์ผ์ฒ๋ฆฌ
: Standalone ๊ฒ์๊ณผ๋ ๋ค๋ฅด๊ฒ ๋์ ์ด ์ค์ํ๋ฉฐ, ๊ฐ๊ฐ์ ํ๋ ์ด์ด ํ๋์ด ๋ค๋ฅธ ํ๋ ์ด์ด์๊ฒ ์ ๋ฌ๋์ด์ผ ํจ (BroadCasting)
: ํด๋ผ์ด์ธํธ์์ ๊ฒ์ ์๋์ ์ํฉ์ ๋ณด๋ ค๋ฉด ๋ค๋ฅธ Object๋ค์ ์ํ๋ ๋ณผ ์ ์์ด์ผ ํจ
: ํ๋์ Object์ ์ํ๊ฐ ๋ณ๊ฒฝ → ์๋ฒ์ ์กด์ฌํ๋ ๋ชจ๋ ํ๋ ์ด์ด์๊ฒ ๋ณ๊ฒฝ ๋ด์ฉ ์ ์ก ํ์ (๋น์ฉ!!)
: Broadcasting ์ต์ ํ
→ WSASend์ ํ์ ๊ฐ์ → ๋๋ฅผ ๋ณด๊ณ ์๋ ํ๋ ์ด์ด์๊ฒ๋ง ์๋ฆฌ๋ฉด ๋จ (์์ผ)
→ ๊ทธ๋์ ๊ฒ์์ ์ด๋ป๊ฒ ํด?
: ํจ์จ์ ์ธ ๊ฒ์ (์ต์ ํ) - ์ฉ์ด๋ ๊ฒ์๋ง๋ค ๋ค๋ฆ
1) Zone
- ํจ์จ์ ์ธ ๊ฒ์์ ๊ธฐ๋ณธ
- ์ ์ฒด ์๋๋ฅผ ํฐ ๋ ผ๋ฆฌ์ ๋จ์๋ก ์ชผ๊ฐฌ
- ๋๋ฅ,์๋, ์ธ๋ (์๋ก ๋ณผ์ผ ์์)
2) Sector
- Zone๋ณด๋ค ์์ ๊ฐ๋
- ์๋ฒ ๋ด๋ถ์์ ๊ฒ์ ํจ์จ์ฑ์ ์ํด ๋์
- ์์ ๊ณผ ์ธ์ ํ Sector๋ง ๊ฒ์ (ํฌ๊ธฐ๋ ์ ์ ํด์ผ ํจ)
- ์นํฐ๋ง๋ค ์นํฐ์ ์กด์ฌํ๋ ์ต์ ๋ชฉ๋ก์ ๊ด๋ฆฌํ๋ ์๋ฃ๊ตฌ์กฐ ํ์
- ๋ชจ๋ ์ต์ ์ ์ด๋/์์ฑ/์๋ฉธ ์ ์์ ์ด ์ํ ์นํฐ์ ์ต์ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธ
: ์์ผ ์ฒ๋ฆฌ – ์์ผ ๋ฐ์ object์ ๋ํ ์ ๋ณด๋ ํด๋ผ์ด์ธํธ์ ์ ์ก๋์ง ์์
- ์ข๋น : ์์ผ์์ ์ฌ๋ผ์ก๋๋ฐ ํด๋ผ์ด์ธํธ์ ๊ณ์ ์กด์ฌ
– ์ ๋ น : ๋น์ฃผ์ผ ์ ๋ณด๋ฅผ ๋ฐ์ง ์์ ๊ฐ์ฒด๊ฐ ์ด๋, ๋ณด์ด์ง ์๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ค๊ณผ ์ํธ์์ฉ
→ ํด๋ผ์ด์ธํธ์ ํ์๋๋ ๊ฐ์ฒด๋ค์ ๋ฆฌ์คํธ๋ฅผ ์๋ฒ์ ์ ์ฅ
→ ์ด๋ ์ ์ด ๋ฆฌ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ผ ์ฒ๋ฆฌ
– ์ ๋ น ๋ฐฐ์ : ๋ฆฌ์คํธ์ ์์ผ๋ฉด ๋ฌด์กฐ๊ฑด ๋น์ฃผ์ผ ์ ๋ณด ์ ์ก
– ์ข๋น ์ต์ํ : ๋ ๋ฒ์งธ ์ด๋์์๋ ๋ฌด์กฐ๊ฑด ์ญ์ , ์ผ์ ์์ผ ๋ด์์๋ ์ข๋น๊ฐ ์ ๋ ์กด์ฌํ์ง ์์.
- ์์ผ๋ฆฌ์คํธ
: ํด๋ผ์ด์ธํธ์์ ๋ณด์ฌ์ฃผ๊ณ ์๋ ๊ฐ์ฒด์ ๋ฆฌ์คํธ
: ์ด๋ ์ ์ ๋ฐ์ดํธ ํ์
: ViewList์ Copy (์ต์ ํ)
- ๋ทฐ๋ฆฌ์คํธ์ ์
๋ฐ์ดํธ๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณต์ฌํ์ฌ ์ฌ์ฉํ ํ ์ ๋ทฐ๋ฆฌ์คํธ๋ก ๊ต์ฒด
- lock์ด ๊ฑธ๋ ค ์๋ ์๊ฐ์ ์ต์ํ ํ์ฌ lock์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ ์ต์ํ
( ์ฃผ์ - Dead Lock : ๋์ ๋ทฐ๋ฆฌ์คํธ์ ์๋์ ๋ทฐ๋ฆฌ์คํธ๋ฅผ ๋์์ Lockingํ ๋ )
constexpr int VIEW_RANGE = 5; // ํด๋ผ์ด์ธํธ ์์ผ๋ณด๋ค ์ฝ๊ฐ ์๊ฒ (ํ์ธ์ฉ)
class SESSION {
OVER_EXP _recv_over;
public:
mutex _s_lock;
S_STATE _state;
int _id;
SOCKET _socket;
short x, y;
char _name[NAME_SIZE];
unordered_set<int> viewlist;
mutex _vl_list;
int _prev_remain;
int _last_move_time;
// ....
};
bool can_see(int a, int b)
{
int dist = (clients[a].x - clients[b].x) * (clients[a].x - clients[b].x) +
(clients[a].y - clients[b].y) * (clients[a].y - clients[b].y);
return dist <= VIEW_RANGE * VIEW_RANGE;
}
// Process_packet ํจ์
// case CS_MOVE
clients[c_id]._vl_list.lock();
unordered_set<int> old_viewlist = clients[c_id].viewlist;
clients[c_id]._vl_list.unlock();
unordered_set<int> new_viewlist;
for (auto& pl : clients) {
if (pl._state != ST_INGAME) continue;
if (false == can_see(c_id, pl._id)) continue;
if (pl._id == c_id) continue;
new_viewlist.insert(pl._id);
}
clients[c_id].send_move_packet(c_id);
for (int p_id : new_viewlist) {
if (0 == old_viewlist.count(p_id)) { // ์๋ก ๋ค์ด์ด
clients[c_id].send_add_player_packet(p_id);
clients[p_id].send_add_player_packet(c_id);
}
else {
clients[p_id].send_move_packet(c_id);
}
}
for (int p_id : old_viewlist) {
if (0 == new_viewlist.count(p_id)) {
clients[c_id].send_remove_player_packet(p_id);
clients[p_id].send_remove_player_packet(c_id);
}
}
'๐ค Study > Game Server' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[06์ฃผ์ฐจ] ๋ฉํฐ์ฐ๋ ๋ 01 (0) | 2024.04.22 |
---|---|
[05์ฃผ์ฐจ] IOCP (0) | 2024.04.22 |
[04์ฃผ์ฐจ] I/O ๋ชจ๋ธ (0) | 2024.04.22 |
[02์ฃผ์ฐจ] ํ๊ฒฝ (1) | 2024.04.19 |
[03์ฃผ์ฐจ] ๋คํธ์ํน - 1 (1) | 2024.04.01 |