지난 4월 1일, 'PGR21 온라인'(가칭: MMOPGR)이라는 서비스가 열렸습니다. 기존 게시판 형태의 웹 사이트를 대체하는
[온라인 게임 형태의 웹 사이트]라는 야심찬 목표를 가지고 출발한 이 프로젝트는, 아쉽게도 며칠 만에 문을 닫고 말았습니다. 이제 와서 고백하자면, 그거 만우절 장난이었습니다. PGR21은 앞으로도 게시판 형태를 유지할 것입니다. 속여서 죄송합니다.
이번 PGR21 온라인이라는 아이디어가 처음 구체화된 것은 작년 12월의 일이었습니다. 운영진 게시판에서 다음 만우절 이벤트로 무엇을 할 것인지 논의가 나왔고, 제가 이런 댓글을 달았었습니다.
----
바람의 나라와 유사한 PGR21 온라인(웹 버전, 가칭)을 만들고 싶습니다. 모든 글이 게임상의 '집'으로 보이고, 댓글이 게임상의 구조물(책장 같은)로 보이고, 글 쓰기 버튼 등은 아이템으로 보이는 거죠.
이 웹 게임은 실시간으로 진행되며 글과 글을 오가는 (집과 집을 오가는) 회원들의 모습도 게임 속에서 확인할 수 있게 됩니다. 회원 간의 전투를 허용할 것인지는 아직 결정하지 못했습니다.
물론 이 인터페이스를 쓰기 싫은 사람을 위해 opt-out이 가능하도록 해야겠죠. 메인 페이지에서 둘 중 하나를 선택하는 식으로 하면 어떨까 싶네요.
이 계획의 가장 큰 문제점은 제가 엄청나게 게으르다는 것... 그리고 저는 그림을 못 그린다는 점이네요.
----
그 후로 이 안건에 대해 지속적으로 생각하고 있었습니다. 하지만 계속 게으름 피우고 있다가, 3월 중순쯤 되니까 도저히 미룰 수 없게 되었습니다. 슬슬 조사를 시작했죠. 일단, 여타 게임들처럼, PGR21 온라인을 만들려면 서버와 클라이언트가 필요합니다.
1. 서버
요즘 제가 밀고 있는 프로그래밍 언어는 '러스트'이기 때문에, 일찌감치 러스트로 서버를 짜려고 마음 먹고 있었습니다. 그러나 러스트가 정말로 합리적인 선택인지 확인할 필요가 있었습니다. 그것이 아니라면 제 고집으로 쓸데없는 고생을 하는 셈이니까요.
그래서 동일한 일을 수행하는 간단한 채팅 서버를, 여러 가지 언어로 각각 만들어서 벤치마크를 돌려 보았습니다. 그리고 각 서버 프로그램의 CPU 사용률을 확인해 보았더니...
러스트: 3.4%
루아: 4.3%
C++: 6.9%
자바: 8.2%
하스켈: 8.4%
고: 11.4%
자바스크립트: 12.0%
줄리아: 14.7%
파이선: 33.5%
PHP: 34.9%
루비: 35.7%
(각 언어로 작성된 서버 소스 코드 및 자세한 결과는
https://github.com/barosl/ws-bench 에서 보실 수 있습니다.)
이런 결과가 나왔습니다. 물론, 이러한 벤치마크는 매우 특수한 상황을 가정하고 있기 때문에 그리 과학적이지는 않습니다. 그러나 대략적인 비교는 되죠. 역시 러스트는 기계어에 가까운만큼 빨랐고, 제가 지금까지 11년 넘게 썼던 파이선은 참담한 성능을 보여주었습니다. 사실, 작년에 동접 1~2천 정도 되는 서버를 파이선으로 짰다가 랙이 심하게 걸려서 좌절한 경험이 있어서, 파이선은 별로 쓰고 싶지 않았는데, 좋은 대안이 나타난 것이죠.
주목할 만한 결과를 보인 것이 '루아'인데, 루아는 스크립트 언어이자 동적 타입 언어임에도 불구하고 굉장히 빠른 성능을 보여주었습니다. 대단히 인상적이더군요. 제가 듣기로, 루아의 JIT 컴파일러를 개발하는 'Mike Pall'이라는 사람이 대단한 천재라고 합니다. 기상천외한 최적화 기술들에 대한 글을 쓴 적도 있죠.
2. 클라이언트
서버 프로그래밍은 상대적으로 자신 있는 분야지만, 클라이언트의 경우 제가 마지막으로 2D 그래픽 게임을 만들어 본 것이 거의 10년 전이라서, 어떤 방법들이 있는지 자세히 알아볼 필요가 있었습니다.
우선 유니티처럼 배우는 게 상당한 시간이 걸릴 것 같은 프레임워크는 제외하였고, 순수 자바스크립트로 작성된 게임 엔진들을 알아보았습니다. 몇 가지를 비교해 본 결과, '페이저'(
http://phaser.io/ )라는 게임 엔진이 가장 괜찮아 보였습니다. 일단 쓰는 사람이 많고, 지원하는 기능도 다양하더군요.
그래픽 게임을 만들다 보면 당연히 그래픽 디자인을 해야 하는데, 저는 디자인 능력에 대해서는 누구보다 참담한 실력을 가지고 있다고 자신할 수 있습니다. 그래서 남이 그린 것을 날로 먹기 위해 무료로 배포되고 있는 스프라이트들을 알아 보았고,
http://opengameart.org/ 라는 사이트가 가장 도움이 되더군요. 여기서 'Kenney's RPG pack'(
http://opengameart.org/content/rpg-pack-base-set )과 'OpenPixels'(
http://opengameart.org/content/openpixelscharacters-tilesets-silveira-neto )를 찾았고, 이용했습니다. 이들 스프라이트의 라이선스는 CC이므로, 저도 CC로 내용물을 공개하게 됩니다.
이제 이러한 스프라이트를 이용하여 맵을 만들어야 합니다. 이 분야에서 가장 유명한 오픈 소스 에디터가 'Tiled'(
http://www.mapeditor.org/ )라는 물건 같더군요. 이것을 이용하여 쓱싹쓱싹 디자인하기 시작했습니다...만 맵 디자인도 디자인 감각이 있어야 하다니! 최종 결과물이 아주 못생겨서 슬펐습니다...
[타일드 맵 에디터]
[축소해서 본 모습]
그 다음으로 구현해야 했던 것이 유닛의 이동이나 충돌 체크입니다. 사실, 게임 엔진 자체에 이러한 기능들이 구현되어 있기 때문에, 클라이언트에서 먼저 처리하고 서버에 사후 통보를 하는 식으로 작성할 수도 있었습니다. 하지만, 이러면 핵에 취약하게 됩니다. 클라이언트에서 갑자기 10칸 20칸 이동하는 명령이나, 바다를 건너는 명령을 내렸을 때, 서버가 이를 곧이곧대로 받아들이면 큰일나겠죠. 단 하루 쓸 것인데도 도저히 이걸 그냥 넘어갈 수가 없었습니다. 혹시라도 그 하루 사이에 누군가 PGR21 온라인 핵을 만들면 어떡합니까! 그래서 다소 비효율적이 되더라도 서버에서 사용자의 모든 입력을 검사하게 만들었습니다. 이건 약간 결벽증처럼 보이긴 하는군요...
3. NPC
서버와 클라이언트가 만들어졌으니, 이제 NPC를 배치할 차례입니다. NPC는 일반 사용자와 마찬가지로 서버에 접속하는 수많은 클라이언트 중 하나이지만, 여러 가지 '특권'을 가지고 있습니다. 아이콘을 바꿀 수 있고, 순간 이동할 수도 있고, 텍스트를 띄울 수도 있죠.
임요환과 홍진호(두 번째로 언급함)의 삼연벙, 그리고 여타 프로게이머들이 모두 NPC로 구현되었습니다. 또한 책장에 표시되었던 게시판 글들도 사실 NPC입니다. 원래대로라면 NPC들 사이에 더 미세한 구분이 있어야 하겠지만, 구현의 편의를 위해 모두 똑같이 취급하도록 했습니다.
4. 아쉬웠던 점
원래 스토리 모드도 만들고 싶었습니다. 이스포츠의 10년이 넘는 역사를 비록 오글거리지만 드라마틱하고 중2스럽게 줄거리로 구현해 보려고 했는데, (스포일러: 최종 보스는 홍진호, 사전에 벙커 아이템을 습득하지 않았다면 이길 수 없음.) 시간 관계상 만들 수 없었습니다. 다음에 또 비슷한 일을 한다면 게으름 그만 피우고 더 일찍 시작해야겠습니다.
게임 성능도 무척 아쉬웠습니다. 처음에 걱정한 서버 성능에는 문제가 없었는데, 정작 믿었던 클라이언트쪽 게임 엔진이 너무 느렸습니다. 남들이 같은 게임 엔진으로 짠 거 보니까 안 느리던데, 아무래도 제가 뭘 잘 못 만든 모양입니다. 특히 CPU보다는 그래픽 카드 성능에 영향을 많이 받았습니다. 제 능력으로 단기간에 고칠 수 없는 문제였으므로, 아쉽지만 그냥 출시하기로 했습니다.
사실 원래는 일러스트레이터 분과 작곡가 분을 모셔서 애니메이션도 넣고 BGM도 깔고 싶었는데, 막상 PGR21에 모집 공고(?)를 올리려고 생각해 보니 대체 뭐라고 써야 할지 마땅치가 않더군요. 만우절 때문에 구한다고 말하면 다 들통나니까 속이는 맛이 없고, 그렇다고 일반적인 사이트 운영하는 데 작곡가를 구한다고 쓰면 이상하잖아요. 그래서 품질이 좀 떨어지더라도 그냥 혼자 하기로 했습니다. 다음에는 감쪽같이 구하고 싶군요.
----
만우절 장난이 시작되고 나서, 사용자들의 반응을 보는 것도 재밌는 경험이었습니다:
이런 말 하면 오글거리지만, 제 '프로그래밍 스승'이라고 불릴 만한 분이 하신 말씀이 있습니다. '사용자는 뭐든지 한다. 최대한 허점 없이 프로그램을 만들어라.' 이번 PGR21 온라인 역시, 비교적 간단한 프로그램이었음에도 온갖 일이 터지더군요. 저는 채팅 도배나 욕설 정도만 생각하고 있었는데, 브라우저 탭을 여러 개 띄워서 화면을 자기 유닛으로 도배하는 일이 발생할 줄은 몰랐습니다. 이 '버그'는 서비스 출시하고 몇 시간 후에 잡히게 됩니다.
[저게 다 두 사람이 채운 것]
포리프가 왜 그토록 오래 살아 남았고, 왜 아직도 마비노기를 하는 사람들이 있는지도 알 수 있었습니다. PGR21 온라인에 컨텐츠가 하나도 없는데도 사용자들이 알아서 컨텐츠를 만들어내더군요. 달리기 시합을 하질 않나, 여러 유닛을 모아서 글자를 쓰지 않나, 나중에 다람쥐 NPC를 추가했더니 아무 메리트도 없는데 계속 그것만 잡는 분도 계셔서 좀 무서웠습니다.
[글씨 쓰기]
[다람쥐 잡기]
[달리기를 하던 도중에 '세계의 비밀'을 발견했다!]
게시판 인터페이스를 버린다는 공지에 진짜로 속은 분이 계시다는 것도 꽤 재밌었습니다. (
https://ppt21.com../pb/pb.php?id=qna&no=57203 ) 다음부터는 더욱 진지하게 공지 글을 써서 더욱 많은 분들이 낚일 수 있게 하겠습니다.
이상입니다! PGR21 온라인을 만들면서 비록 시간은 좀 걸렸지만, 무척 즐거웠습니다. 1년 후에 다시 봅시다.
----
서버 소스 코드:
https://github.com/barosl/pgr21-online-server
아직 못 보신 분들을 위한 PGR21 온라인 임시 재오픈:
https://ppt21.com../online/