[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 6μž₯ κ²Œμž„ λ„€νŠΈμ›Œν¬ 엔진 ν”„λΌμš°λ“œλ„·
Β·
πŸ“ Book/✏ Game Server
6μž₯ κ²Œμž„ λ„€νŠΈμ›Œν¬ 엔진 ν”„λΌμš°λ“œλ„· 1. κ²Œμž„ μ„œλ²„, λ„€νŠΈμ›Œν¬ 엔진 κ²Œμž„ μ„œλ²„μ™€ λ©€ν‹°ν”Œλ ˆμ΄μ–΄ 처리λ₯Ό κ°œλ°œν•  λ•Œ λ„€νŠΈμ›Œν‚Ή 처리λ₯Ό μœ„ν•΄ 보톡 μ†ŒμΌ“ APIλ₯Ό μ΄μš©ν•œλ‹€. κ·ΈλŸ¬λ‚˜ μ†ŒμΌ“ API만 μ΄μš©ν•˜λ©΄ λ‹€μŒκ³Ό 같은 λ²ˆκ±°λ‘œμ›€μ΄ λ°œμƒν•  수 μžˆλ‹€. μš΄μ˜μ²΄μ œλ§ˆλ‹€ μ†ŒμΌ“ APIλ₯Ό μ‚¬μš©ν•˜λŠ” 방식에 차이가 μžˆλ‹€. μ†ŒμΌ“ APIμ—μ„œ μ œκ³΅ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯은 직접 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. κ·Έλž˜μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ λ„€νŠΈμ›Œν¬ 엔진을 μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€. 2. 개발 ν™˜κ²½κ³Ό κΈ°λ³Έ λͺ¨λ“ˆ λ„€νŠΈμ›Œν¬ 엔진 쀑 ν•˜λ‚˜μΈ ν”„λΌμš°λ“œλ„·μ€... μƒμ—…μš© μ†Œν”„νŠΈμ›¨μ–΄λ‘œ κ°œμΈμ΄λ‚˜ νŠΉμ • 쑰건의 인디 κ°œλ°œμ‚¬μ—μ„œλŠ” 무료둜 μ‚¬μš©ν•  수 μžˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ κ°„ λ„€νŠΈμ›Œν‚Ήκ³Ό ν΄λΌμ΄μ–ΈνŠΈ κ°„ 직접 λ„€νŠΈμ›Œν‚Ήμ„ λ‹¨μˆœν•˜κ²Œ μ‚¬μš©ν•  수 있게 ν•˜λ©° λ„€νŠΈμ›Œν¬ μ•”ν˜Έν™”, μ•”μΆ•, 흐름 μ œμ–΄ λ“± κΈ°λŠ₯을..
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 5μž₯ κ²Œμž„ λ„€νŠΈμ›Œν‚Ή
Β·
πŸ“ Book/✏ Game Server
5μž₯ κ²Œμž„ λ„€νŠΈμ›Œν‚Ή 1. UML UML은 λ‹¨μˆœνžˆ ν”Œλ‘œμ°¨νŠΈ κ·Έ μ΄μƒμ˜ 역할을 ν•œλ‹€. 데이터 μ •μ˜μ™€ ν”„λ‘œμ„ΈμŠ€ μ •μ˜κ°€ νŽΈν•΄μ§€κ³  ν”„λ‘œκ·Έλž¨ ꡬ쑰 λͺ…μ„Έλ₯Ό ν‘œν˜„ν•˜λŠ” λŒ€ν‘œμ  μˆ˜λ‹¨μ΄λ‹€. 1) UML μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨ UML μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ 객체와 λ©”μ‹œμ§€λ₯Ό μ‚¬μš©ν•˜κ³  객체 κ°„ λ©”μ‹œμ§• 흐름을 일λͺ©μš”μ—°ν•˜κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€. κ°μ²΄λŠ” μƒν˜Έ μž‘μš©μ˜ 주체(ν΄λΌμ΄μ–ΈνŠΈ, μ„œλ²„)둜 λ„€λͺ¨ μƒμžμ— ν•΄λ‹Ήλœλ‹€. λ©”μ‹œμ§€λŠ” μƒν˜Έ μž‘μš©μ˜ λ‚΄μš©μœΌλ‘œ κ°€λ‘œ ν™”μ‚΄ν‘œμ— ν•΄λ‹Ήλœλ‹€. 2) μ•‘ν‹°λΉ„ν‹° λ‹€μ΄μ–΄κ·Έλž¨ μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ€ 주고받은 λ©”μ‹œμ§€λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ μžμ„Έν•˜κ²Œ ν‘œν˜„ν•˜κΈ°μ—” ν•œκ³„κ°€ μžˆλ‹€. κ·Έλž˜μ„œ μ‹œν€€μŠ€ λ‹€μ΄μ–΄κ·Έλž¨μ— ν”Œλ‘œμ°¨νŠΈλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•œλ‹€λ©΄, 보닀 μžμ„Έν•˜κ²Œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 방식을 그림으둜 λ¬˜μ‚¬ν•  수 있게 λœλ‹€. 이것이 μ•‘ν‹°λΉ„ν‹° λ‹€μ΄μ–΄κ·Έλž¨μ΄λ‹€. μ‹€λŸ°λ” 도..
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 4μž₯ κ²Œμž„ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ
Β·
πŸ“ Book/✏ Game Server
4μž₯ κ²Œμž„ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ²Œμž„ μ„œλ²„κ°€ ν•˜λŠ” 역할을 μ΄ν•΄ν•˜λ €λ©΄ κ²Œμž„ μ„œλ²„κ°€ μ–΄λ–»κ²Œ λ°œμ „ν•΄ μ™”λŠ”μ§€ μ•Œμ•„λ³΄λ©΄ λœλ‹€. 1. νŒ¨ν‚€μ§€ κ²Œμž„μ—μ„œ κ²Œμž„ μ„œλ²„ 1995λ…„ λ‹Ήμ‹œ λŒ€λΆ€λΆ„μ˜ κ²Œμž„μ€ 인터넷이 μ•„λ‹Œ κ°€κ²Œμ—μ„œ ꡬ맀해야 ν•˜λŠ” νŒ¨ν‚€μ§€ κ²Œμž„μ΄μ—ˆλ‹€. νŒ¨ν‚€μ§€ κ²Œμž„μ€ μ»΄ν“¨ν„°μ˜ λ””μŠ€ν¬ λ“œλΌμ΄λΈŒλ‚˜ CD-ROM λ“œλΌμ΄λΈŒμ— 넣은 ν›„ λ°”λ‘œ μ‹€ν–‰ν•˜κ±°λ‚˜ ν•˜λ“œ λ””μŠ€ν¬μ— μ„€μΉ˜ ν›„ μ‹€ν–‰ν•˜λŠ” 방식이닀. μ΄λ•Œμ˜ νŒ¨ν‚€μ§€ κ²Œμž„μ€ 컴퓨터 λ„€νŠΈμ›Œν¬λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€. κ·ΈλŸ¬λ‚˜ 인터넷이 λ³΄κΈ‰λ˜κΈ° μ‹œμž‘ν•˜λ©΄μ„œ ν”Œλ ˆμ΄μ–΄κ°€ μ„Έ λͺ… 이상 인터넷을 톡해 ν”Œλ ˆμ΄ν•˜λŠ” λ°©μ‹μ˜ νŒ¨ν‚€μ§€ κ²Œμž„μ΄ λ“±μž₯ν•˜κΈ° μ‹œμž‘ν–ˆλ‹€. κ²Œμž„μ„ ν•˜λ €λ©΄ ν”Œλ ˆμ΄μ–΄λ“€μ˜ κ²Œμž„ ν”Œλ ˆμ΄ μƒνƒœ(μ„Έμ…˜)λ₯Ό μ €μž₯ν•΄μ•Ό ν–ˆκ³  이λ₯Ό μœ„ν•΄ ν”Œλ ˆμ΄μ–΄ 쀑 ν•œ λͺ…μ˜ 컴퓨터가 μ„œλ²„κ°€ λ˜μ–΄ λͺ¨λ“  ν”Œλ ˆμ΄μ–΄μ˜ κ²Œμž„ ν”Œλ ˆμ΄ μƒνƒœλ₯Ό μ·¨ν•©..
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° (2)
Β·
πŸ“ Book/✏ Game Server
3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° 6. 논블둝 μ†ŒμΌ“ μΌλŒ€μΌ λ„€νŠΈμ›Œν‚Ή ν”„λ‘œκ·Έλž¨μ„ κ°œλ°œν•  λ•ŒλŠ” λΈ”λ‘œν‚Ή μ†ŒμΌ“μ„ μ‚¬μš©ν•΄λ„ λ¬΄λ°©ν•˜λ‹€. ν•˜μ§€λ§Œ λ„€νŠΈμ›Œν‚Ήμ„ ν•΄μ•Ό ν•˜λŠ” λŒ€μƒμ΄ μ—¬λŸΏμ΄λΌλ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ? λ‹€ν–‰νžˆ λŒ€λΆ€λΆ„ μš΄μ˜μ²΄μ œμ—μ„œλŠ” μ†ŒμΌ“ ν•¨μˆ˜κ°€ λΈ”λ‘œν‚Ήλ˜μ§€ μ•Šκ²Œ ν•˜λŠ” APIλ₯Ό μΆ”κ°€λ‘œ μ œκ³΅ν•œλ‹€. 이λ₯Ό 논블둝 μ†ŒμΌ“μ΄λΌ ν•œλ‹€. 논블둝 μ†ŒμΌ“μ„ μ‚¬μš©ν•˜λŠ” 방법은 μ•„λž˜μ™€ κ°™λ‹€. void NonBlockSocketOperation() { s = socket(TCP); ...; s.connect(...); // 논블둝 μ†ŒμΌ“μœΌλ‘œ λ³€κ²½ s.SetNonBlocking(true); while (true) { r = s.send(dest, data); if (r == EWOULDBLOCK) { // λΈ”λ‘œν‚Ή 걸릴 μƒν™©μ΄μ—ˆλ‹€. 솑신을 μ•ˆ ν–ˆλ‹€. continu..
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° (1)
Β·
πŸ“ Book/✏ Game Server
3μž₯ μ†ŒμΌ“ ν”„λ‘œκ·Έλž˜λ° μ†ŒμΌ“μ€ 기본적으둜 파일 ν•Έλ“€κ³Ό λΉ„μŠ·ν•˜λ‹€. λ””μŠ€ν¬μ— κΈ°λ‘ν•˜κ±°λ‚˜ 읽어 듀일 λ•Œ 파일 핸듀을 μ‚¬μš©ν•˜λŠ” κ²ƒμ²˜λŸΌ λ„€νŠΈμ›Œν¬λ‘œ 데이터λ₯Ό μ „μ†‘ν•˜κ±°λ‚˜ 받을 λ•Œ μ†ŒμΌ“ 핸듀을 μ‚¬μš©ν•œλ‹€. 온라인 κ²Œμž„ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ†ŒμΌ“μ€ 파일 ν•Έλ“€ λ°©μ‹κ³ΌλŠ” μ•½κ°„ λ‹€λ₯΄λ‹€. TCP둜 ν†΅μ‹ ν•˜λŠ” 경우 ν΄λΌμ΄μ–ΈνŠΈ 개수만큼 μ†ŒμΌ“μ΄ μžˆμ–΄μ•Ό ν•˜λ―€λ‘œ κ²Œμž„ μ„œλ²„μ—μ„œ 닀루어야 ν•˜λŠ” μ†ŒμΌ“ κ°œμˆ˜κ°€ λ§Žλ‹€. 파일 핸듀을 ν•˜λŠ” λ™μ•ˆ μŠ€λ ˆλ“œκ°€ λŒ€κΈ°ν•˜λŠ” 일이 μ—†μ–΄μ•Ό ν•œλ‹€. μ΄λŸ¬ν•œ νŠΉμ§•μœΌλ‘œ λ„€νŠΈμ›Œν¬ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ†ŒμΌ“μ€ 보톡 비동기 μž…μΆœλ ₯ μƒνƒœλ‘œ 닀룬닀. 비동기 μž…μΆœλ ₯ λ°©μ‹μ—λŠ” 크게 λ…ΌλΈ”λ‘œν‚Ή μ†ŒμΌ“ 방식과 Overlapped I/O 방식이 μžˆλ‹€. 그리고 이 방식을 μ§„λ³΄μ‹œν‚¨ epollκ³Ό IOCP(I/O Completion Port) 방식이 많이 ν™œμš©λœλ‹€. ..
[Book] κ²Œμž„ μ„œλ²„ ν”„λ‘œκ·Έλž˜λ° κ΅κ³Όμ„œ - 2μž₯ 컴퓨터 λ„€νŠΈμ›Œν¬ (2)
Β·
πŸ“ Book/✏ Game Server
2μž₯ 컴퓨터 λ„€νŠΈμ›Œν¬ 6. 컴퓨터 λ„€νŠΈμ›Œν¬μ—μ„œ 데이터 보내기와 λ°›κΈ° UDP λ„€νŠΈμ›Œν‚Ή UDPλŠ” μ‚¬μš©μžκ°€ μ •μ˜ν•œ λ°μ΄ν„°κ·Έλž¨μ„ μƒλŒ€λ°©μ—κ²Œ 보낼 수 있게 ν•˜λŠ” 톡신 κ·œμ•½(ν”„λ‘œν† μ½œ)이닀. μ΄λ•Œ λ°μ΄ν„°κ·Έλž¨μ€ 64ν‚¬λ‘œλ°”μ΄νŠΈ μ΄ν•˜μ˜ 이진 λ°μ΄ν„°λ‘œ λ©”μ‹œμ§€ μ„±μ§ˆμ„ 가진닀. 즉, 데이터 일뢀가 λ­‰μΉ˜κ±°λ‚˜ μͺΌκ°œμ§€μ§€ μ•ŠλŠ”λ‹€. 데이터λ₯Ό μ£Όκ³ λ°›μœΌλ €λ©΄ μ†ŒμΌ“μ„ 생성해야 ν•œλ‹€. μ†ŒμΌ“μ€ 단말기 사이에 톡신할 수 있게 μš΄μ˜μ²΄μ œμ—μ„œ μ œκ³΅ν•˜λŠ” μžμ›μ΄λ‹€. μ•„λž˜λŠ” μ†ŒμΌ“μ„ μ΄μš©ν•΄ UDPλ₯Ό μ‚¬μš©ν•˜λŠ” 방법이닀. socket() ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ‘œ UDPλ₯Ό μ“°κ² λ‹€κ³  μ„ μ–Έν•˜λ©΄ μ†ŒμΌ“μ„ μƒμ„±ν•˜κ³  μ†ŒμΌ“ 핸듀을 λ°˜ν™˜ν•œλ‹€. 데이터λ₯Ό μ£Όκ³ λ°›μœΌλ €λ©΄ 그전에 포트λ₯Ό ν• λ‹Ήν•΄μ•Ό ν•˜λŠ”λ°, bind() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν• λ‹Ήν•œλ‹€. any_portλ₯Ό 포트 κ°’μœΌλ‘œ λ„£μœΌλ©΄ μš΄μ˜μ²΄μ œκ°€ μ•Œμ•„..