흔한 덕후의 잡동사니

프로젝트: FPS26 (C++로 개발한 3D FPS 게임과 서버 개발기) 본문

포트폴리오/C++

프로젝트: FPS26 (C++로 개발한 3D FPS 게임과 서버 개발기)

chinodaiski 2025. 4. 4. 07:26

C++로 제작한 3D FPS 게임과 전용 서버를 개발하면서 사용한 기술과 자동화, 네트워크 구조 및 동기화 방식에 대해 정리했습니다. 클라이언트와 서버 간 통신은 Protocol Buffers를 사용하며, 데이터 정의와 코드 생성을 자동화하여 생산성과 유지 보수성을 높였습니다.

 

작성자 GitHub: https://github.com/ChinoDaiski

 

ChinoDaiski - Overview

ChinoDaiski has 30 repositories available. Follow their code on GitHub.

github.com

 

프로젝트 링크

서버 - https://github.com/Proejct26/FPS26Server

 

GitHub - Proejct26/FPS26Server

Contribute to Proejct26/FPS26Server development by creating an account on GitHub.

github.com

 

클라이언트 - https://github.com/Proejct26/FPS26

 

GitHub - Proejct26/FPS26

Contribute to Proejct26/FPS26 development by creating an account on GitHub.

github.com

 

 

주요 작업 내용 및 기술적 도전

1. Protobuf 기반 패킷 구조 자동화
[ 엑셀 기반 패킷 정의 ]
패킷 정의를 Excel로 관리하여 구조적인 명세서를 유지했습니다. 필드명, 타입, 설명 등 패킷의 정의를 체계적으로 정리한 후, 이를 바탕으로 자동화된 .proto 파일을 생성했습니다.

 

[ Python 스크립트 자동화 ]
- 엑셀 → .proto 파일 생성
- .proto → C++ 서버 / C# 클라이언트 코드 생성
두 개의 자동화 파이썬 스크립트를 통해 패킷 정의 변경 시 손쉽게 전반적인 업데이트가 가능하도록 구성했습니다. 이로인해 C++ 헤더/소스를 자동 생성하고, C#에서는 Unity 프로젝트에 맞는 네트워크 코드를 자동 생성하도록 구성했습니다. 반복 작업이 제거되어 협업과 유지 보수가 훨씬 용이해졌습니다.


2. 네트워크 구조 및 동기화 방식
[ 서버 구조 – 싱글 스레드 + select (IOCP 코어 구현 완료) ]
서버는 현재 select() 기반의 싱글 스레드 구조로 작동하지만, IOCP 기반의 멀티 스레드 코어는 이미 구현 완료된 상태입니다. 향후에는 내부를 Job Queue 기반의 비동기 처리 방식으로 리팩토링할 예정입니다.


[ 클라이언트 구조 – 잡큐 기반 동기화 ]
클라이언트는 네트워크 스레드와 메인 스레드 사이에 Job Queue를 두어 스레드 간 데이터를 안전하게 전달합니다. 네트워크 스레드가 데이터를 큐에 넣고, 메인 스레드가 해당 큐를 소비하며 동기화된 처리를 수행합니다.

 

3. 서버 배포 및 운영
[ AWS Windows Server 운영 테스트 ]
Windows Server 2022 Base를 사용하는 AWS EC2 인스턴스를 통해 외부 접속 가능한 테스트 환경을 구축했습니다. 약 2일간 운영되었으며, 총 $0.54가 청구되었습니다. 실제 클라우드 환경에서 테스트하고, 향후 자동화된 배포 및 모니터링 확장을 고려하는 계기가 되었습니다.

 

 

기술 스택

C++ 서버 및 게임 클라이언트 핵심 로직
Protocol Buffers 직렬화/역직렬화 통신 포맷
Python 자동화 스크립트 (Excel → proto, 코드 생성)
C# 클라이언트 네트워크 코드 (Unity 기반)
select() 현재 서버의 소켓 이벤트 처리 방식
IOCP 멀티 스레드 코어 구현 완료 (도입 예정)
Job Queue 스레드 간 안전한 동기화 방식
AWS EC2 클라우드 서버 테스트 (Windows Server 2022)

 

 

프로젝트에서 배운 점

1. 패킷 구조 자동화
수동으로 proto를 수정하는 대신, 엑셀 기반 정의와 자동화된 스크립트로 개발 속도와 정확도를 크게 높일 수 있었습니다.


2. 스레드 구조 설계의 중요성
클라이언트/서버 모두 Job Queue를 통한 동기화 방식을 도입함으로써 경쟁 조건을 줄이고 관리가 쉬운 구조를 얻었습니다.


3. 서버 구조의 확장성 확보
select 기반으로 시작했지만, IOCP 코어와 잡큐 구조를 미리 구축해두어, 향후 수용량 증가에도 유연하게 대응할 수 있는 기반을 마련했습니다.


4. 클라우드 서버 운영 경험

AWS 기반 테스트를 통해 서버 배포 및 운영 경험을 쌓았고, 실제 과금 및 리소스 관리에 대한 감각을 익힐 수 있었습니다.