2011년 8월 15일 월요일

게임 서버 벤치마크 정리


온라인 게임 서버 프로그래밍 벤치마크( 한동훈 저 )를 나중에 참조하기 편하게 정리했다.
Socket I/O Handling
Overlapped I/O[이하 OIO] 방식과 IOCP 방식이 가장 효율적이다. IOCP의 강점은 멀티코어 머신을 사용할 경우, 성능 향상을 기대할 수 있다.
OIO방식으로 윈도우 95부터 지원이 되므로 클라이언트에서 사용하면 좋을 것 같다.

Accept 처리
MMORPG같은 대규모 사용자를 처리하기 위해서는 AcceptEx + Polling 방식이 효율적이다.
메모리 관리
메모리 풀 방식이 가장 효율적이다. 효율면에서나 구조적 장점에서나 좋은 방식이다.
데이터베이스 API
ADO가 사용하기는 편하지만, 속도면에서는 ODBC가 적합하다. 

Nagle 옵션
Nagle을 사용하면 네트워크 응답속도를 포기하는 대신 패킷 개수에 이득을 보는 것이고, Nagle을 사용하지 않으면 응답속도에서 이득을 보지만 패킷 개수를 포기하는 것이다.
패킷 처리
WorkerThread를 별도로 생성한 후에 IOCP Queue에서 직접 패킷을 읽어내서 처리하는 방식이 가장 효율이 좋다.
날 것 패킷을 읽어서 복호화 처리와 CRC 체크 등을 처리한 다면, WorkerThread에서 할일이 너무 많아져서 이런처리를 하는 쓰레드와 WorkerThread를 분리하는 것은 어떨지는 고민해볼 필요가 있을 것 같다.

2011년 8월 10일 수요일

변수 명명 규칙 요약

이 글은 Code Complete 2의 11장. 변수 이름 효과에서 내 맘에 드는 부분만 요약한 것이다.

문제 지향성
  • 기억하기 쉬운 이름은 일반적으로 해결책보다 문제에 대해서 말한다.
  • 직원의 데이터에 대한 레코드는 inputRec보다 employeeData가 좋은 이름이다.
  • 프린터의 상태 비트 필드는 bitFlag보다 printerReady가 좋은 이름이다.
최적의 이름 길이
  • 10~16 또는 8~20
  • 코드를 봤을 때, 짧은 이름을 많이 보게 된다면, 이름이 분명한지 확인해 보야야 한다는 것이다.
변수 이름에서의 계산값 한정자
  • Total, Sum, Average, Max, Min, Record, String, Pointer같은 값을 보관하는 변수는 이름 끝에 한정자를 입력한다.
    예) revenueTotal, expenseAverage
  • Num 대신에 Index나 Count를 사용한다.
    예) customerCount, customerIndex
변수 이름의 일반적인 반의어들
  • begin/end
  • first/last
  • locked/unlocked
  • min/max
  • next/previous
  • old/new
  • opened/closed
  • visible/invisible
  • source/target
  • source/destination
  • up/down
불린 변수 명명
  • done
  • error
  • found
  • success
  • ok
명명 규약 샘플
  • ClassName
  • TypeName
  • EnumeratedTypes
  • localVariable
  • routineParameter
  • RoutineName()
  • m_ClassVariable
  • g_GlobalVariable
  • CONSTANT
  • MACRO
  • Base_EnumeratedType