League Of Legends - Link Select [07์ฃผ์ฐจ] TEST & ์‹œ์•ผ์ฒ˜๋ฆฌ
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/Game Server

[07์ฃผ์ฐจ] TEST & ์‹œ์•ผ์ฒ˜๋ฆฌ

by GAMEMING 2024. 4. 23.
728x90

 

 

- 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);
			}
		}