Study/TIL(Today I Learned)

24.04.07 서버 최적화

에린_1 2024. 4. 7. 22:06
728x90

게임 서버 최적화

megayuchi님의 (socket + C/C++기반의)실시간 게임서버 최적화 전략 를 보고 정리 중 이다.

 

megayuchi

yuchi's development videos or game videos are uploaded. https://megayuchi.com 치지직 https://chzzk.naver.com/bf515de3afe09cbc18bde1c8f16a4a53 투네이션 후원 https://toon.at/donate/638391599606423120

www.youtube.com

서버에서의 이동(충돌)처리

  • 클라이언트와 마찬가지로 30fps or 60fps로 처리
  • 키 입력에 대한 순서가 보장되어야 한다.
  • 플레이어간 입력 순서가 보장되어야 한다.
  • 따라서 완전 동기식으로 처리하되 개별 이동처리 시간을 줄이는 수밖에 없다.
  • 처리해야할 캐릭터 수에 비례해서 성능이 하락한다.
  • 처리량이 늘어서 응답성이 떨어지는 경우이므로 thread pool을 이용하여 병렬처리를 한다.

전투판정

  • 로켓의 유도 , 타격은 캐릭터 이동(충돌)처리와 동일하다.
  • gun 타입의 무기들은 총구로부터의 ray가 존재한다.
  • ray와 지형/캐릭터의 충돌처리가 사실상의 전투판정이다.
  • 다수의 삼각형(복셀지형)/타원체에 대한 수학연산이 필요하다.
  • 총을 들고 있는 플레이어/npc의 수가 증가하면 당연히 소요시간이 길어진다.
  • 이동(충돌)처리와 마찬가지로 thread pool을 이용한 병렬처리를 사용한다.

복셀 데이터 압축 전략

  • thread pool을 이용한 병렬처리
  • 코드 최적화
  • 싱글 스레드로 비동기 처리
  • 복셀 편집 이벤트가 발생한 경우
    • 무기에 의한 파괴/복셀 추가/색상 변경/ 삭제/ 정밀도 변경 등
    • 압축 대기 목록에 추가 ← lazy loading 비슷해보였다.
  • 플레이어의 위치 변경에 의해 복셀데이터를 전송해야하는 순간까지 압축처리를 하지 못한 경우, 해당 오브젝트는 그 즉시 압축

개인맵 로드/세이브

  • 플레이어가 자신의 개인맵에 들어가려고 할 경우 파일로부터 개인맵을 읽어야 한다. 처음 들어가는 경우 새로 생성해야 한다.
  • 플레이어가 개인맵에서 나갈 경우 개인맵을 저장해야한다.
  • 디스크 I/O가 발생하므로 느리다.(메모리 연산의 지연시간과 차원이 다르다)
  • 다수의 유저가 동시 다발적으로 개인맵에 들어가거나 나갈 경우 메인 스레드의 응답성이 크게 저하될 수 있다.

비동기 DB 쿼리

  • DB에 쿼리 후 응답 수신 후 메모리에 업데이트
    • 로그인, 아이템 획득 등
  • 서버의 메모리 업데이트 후 DB에 쿼리(저장)
    • 총알 소모, 캐릭터 데이터 세이브, 기타 등등
  • 어느쪽이든 비동기 처리
  • 절.대.로 DB의 게임서버의 패킷 처리 스레드가 DB의 응답을 대기해서는 안된다.

멀티 스레드가 능사가 아니다

  • 동기화 비용은 생각보다 크다
  • 초기 코딩의 어려움
  • 디버깅의 어려움
  • 유지보수의 어려움
  • 처리량의 한계로 응답성이 떨어지는 경우만 사용할 것
  • 활성화된 core 개수에 따라 turbo boost가 꺼지므로 예상보다 더 성능이 안나온다.

결론

  • 처리량에서의 병목으로 응답성이 떨어지는가?
    • thread pool을 이용한 병렬 처리
  • 당장 처리할 필요가 있는가?
    • 당장 처리할 필요가 없으면 비동기 처리
    • 메인 로직과 분리할 수 있는가? → 별도의 스레드를 사용하는 비동기 처리
  • 당장 처리해야 하고 병렬화가 어려울 경우
    • 코드 최적화
  • 읽기 전용 메모리는 공유, 쓰기가 발생하는 경우 copy-on-write 적용
728x90