Rookies iocp 강의 후기
최근 서버 스터디를 별도로 나가고있는데 여기서 이 강의를 많이들 좋게 봐주시기에 그날 결제하면서 봤었다.
강의명 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이제 4년차를 바라보고 있는 어쨌든 게임 개발자이지만, 개인적으로 얻어가는게 너무너무 많았다.
내 입장에서 주관적으로 느낀점들을 쭉 적어보려한다. 모두 개인적인 의견입니다.
좋았던 점.
- 완전한 네트워크 라이브러리 개발
iocp로 일단 돌아가는 네트워크 라이브러리 실습 강의는 이 부분 만으로도 일단 유일무이하다고 생각한다.
강의다보니 차근차근 바닥부터 만드는게 학습하기 용이하다.
비중이 가장 크긴 하나
- modern cpp 사용
넘쳐나는 modern cpp 문법에서는 아래 부분을 최대한 고려하다보면 의외로 많은 문법을 쓰지 않게 된다.
- 가독성
- 성능
- 투명한 내부 작동방식
- 빌드 속도
이 중 꽤 괜찮은 문법들을 골라서 사용하고 있고,
개인적으로는 가변인자템플릿을 활용하기가 많이 어려웠는데, 강의에서 사용례가 많다보니 정말 참고를 많이 되었다.
디자인 패턴을 쓰고, 코드를 구조화하다보면 코드 중복이 많아 질 수 있는데, 이에 대한 해결책으로서 많이 도움되었다.
- lock free 학습
이에 실제 각 자료구조를 실제로 실습 하는 부분도 있기에 좋았음.
- PacketBuffer 자동화, JobQueue, DB 실습
DB붙이는것과, JobQueue구조를 강의로 학습가능,
- TypeCast 학습
템플릿 타입 연습에 많이 도움이 되었다.
- Stomp Allocator
메모리 유효성을 체크하기에 굉장히 좋은 아이디어로서 얻어갔다.
C,C++도 점점 안가르치게되는게 안타깝게도 현재 컴공의 기조이지만 대학 4학년 마지막으로 한다면 꼭 해야하는 실습이라고 생각하는것이 소켓프로그래밍이다.
네트워크 라이브러리는 내가 알고있는 모든 선에서 요구지식, 구현 난이도, 모든 부분에서 가장 최고 수준의 난이도라고 생각한다.
현재 게임서버 자료는 너무 옛날 자료들이 많은데 이 (귀하디 귀한)자료들이 페이지 자체가 날라가면서 통째로 날라가는 등 그런 이슈가 있고, 그 외의 자료들도 점점 없어지는 판국에 정말 귀한 자료다.
강의가 나온 당시로서도 나름 최신에 실제로 사용하는 것들로 보이는 내용들이고
신규 개발을 지속적으로 하지않는다면, 대부분 여기 내용들이 프로젝트에 녹아있는 곳은 크게 없을것으로 생각한다.
현업까지 가야 알 수 있는 수준의 내용들 그것도 대부분 강연에서 조금씩 나오거나
암시적으로 예제 코드 같은 것들을 보고 삽질을 직접하고 여러 고민 끝에 나오는 구조들을 이렇게 강의식으로 배워 갈 수 있는 것이 정말 큰 장점이다.
아쉬웠던 부분, 우려되는 부분
- 이론 내용과 실습내용의 갭차이가 너무 난다.
초심자가 이걸 학습 하기에는 과연 괜찮을까?하는 부분이다.
내 기준에선 실습이 없는 이론 내용들은 들을 필요가 없었다.
이 강의에서 요구하는 이론 기반은 강의에서 다루는 이론보다 훨씬 복잡하고 깊은 지식을 많이 요구한다.
그런데 이론 강의는 이 실습에서 만드는 네트워크 라이브러리를 충분히 설명하지 못한다고 생각한다.
실습하는 내용의 정말 최소한만 언급하고 넘어가는 느낌이라, 연결성은 있지만
이런 작업을 하는데 특히 왜?가 좀 많이 빠져있는듯한 느낌을 많이 받았다.
특히 이걸 그냥 일방적으로 학습하는 사람 입장에서는 이런 부분을 인지하기가 어려울거라 많이 아쉽다고 생각했다.
다 집어넣자니 그냥 내용이 너무 방대해지고, 일방적인 강의라 어쩔 수 없다고 생각한다.
- Lock Free 관련.
위의 내용과 직결되는 내용인데, 특히 스핀락 구현부분에서 많이 밟히는 내용이 있었다 루프에 Sleep을 추가하는 것에 대한 내용인데
sleep은 스레드가 계속 깨있으면 cpu를 많이 먹으니 넣자 정도로 정리되는 내용은 아니다.
intel pause 명령어는 애초에 spin loop의 성능 향상을 위해 만든 전용 어셈에 해당하며, 이를 위해, 별도 asm을 만들었고 이를 통한 성능향상이 크기에 사용했다.
라고 설명하는게 정확하다고 보는 입장이다.
대부분 이 어셈을 놓치면 spinlock 및 lock free 자료구조(사담이나 lock free란 단어를 싫어한다)의 그 interlock 계열의 intrinsic을 사용했을때, 커스텀 구조는 대부분 os 내부에서 만들어진 것들을 사용한것보다 느릴 수 밖에 없다.
상세 내용은 아래 포스팅을 참고
https://eeeuns.github.io/2026/01/09/benefitting-sleep-loops-ko/
https://megayuchi.com/2017/06/25/srwlock-빠른-성능의-비결/
- 전반적인 게임서버의 발전 과정에 대해서 한번 알고나면 좋을듯 하다.
강의는 왜 저 강의의 스레드 모델을 쓰게 됐는지에 대한 설명이 없다보니..
전체적인 발전과정은 최근 강연에서 잘 나와있는걸 찾았기에 아래 링크로 대체
[NDC25-프로그래밍] MMO 서버에서 태스크 그래프를 활용한 확장성 있는 멀티스레드 아키텍처
바람직한 멀티스레딩 구조
- thread_local
이 부분은 사족이긴한데 thread_local은 많이 쓰면 나중에 디버깅환경에서 너무 어려울 것 같다는 생각이 든다..
watch view 로 봤을때 해당 thread에 대한것만 보이고 전체를 놓고 볼 방법이 없지않는가란 우려가..
thread_local로 사용할 변수, 객체들을 모은 구조체를 하나 선언한 후에
threadid 별 index를 만들고 전역 Array든 Hash_map이든 두고 관리하는게 좋지않을까 생각한다.
어떤 단점을 붙여도 내가 알고있는 선에서 대체 불가능한 게임 서버 강의로 보이고, (평을 보면 해외 기준으로서도 대체 불가능한 수준같다.)
취업준비생, 현직자 모두에게 정말 도움되는 강의라고 생각한다.
처음보는 내용들은 모두 내것으로 만들려고하면 강의만 들어서도 안되고 흡수하기 위해 정말 많이 노력해야할 것 같다.
일단 나도 아직 100퍼센트 흡수하지 못했다