게임회사에서 재직하진 않았지만 자바 역시 일본에서 가장 많이 쓰이는 기술이라고 생각합니다.
다만 차이가 있다면 한국보단 일본이 닷넷을 더 쓰고 레퍼런스나 직장 역시 많은 것 같습니다.
단순하게 “한국의 전자정부 프레임워크 때문에 갈라파고스가 된겁니다” 라고 하고 싶지만 그것보다 게임 분야가 아닌 큰 회사 기준에서 다녀도 보고 한 경험으로 말씀드리면 다음 이유가 아닐까… 생각해봅니다
aspnet core가 대규모 처리 시 초당 HTTP 요청이 가장 빠릅니다 (Servlet, nginx, golang, node.js 보다?)
데이터베이스 엑세스 성능이나 초당 처리 성능이 상당히 빠릅니다
net core로 넘어오게 되면서 비동기나 각종 메모리 관리 등 성능이 크게 향상 되었습니다.
웹 개발자가 많고 상대적으로 규모가 크지 않은 경우라면 다른 대안이 많지만 큰 규모라면 관리와 장애 대응을 생각했을 때 커뮤니티 활성화보다 파트너사나 조치를 좀 더 쉽게 할 수 있는 안전성(성숙도)을 생각할 수 있습니다
게임 개발사는 상대적으로 자바보다 C#을 접할 확률이 더 있습니다. 설득력은 좀 떨어지지만 Unity하던 사람이 서버도 만질 확률도 있고 그렇지 않더라도 자바로 된 개발사가 아닌 이상 코드 공유가 수월하다는 장점이 있을 것 같습니다. 생산성 측면이나 MS 기술에 대해 익숙할 수 있으니 채택이 된 건 아닌가 싶습니다
net core를 통해 유연하게 다양한 환경에 배포가 가능해졌습니다. 특히 제 경우엔 linux를 잘 모르더라도 쉽게 배포가 가능해졌고 이를 통해 docker 컨테이너 형태로 lambda에 배포하거나 리눅스 기반에 aws ec2에 배포하는 것이 수월해졌습니다. 특히 단일서버 기준 리눅스에서 .net core가 돌았을 때 성능이나 가성비가 확실히 좋습니다. 클라우드에 이것을 구축했다면 콜드 스타트나 비용 등 여러가지를 고려해도 나쁘지 않은 선택입니다
확실히 C++ 게임서버가 속도 측면에서 보편적으로 많이 선택 되어왔다고 생각이 되는데 진입장벽이 높기도 하고 JAVA 게임서버 개발은 레퍼런스나 성능 문제도 있고 오히려 이 시장에선 극소수인지라 자연스럽게 C → C++ → C#이 된 건 아닌지…
예전에 비해 백엔드 쪽으로 .net core로 작성하는 케이스가 심심치 않게 보이고 있긴 한 것 같습니다. 한국이야 뭐 워낙 파이가 작아도 채용시장에 조금 보이기도 하고 .net core가 발전함에 따라 말씀하신 비동기 소켓서버를 선택했을 때 이 점이 확실히 있는 편이라 전환하는 과정에서 수요가 있을 것 같습니다
하지만 어디까지나 제 생각이고… 데이터 가지고 들고 나와서 말씀드리기엔 현업에 계신 분들이 공감 못하실까봐 뇌피셜로 끄적여봤습니다.
기술적으로 닷넷의 버전이 업그레이드 될 수록 힙 메모리에 의존하는 연산을 최소화하고, 가비지 컬렉터가 실행되는 빈도를 낮추는 방향으로 I/O 연산을 최적화하는 것에 많은 공을 들이는 것으로 알고 있습니다. Microsoft가 리딩 포인트를 잡고서 계속 런타임 성능 개선에 많은 투자를 하고 있는 덕분이라고 보여집니다.
프라우드넷이 C#으로 개발되었다가 C++로 컨버전 했죠
GC도 문제고 네이티브 언어에 비하면 성능이 낮으니 장점이라기 보단 절충안으로 닷넷을 선택한 것 같습니다.
리더보드나 실시간이 아닌 모바일 게임은 성능이 크게 중요하지 않으니 뭘로 해도 상관 없고요
C++ 고성능 서버 제외한 나머지는 그냥 취향인 것 같습니다.
여러회사 다니면서 http 서버로 노드,파이썬,자바,코틀린,루비온레일즈 서버랑 비교해봤는데 성능차이가 쨉도안됩니다.
아이들상태에서 노드 파이썬(당시 fast api가 흥하지 않았어서 fast api는 몰라요)보다 10배정도 빠르고, 자바보다는 2~5배정도 빨랐습니다. 루비는 100배쯤 차이나서 아예 쨉도 안돼요. 비동기+스트레스 상황에서는 앞에 얘기한것보다 2배씩 더 빨라졌고, 메모리 효율이나 스트레스 내구성도 차이가 많이 났습니다. 물론 저 플랫폼들을 준비하신분들의 역량의 차이일수도 있지만 닷넷서버라고 딱히 성능이나 안정성에 관련해서 손댄건 아니었어요. 고랭은 api 서버를 하시는분이 안계셨었는데 병렬처리가 정말 빨랐는데 닷넷에 비해 느린 케이스도 많았고 라이브러리들이 당시에는 많이 미성숙했어요.
특히 자바쪽은 스프링부트로 그냥 비동기 처리를 하는게 어렵게 되어있더라구요? 그래서 무슨 스프링부트 어쩌고해서 나온걸 해야하는데 기존 스프링부트와 유사성도 떨어지고, 그 고생해서 작성해도 닷넷보다 미세하게 느렸어요. 특히 디비관련된 라이브러리들은 비동기를 지원이 미흡해서(저는 그럴리가 없다고 생각했지만 관계자분들이 그렇다고 해서…) r2db?머시긴가 아직 베타라고 하던데 알아야할게 왜이렇게 많나 싶었습니다. 자바 라이센스 정책도 복잡하고, ojdk도 8, 11 두개만 지원해서 최신버전 역시 적용못하고 8-11간 하위호환성 문제도 나오고 여러모로 채택할 이유가 없었습니다.
규모가 큰 게임회사의 경우 어느 정도 스펙이나 여러 사항을 고려한 후에 서버 스펙을 정할텐데요. 작은 규모의 게임 회사인 경우 간혹 게임 개발 겸 서버도 개발하는 곳도 있습니다. 그럴 경우 Unity 개발자의 경우 가장 접근이 쉬운 게 닷넷 서버라서 채택하는 경우도 많다고 합니다. 결국에는 각 프로젝트 별로 고려 후에 정하는 거겠지만 위처럼 겸해서 개발하는 경우는 보통 닷넷 서버로 간다고 하더군요.
Unity로 개발하는 경우는 Entity나 구조 설계가 아무래도 닷넷 서버와 이점이 많은 것 같습니다. 닷넷 서버로 개발하는 입장에서 Unity 개발자와 협업 시 라이브러리를 같이 사용하거나 공통으로 사용해야할 로직들에 대해 정리해서 서버쪽에서 만들어 배포하는 등 개발이나 운영 간에 여러 이점이 있는 것 같습니다.
그리고 그렇게 개발하면서 필요한 운영툴이 있다면 닷넷 서버를 사용하는 경우 자연스레 닷넷을 이용한 웹 프론트, 백엔드 개발이 들어가게 되서 닷넷 생태계가 이루어지는 것 같습니다. 이상 게임업계 종사자의 뇌피셜이었습니다…?! ㅎㅎ
언어나 프레임웍을 선택하는 기준은 상황에 따라 매우 큰 차이가 있기 때문에
역시나 '상황에 따라 다르다’라고 하겠습니다.
일반적으로 할 수 있는 이야기가 각자의 상황에 모두 들어맞기는 매우 어렵기 때문입니다.
여러가지 기준이 있을텐데요,
결과물의 런타임 성능의 중요도
개발 및 유지보수에 필요한 시간
해당 기술력(및 기술인력)의 보유 여부
해당 기술인력 수급의 용이함
자금이나 일정상이 이유 및 외주개발 가능 여부
협력관계에 있는 회사와의 사정
…
대충 생각해 봐도 무지 많군요. 이런것들을 다 떠나서 기술적인 부분만 자세히 들여다보면… 그래도 상황에 따라 다르다고 할 수 있습니다.
가비지 컬렉터도 없고 네이티브 언어인 C는 일단 논외로 칩니다.
우선 성능에 지대한 영향을 미칠수 있는 것들은 여러가지일텐데 나열해보겠습니다.
쓰레딩 모델
DB 저장 구조와 UI/UX의 연관성(관계형, 키밸류, 타임시리즈 등…)
I/O 요청량의 크기 및 요청횟수
자주 사용되는 것 부터 드물게 사용되는 데이터들까지의 캐싱 레벨의 설정
최적의 성능을 발휘하는 상태를 유지하는 설정(메모리 핏 되서 페이징등이 자주 발생되지 않게)
하드웨어의 특수기능 활용 여부(SIMD 명령어나 DPDK 등 지원 및 활용 여부)
런타임 환경의 제약
…
이러한 조건들은 환경에 따라, 그당시 상황에 따라 달라질 수 있습니다. 특별한 경우가 아니라면 범용 언어나 프레임웍들 중 어떤것도 그 자체로서 특출날수는 없을 것 같습니다.
예를 들어 이런 경우도 있을 수 있습니다. 올해 인텔 아키텍쳐인 AVX-512를 활용한 정렬 알고리즘이 발표되어 파이썬 넘파이 라이브러리에 포함되었는데, 정렬연산이 많은 작업을 처리할때는
그리고 런타임환경이 해당 명령을 지원하는 환경일 경우는 해당 기능을 사용하지 않는 다른 java나 c# 프레임웍보다 파이썬이 훨씬 높은 성능을 처리할 수 있습니다.
각 환경별로 다소 늦게 공식(혹은 표준) 라이브러리에 포함될 수도 있으니 시간에 따른 편차도 존재합니다.
어떤 제약이 있는지, 단점이 있지만 본인이 포함되었던 환경에서는 그 단점이 상쇄되는 환경이었을수도 있고… 그리고 시간이 지나면 상황이 바뀌기도 합니다.
정확한 근거가 없이 당장 나타난 현상에만 집작하게 되면 잘못된 지식과 믿음을 가지게 되는 경우도 많으니, 근거가 확인되지 않은 경우에는 ‘뭐가 어디어디에 좋다는 이야기는 들었다.’ 정도로 인식하시면 좋을 것 같습니다.