1월 03, 2016

네트워크 게임 튜토리얼 season1


  1. winsock의 개념
  2. 네트워크 게임 튜터리얼 1 - 워밍업

    1. winsock의 역사
    2. winsock의 종류
      • Window message select(WSAAsyncSelect)
      • Kernel event select(WSAEventSelect)
      • Overlapped I/O(Overlapped)
      • Overlapped I/O + IOCP (IOCP)

    3. Non blocking 개념
    4. Todo
      • Unix network programming, W. Richard Stevens
      • MFC
      • 소스 분석

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  3. Network game architecture
  4. 네트워크 게임 튜터리얼 2 - 아키텍트 돋는 첫걸음

    1. Network architecture
      • C/S
      • P2P
      • Player 수 증가에 따른 복잡도 증가(O(n*n)), NAT, session migration 등 어려운 문제가 존재.

      • C/S vs P2P

    2. Network architecture case analysis
      • packet analysis tools
        • netstat
        • TCPView
        • WireShark
      • C/S example: poker game
      • 여러대의 서버가 sign in process, game lobby, in-game 등 역할을 나눠 각 process를 담당. 이외에

        • 서버간 통신을 담당하는 서버
        • 어떤 서버로 연결할지 알려주는 서버
        등이 필요.

      • P2P example: Battle.net
        • 세션 마이그레이션: P2P 연결에서 host가 나갔을 때, host를 옮기는 과정.
        • 유저 간 정보 교환은 UDP로.

    3. Hole punching
    4. NAT(Network Address Translator=공유기) 뒤에 있는 peer의 IP는 실제 IP가 아니기 때문에 server가 될 수 없음. 이를 해결하기 위해 hole punching 기법 사용.

    5. To do
    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  5. DB와 server 연결하기
  6. 네트워크 게임 튜터리얼 3 - 데이터베이스 그리고 C/S DB에 들어가는 내용

    • 유저 관련 정보: 가입, 탈퇴, 로그인, 친구, 기타등등..
    • 게임 컨텐츠: 레벨, 경험치, 아이템, 공격력...
    • 인벤토리: 아이템, 수량, 돈...
    • 몬스터 정보: 경험치, 레벨, 공격력..
    • 사용자 패턴 정보
    • 그 외 '정보'라 할만한 모든 것
    DB
    웹서버 -------- 게임서버    DB가 웹서버와 게임 서버를 연결하는 역할
                
    1. DBMS 기초
    2. Winsock 과 ADO를 사용한 채팅 시스템
      1. DB 설계
      2. DB를 프로그램에 연결
      3. packet 설계
      4. 패킷 검출용 CGeneric class를 만들고 다른 패킷들은 이 클래스를 상속. DWORD head를 통해 패킷의 종류를 판별. 실제로 패킷을 전송 시엔 CDataMessage라는 버퍼용 클래스로 패킷을 감싸고 패킷의 크기는 버퍼클래스의 앞부분 4비트를 통해 표시.

    3. To do
      • 소스코드 분석
      • MySQL 문법 확인
    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  7. 로비 서버 만들기 -들어가기에 앞서: 객체의 생명주기, serialization, packet generator 등
  8. 네트워크 게임 튜터리얼 4 - 로비, 그리고 할말이 많다

    1. C/S의 생명주기
    2. 출처: http://www.gamedevforever.com/ 게임 서버는 Patch server, load balance server, lobby server, game server 등 분산 서버 구조를 이루고 있는데, 필요한 객체 생성 및 초기화 등은 이를 담당하는 서버에서 처리를 해야하고 lobby server는 lobby, game server는 game 등 자신이 담당한 역할에 집중할 수 있게 설계해야함.

    3. Lobby server 제작
      • Serialization
        • XML
        • 텍스트 기반으로 이뤄진 자료구조. 사람이 읽기 쉽지만 너무 커서 게임 서버에서는 잘 쓰지 않음. 멀티플랫폼 사용 가능

        • Protocol Buffer
        • 구글에서 만든 serialization protocol. 몇몇 기본 자료형과 string 만 보낼 수 있는 등 제약이 있음

        • JSON
        • Java script 용으로 나온 경량 데이터 교환 포맷. 가벼움. 멀티 플랫폼 가능.

        • boost::serialization
        • 강력한 기능: STL collection을 그대로 serialization. C++ 단일 플랫폼에 대해 사용 가능.

      • Packet generator 패킷 생성기
      • IDL 컴파일러: filename.idl 파일을 만들고 정해진 형식에 따라 필요한 함수를 작성해놓으면 이를 바탕으로 자동으로 소스 코드를 만들어주는 외부 컴파일러. 프라우드넷 IDL 컴파일러 등

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  9. Serialization
  10. 네트워크 게임 튜터리얼 5 - 드디어 직렬화

    1. 패킷 정의
    2. 모든 패킷의 base class 패킷을 만들고 이를 상속하여 실제로 사용할 각 패킷을 작성. polymorphism과 overiding 기법을 사용.
    3. 각 유저를 구분하는 키는 string보다 int(혹은 long) 형이 성능 측면에서 유리함
    4. Boost.Acchive
      • Boost.Archive 클래스
      • 파일 스트림을 통해 파일에 읽고 쓸 수 있게 해주는 클래스. serialization을 담당하는 Boost.Serialize는 Boost.Archive 라는 유틸리티 클래스에 기반을 두고 있음. Archive는 serialize를 담당하는 text_oarchive 클래스와 deserialize를 담당하는 text_iarchive 클래스로 구분됨. 클래스 내부에 boost::archive::text_oarchive와 boost::archive::text_iarchive 형 객체를 선언하고 이를 통해 입출력 수행.

      • Boost.Serialize 클래스
      • 클래스 내부에 serialize 함수를 선언

    5. Asio.Serialization
      1. 패킷 클래스에 serialize 함수 추가
      2. serialization

    6. 더 해야할 것
      • 빌드 시 패킷 클래스에 자동으로 serialization 함수를 넣어주는 방법?
      • (위에 이어) 각 패킷 클래스별 수신 함수를 자동으로 만들어주는 방법?

    출처: http://www.gamedevforever.com/39, http://rhea.pe.kr/

  11. 참고
  12. Chapter 64. Boost.Serialization

댓글 없음:

댓글 쓰기