학력
- Condorcet Prépa MPSI 수료 (프랑스)
- 칭화대학교 소프트웨어공학 학사 (중국)
- 고려대학교 정보보호대학원 석사 (한국)
경력
- 前 크래프톤 (테라 서버팀)
- 前 엔씨소프트 (Blade&Soul2 컨텐츠 프로그래밍팀)
관심 분야
- 리버싱 및 취약점 분석
- MMORPG 게임 개발 (C++, C#)
- 외국어 (영어, 프랑스어, 중국어, 일본어)
소개
해킹 공부를 위해 순전히 호기심으로 시작한 게임 개발인데...
시간이 흘러 어느덧 10년차 게임 개발자가 되었습니다.
"이래서 언제 게임을 만들지~?"
한숨 나오는 기초 문법부터 시작해서,
차츰 만들어가는 나만의 게임 세상.
그리고 그 세상에 접속한 다수의 플레이어를 볼 때의 뿌듯함.
공부를 할 수록, MMORPG의 매력에는 헤어나올 수가 없습니다.
제가 느낀 감동을 여러분도 느낄 수 있으면 좋겠네요.
강의
로드맵
전체 2수강평
- [Rookiss 라이브 세미나] AI 시대를 살아가는 게임 개발자의 생존 전략
- [Rookiss R&D Lab] UE5 Framework Insight (Liu)
- [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
- [Rookiss 라이브 세미나] AI 시대를 살아가는 게임 개발자의 생존 전략
- [나 혼자 레벨업] UE5 멀티플레이 게임 제작 Lv. 1 (Listen 서버 입문)
게시글
질문&답변
이 정도 서버의 객관적인 수준이 궁금합니다.
2000년도에는 구닥다리 C 서버로도 리니지 동접 5000명을 돌렸습니다.요즘 스펙의 컴퓨터라면 이 정도 C# 서버라면 충분하고도 남습니다.또한 중요한 점은 서버 엔진과 컨텐츠는 별개라는 것인데,서버 엔진은 언제든 갈아끼우면 그만입니다.요즘은 C++ IOCP로 하나 하나 만들지 않고 바로 C++ asio로 서버를 구축하는 경우도 있는데요.결과적으로 C++ asio 또한 어느 정도 고정된 프레임워크라서현재 C# 방식과 별다른 차이도 없습니다.
- 0
- 2
- 55
질문&답변
섹션6. DirectX 11 3D 입문 강의부터 렌더링이 안됩니다
라이브 강의 때도 비슷한 문제가 있었는데컴퓨터의 그래픽 설정을 수정해서 해결된 경우가 1건 있었습니다.최신 환경에서는 테스트를 안 해봤는데 집에 가서 확인을 해보겠습니다그리고 혹시 노트북 환경이신가요?
- 0
- 2
- 51
질문&답변
36. Serialization #3 에서 string (name) 코드 수정 질문
네 제 기억으로는 예전에도 한 분이 지적해주신 것 같은데 말씀하신 것이 맞습니다!해당 부분은 Part7에 protobuf 기반으로 수정이 될 예정입니다.
- 0
- 2
- 32
질문&답변
외부 컴퓨터와의 통신 방법이 궁금합니다
임시적으로는 그렇게 운영할 수 있지만애당초 NAT 환경에서 (집에서) 서버를 운영하는 것이 이상한 것입니다.돈 안 들이고 동접 50명 이하의 작은 게임이라면 상관없지만그보다 규모가 커지면 정식으로 운영을 해야 합니다.(사실 요즘은 그렇게 IP를 박으면 심사도 탈락하긴 해요)요즘 트렌드는 AWS 같은 클라우드에서 서버를 띄우는 것인데,도메인 주소 하나를 사서 DNS에 등록하여도메인->IP주소 변환을 시킨 후 해당 IP로 접속시켜야 합니다.시리즈 마지막의 AWS 운영 쪽에 살짝 관련 실습을 해보긴 합니다.
- 0
- 1
- 37
질문&답변
리소스 매니저 강의 18분 부근
Clear()는 여러 번 호출하더라도 안정성을 보장받을 수 있게 만들어주시고그 외 부분은 정해진 규칙이 없어 원하시는 대로 하시면 됩니다.다만 몇 가지 상황에 대한 답은 있는데요[1] Game 소멸자에서 Clear()를 호출하는 이유이 역시 필수는 아니고요.사실 어차피 게임이 종료되는거라, 무시하고 해제를 안 해도 전혀 상관 없습니다.일반적으로 리소스 매니저는 전체 Clear()를 하기 보단,씬 이동이 필요할 때 기존의 리소스는 날리는 용도로 활용됩니다.예를 들어 로비에서 활용하던 리소스는 인게임으로 들어가면 필요 없겠죠?다만 일반적으로 처음 학습할 때는 #include ~등을 활용해 메모리 누수가 없는지 추적하는 코드를 넣어놓는 경우가 많은데Game 소멸자 등 어딘가에라도 매니저 Clear를 하지 않으면,메모리 누수로 오인해 잡히는 경우가 생깁니다.(메모리 누수를 추적하는 방식이 new 하면 등록하고 delete 하는지 체크하는 방식이라)[2] 모든 매니저 생명주기를 RAII로 관리하면 좋지 않나ResourceManager의 소멸자에 Clear() 넣는 것을 말씀하시는거라면사실 [1]과 비슷한 이유로 어차피 프로그램이 종료되는 타이밍에 실행될 것이라 넣어도 그만 안 넣어도 그만입니다.다만 역시 같은 이유로 메모리 추적 코드를 넣었을 때,ResourceManager 소멸이 메모리 추적 코드가 발동하는 다음에 실행될 경우이 또한 제대로 보장받지 못합니다.결론적으로 그렇게 중요한 이유들이 있는 것은 아니고이런 궁금증을 갖고, 언젠가 언리얼 엔진에서 어떻게 처리하는지 소스코드를 살펴보시면 됩니다.
- 0
- 1
- 41
질문&답변
MMO 3D 게임 서버의 스킬 판정을 어떻게 하면 좋을까요?
네 놀랍게도 3D 기반의 스킬을 완벽하게 구현한 MMO는 (제가 아는 한) 없습니다.특히 무늬만 3D고 사실 2D 처럼 판정하는 경우가 많고요.그리고 일반적인 구현 방법은,말씀하신 첫 번째 방법과 매우 정확히 일치합니다.다만 서버는 유니티/언리얼 처럼 충돌체Collider의 개념이 없어스킬 판정을 수학적으로 직접 구현하는 경우가 많습니다.굳이 3D 판정을 가야 한다면 그리드를 3D로 만들어서 (=Voxel)동일하게 축을 추가해서 가면 되긴 하겠지만 MMO에서 공중전까지 가는 경우는 드물기 때문에 실제로 본 적은 없습니다.말씀하신 두 번째 방법은 현실적으로 힘듭니다.서버는 클라처럼 60프레임에 실행되는 개념이 아니라미세한 판정을 하기 힘듭니다.일부 게임에서 투사체를 날려 지형 지면에 닿으면 폭발하고! 누가 봐도 3D처럼 판별하는데. 놀랍게도 온갖 눈속임 + 트릭을 사용합니다.예를 들어 클라에서 날린 투사체의 피격 판정을 클라에서 직접 판단해서,서버에 충돌 사실을 알리고 서버에서는 아~주 러프한 검증만 하고 데미지 적용을 하는 경우도 있었습니다.
- 0
- 2
- 65
질문&답변
UClass 안에 ClassDefaultObject 관련 질문이 있습니다.
여기서 말하는 Default Object는, 말 그대로 UObject에서 파생된 클래스 1개당 하나의 기본 인스턴스가 만들어진다는 것인데요. 큰 프로젝트라 하더라도 어차피 클래스 개수는 그 정도로 많지 않기 때문에, 메모리 부담은 걱정할 필요가 없습니다. 메시 등의 아트 리소스가 메모리 용량을 많이 차지하는 것이지, 코드에서 파생된 CDO 인스턴스는 전부 다 합해봐야 0.0001%도 안 되는 아주 귀여운 수준입니다.기본적으로 CDO 내용은 메쉬 등 리소스와는 무관한 내용입니다. 물론 액터 자체에 StaticMeshComponent 등을 만든 다음 용량이 큰 에셋 경로를 하드코딩으로 연결해주면, 액터를 런타임에 생성할 때 에셋 또한 로딩이 되어 있어야 하므로, 게임 시작 시 (액터를 스폰하기 위해) 살짝 버벅거릴 수 있긴 합니다. 하지만 장기적으로 에셋은 AssetManager 등을 통해 동적으로 따로 로딩해서 로딩창에 뜰 때 한방에 로딩을 하는 것이 맞지, CDO에 하드코딩하진 않아 이 또한 별개의 문제로 봐야 합니다.
- 0
- 1
- 29
질문&답변
재귀호출? 오류나는데 왜 이래요 ?
ArgumentNullException: Value cannot be null.그리고 NULL 크래시는 모든 버그 중에 제일 이유도 간단하고 고치기 쉽습니다.NULL 크래시는 100% 무조건 찾을 수 있다고 믿음을 갖고 왜 그 부분이 NULL 참조값인지를 소스 차원에서 확인하거나, 디버깅을 해보시면 됩니다.
- 0
- 6
- 62
질문&답변
재귀호출? 오류나는데 왜 이래요 ?
슬쩍 보니 if (go = null)이 아니고 if (go == null)입니다.널체크를 하지 않고 null 대입을 하셨네요.종종 지뢰를 밟다 보면 매의 눈을 탑재하게 되니 힘내세요
- 0
- 6
- 62
질문&답변
[Service강의] owner -> shared_ptr
기본적으로 비동기 네트워크 이벤트에는 만료 시간이 설정되어 있어실패를 했으면 했지, 무한으로 밀리진 않습니다.따라서 우려하신 부분은 일어나지 않습니다.오히려 반대로 이벤트를 발생시킨 후 결과가 나올 때까진 절대 Session 객체를 날리면 안 됩니다.(왜냐하면 Session에 이벤트 내부에서 사용하는 recv/send버퍼가 있을 수 있기 때문.이러면 커널에서 유저레벨로 접근하는 타이밍에 크래시가 날 수 있습니다.)shared_ptr를 넣은 것은 강의에서 제가 슬쩍 시도해본 방법이지만,꼭 그렇게 안 하더라도 일종의 이벤트 등록 횟수에 대한 RefCount를 Session에서 따로 관리해처리하는 경우도 많았습니다.
- 0
- 2
- 27