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
'Study > TIL(Today I Learned)' 카테고리의 다른 글
24.04.09 서버 프로그래밍, 서버 공부 (0) | 2024.04.10 |
---|---|
24.04.08 서버 프로그래밍, 백준 (0) | 2024.04.09 |
24.04.06 서버 프로그래밍, 서버 최적화, 백준 (0) | 2024.04.06 |
24.04.05 서버 프로그래밍 (1) | 2024.04.06 |
24.04.04 회고 (0) | 2024.04.05 |