Skip to content
This repository was archived by the owner on Jun 14, 2022. It is now read-only.

Latest commit

ย 

History

History
97 lines (71 loc) ยท 6.75 KB

File metadata and controls

97 lines (71 loc) ยท 6.75 KB

ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ๋งŒ๋“ค๊ธฐ

ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋Š” ๋‘๊ฐ€์ง€ ์šฉ๋„๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ

์„œ๋ฒ„๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋„์šฐ๋ ค๋ฉด ๊ท€์ฐฎ๊ณ  ๋ฒˆ๊ฑฐ๋กœ์šฐ๋ฏ€๋กœ, ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ๋ฅผ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

์œ ๋‹› ํ…Œ์ŠคํŠธ์™€ ๋น„์Šทํ•œ ๋А๋‚Œ์œผ๋กœ, ์„œ๋ฒ„์˜ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์‘๋‹ต์„ ํ™•์ธํ•ด์„œ, ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์‘๋‹ต์ด ๋Œ์•„์™”๋‹ค๋ฉด ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์ฆ‰์‹œ ์ข…๋ฃŒํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์•„๋ž˜๋Š” ๋งˆ๋น„๋…ธ๊ธฐ ๋“€์–ผ์—์„œ ๊ฐ€์ ธ์˜จ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ, ์ „์ฒด 3000๋ผ์ธ์ฏค ๋˜๋Š” ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. SetNameFirstTime์ด๋ผ๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฑธ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sample_test_case_from_mabinogi_duel.png

์ด ์˜ˆ์ œ๋Š” ๋ฃจ์•„๋กœ ๋˜์–ด์žˆ์ง€๋งŒ, ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ผญ ๋ฃจ์•„๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ์™€ ๊ฐ™์€ ์–ธ์–ด๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์—ฌ๋Ÿฌ ๋ชจ๋กœ ํŽธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ์ :

  • TOY ๋กœ๊ทธ์ธ ๋“ฑ ์ •๋ง ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ์™ธํ•˜๋ฉด, ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ชจ๋“  ์„œ๋ฒ„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ตœ์†Œ ํ•œ ๋ฒˆ ์ด์ƒ์€ ํ˜ธ์ถœํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•ด๋„ ์„œ๋กœ ๊ฐ„์„ญํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“œ์„ธ์š”. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ์ž‘์—…์„ ํ•  ๋•Œ ํฌ๊ฒŒ ์žฌ์ž‘์—…ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ๊ณ„์ •์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ๊ณ„์ • ์•ˆ์—์„œ๋งŒ ์ž‘์—…ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ

๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค๊ฐ€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ์— ์“ฐ๋ฉด ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ์žฅ๋น„ ํ•œ ๋Œ€์—์„œ ์ถฉ๋ถ„ํžˆ ๋งŽ์€ ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์•ฝ๊ฐ„ ๊ณ ์ณ์„œ ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜์—์„œ ๋งค์šฐ ๋งŽ์€ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋™์‹œ์— ๋Œ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

์‹ค๋ฒ„๋ฐ”์ธ ์„œ๋ฒ„ ์—”์ง„ 2๋ฅผ ์‚ฌ์šฉํ•ด์„œ C#์œผ๋กœ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์—…ํ•˜์‹œ๊ธธ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋Š” ์Šค๋ ˆ๋“œ๋ฅผ CPU ๊ฐœ์ˆ˜ * 5 ์ •๋„ ์Šคํฐํ•ฉ๋‹ˆ๋‹ค(์Šค๋ ˆ๋“œ๋ผ๋ฆฌ๋Š” ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค):

  1. ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ€์ง„ ์ปค๋„ฅ์…˜ ํ์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋Œ๋ฆฐ ์ง€ ๊ฐ€์žฅ ์‹œ๊ฐ„์ด ๋งŽ์ด ํ๋ฅธ ์ปค๋„ฅ์…˜์„ ๊บผ๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ C๋ผ๊ณ  ํ•ฉ์‹œ๋‹ค.
  2. C๊ฐ€ ์ƒ์„ฑ๋œ ์ง€ $(SessionDuration)์ดˆ ์ง€๋‚ฌ์œผ๋ฉด ์ปค๋„ฅ์…˜์„ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
  3. C๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋Œ๋ฆฐ ์ง€ $(TestExecutionInterval)์ดˆ ์ง€๋‚˜์ง€ ์•Š์•˜์œผ๋ฉด C๋ฅผ ๋‹ค์‹œ ํ’€๋กœ ๋˜๋Œ๋ ค๋ณด๋‚ด๊ณ , ์ƒˆ ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์ œ๋ถ€ํ„ฐ ์ด๊ฒƒ์„ C๋ผ๊ณ  ๋ถ€๋ฆ…์‹œ๋‹ค.
  4. C๋ฅผ ๊ฐ€์ง€๊ณ  ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ 1ํšŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. C๋ฅผ ํ’€์— ๋˜๋Œ๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค.
  6. ํ’€์— ์žˆ๋Š” ๋ชจ๋“  ์ปค๋„ฅ์…˜๋“ค์— ๋Œ€ํ•ด PerformIO()๋ฅผ 1ํšŒ์”ฉ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

$(SessionDuration)๊ณผ $(TestExecutionInterval)์€ ์ŠคํŠœ๋””์˜ค๋‚˜ ํšŒ์‚ฌ ์ž„์ง์›์„ ๋Œ€์ƒ์œผ๋กœ ์‹ค์‹œํ•˜๋Š” ์†Œ๊ทœ๋ชจ ํ…Œ์ŠคํŠธ์˜ ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•ด์„œ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • $(SessionDuration): ์„ธ์…˜์ด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๋’ค ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฐ ํ‰๊ท  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์•„๋ฌด ๋Œ€ํ‘œ๊ฐ’์ด๋‚˜ ๊ดœ์ฐฎ์Œ. ์ค‘๊ฐ„๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ๊ฒƒ๋„ ๊ดœ์ฐฎ์Œ).
    โ€ป ์˜๋„๋Š” ๊ฐ ์ปค๋„ฅ์…˜์ด ์ ์–ด๋„ $(SessionDuration)๋งŒํผ ์„ธ์…˜์„ ๋ถ™์žก๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

  • $(TestExecutionInterval): ํ•œ ์„ธ์…˜์ด ๋ณด๋‚ด๋Š” ์š”์ฒญ ์‚ฌ์ด์˜ ํ‰๊ท  ๊ฐ„๊ฒฉ์ด T์ดˆ์ด๊ณ , ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ํ•œ ๋ฒˆ์— ์š”์ฒญ์„ N๊ฐœ ๋ณด๋‚ผ ๋•Œ, $(TestExecutionInterval) ์€ T * N ์œผ๋กœ ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์—”์ง„์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ๋งŒ๋“ค๊ธฐ

Connection.NET์„ ์‚ฌ์šฉํ•ด์„œ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๊ถŒ์žฅํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. Connection.NET(ํด๋ผ์ด์–ธํŠธ์šฉ C# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)์€ ๊ฒŒ์ž„ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ์— ํŽธ๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์ž˜ ์–ด์šธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งค ํ”„๋ ˆ์ž„ PerformIO๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๊ณ , ๋ฐ›์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋งฅ๋ฝ ์—†์ด ์ฝœ๋ฐฑ์œผ๋กœ๋งŒ ๋„์ฐฉํ•˜๋Š” ์ , ๊ทธ๋ฆฌ๊ณ  ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋Œ๋ฆฌ๊ธฐ์— CPU ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋„ˆ๋ฌด ํฐ ๋ฌธ์ œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ํŽธ๋ฆฌํ•˜๋„๋ก Connection.NET์„ ๊ฐ์‹ผ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. EngineAPI.TestClient๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. EngineAPI.Networking.Listen ๊ณผ EngineAPI.Loop ์‚ฌ์ด์— ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ ํŒŒ์ด๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ์„ธ์š”.

๋‹ค์Œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

var arg = new ConnectionArgument();
arg.ServerEndpoint = "127.0.0.1:37773";
arg.GameName = "__SSE2_INTERNAL_NetworkingTest";
arg.CommunicationTimeoutMS = 1000;
arg.LoginParameters["TestCase"] = "LoginMePlease";

using (var con = await EngineAPI.TestClient.Connect(arg))
{
    con.Send(Encoding.UTF8.GetBytes("๋ฉ”์‹œ์ง€1"));
    con.Send(Encoding.UTF8.GetBytes("๋ฉ”์‹œ์ง€2"));

    byte[] rcvd;
    rcvd = await con.Receive(TimeSpan.FromSeconds(1));
    Assert.Equal(Encoding.UTF8.GetString(rcvd), "๋ฉ”์‹œ์ง€1");
    rcvd = await con.Receive(TimeSpan.FromSeconds(1));
    Assert.Equal(Encoding.UTF8.GetString(rcvd), "๋ฉ”์‹œ์ง€2");

    await AsyncAssert.MustThrow<TimeoutException>(async () =>
    {
        await con.Receive(TimeSpan.FromSeconds(0.1));
    });
}

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์„ ๋•Œ UTF-8 ์ธ์ฝ”๋”ฉ/๋””์ฝ”๋”ฉ์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ…Œ์ŠคํŠธ ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์„ ์“ฐ๋„๋ก Send์™€ Receive๋ฅผ ์ ์ ˆํžˆ ๊ฐ์‹ธ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

Send(new SomeRequest(...));
var received = await Receive<SomeResponse>();

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

var resp = await Call(new SomeCall(...));