PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2015/04/11 19:07:11
Name 랜덤여신
Subject [일반] 만우절 장난: PGR21 온라인이 만들어지기까지
지난 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/

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
늘지금처럼
15/04/11 19:11
수정 아이콘
으어 정말 정성이 듬뿍(?) 들어간 장난이었네요 흐흐흐
메모네이드
15/04/11 19:12
수정 아이콘
고생 많으셨습니다! 무척 즐거운 기억이었어요!!
닭강정
15/04/11 19:15
수정 아이콘
일부러... 찍으신 거죠? 첫짤부터 또옹 대화가......
ohmylove
15/04/11 19:16
수정 아이콘
그게 장난이었다니.. 부들부들..

정말 창의적이라고 생각했는데..
마스터충달
15/04/11 19:42
수정 아이콘
헤헤 버그 헤헤
아이유
15/04/11 19:44
수정 아이콘
뭔가 익숙한 티모들이 화면에....
사실 VKRKO님 아래도 아이유티모가 한마리 깔려있습니다.
IU를 만들고자 했는데 현실은 그냥 티모밭...
15/04/11 19:58
수정 아이콘
크크크 주변에 아이유만 8명 있는 명당 제공해주셔서 감사합니다
뉴욕커다
15/04/11 19:45
수정 아이콘
크크크크크 너무 재밌었어요!!
감사합니다!
ohmylove
15/04/11 19:47
수정 아이콘
'가슴 만지게 해주세요'는 뭐지 크크
9th_avenue
15/04/11 19:53
수정 아이콘
변태라는 이름의 신사는 항상 우리 주변에 있지요. 빙긋~
파우스트
15/04/11 20:09
수정 아이콘
변태라는 이름의 변태는 항상 우리 주변에 있지요. 빙긋~
15/04/11 19:58
수정 아이콘
아 내가 달리기 챔피언이었는디 ㅠㅠ
네가있던풍경
15/04/11 20:15
수정 아이콘
고생 많으셨습니다~ 잠깐이지만 바람의 나라 생각도 나고 재밌었어요^^
네버스탑
15/04/11 20:17
수정 아이콘
에이 이 정도로 유저들 더 끌어 모을 수 있겠어요? 더 분발하시길 바랍니다 크크
아무튼 소소한 재미를 줘서 감사했습니다
오큘러스
15/04/11 20:28
수정 아이콘
정말 수고하셨습니다!
다음번엔 webGL 을 이용한 실시간 3d 인터페이스의 pgr을 기대할게요(찡긋~)
오큘러스
15/04/11 20:36
수정 아이콘
니가 하시던지.....
랜덤여신
15/04/11 22:35
수정 아이콘
본문에 뒤늦게 추가했는데, 원래는 일러스트레이터 분과 작곡가 분도 구해서 애니메이션 효과도 넣고 BGM도 깔고 싶었습니다. 하지만 이런 걸로 PGR21에 구인 글(?)을 올리면 장난이 들통날까봐 못 했죠. 제가 3D 기술을 갖추는 건 영원히 불가능할 것 같으니, 다음 번에는 꼭 누군가를 영입해서 도움을 받고 싶군요.
15/04/11 20:30
수정 아이콘
항상 노고에 감사드립니다
참룡객
15/04/11 20:32
수정 아이콘
브라우저가 문제가 있었는지 잘 안되서 별로 못 즐겼지만
얼마나 귀찮고 힘든 작업일지 짐작이 갑니다...

그럼 다음은 대세를 따라 모바일 게임으로??
크크크
15/04/11 20:37
수정 아이콘
이야~~ 수고하셨습니다.
15/04/11 21:26
수정 아이콘
재미있었어요 !~ pgr은 도토리를 뿌려라
15/04/11 21:32
수정 아이콘
랜덤여신님 제가 리플로 질문 드린적있는데 혹시 보셨나요 ㅠ
랜덤여신
15/04/11 22:37
수정 아이콘
아, 그거! 기억 납니다. 그 댓글 보고 뭐라고 답변해야 할지 몇 주 동안 생각했는데, 잘 되지가 않더군요. 생각보다 설명이 복잡해질 것 같아서 언젠가 그걸 주제로 독립된 글을 쓰고자 합니다. 제법 흥미로운 주제 같거든요.
15/04/12 06:22
수정 아이콘
오오...생각지도 못한 선물을 받겠네요! 감사합니다!
곧내려갈게요
15/04/11 21:46
수정 아이콘
드릴게 추천밖에 없네요
나의규칙
15/04/11 22:16
수정 아이콘
진짜 재미있었던 경험이었습니다. 고생 많이 하셨습니다. 감사합니다^^
어리버리질럿
15/04/11 22:35
수정 아이콘
추천!!
15/04/11 23:06
수정 아이콘
지금부터 1년동안 만들어서 만우절 뿐 아니라 대체 플랫폼으로도(불판용 채팅이나) 손색없는 시스템이 만들어졌으면 좋겠네요
15/04/11 23:07
수정 아이콘
제가 본 모든 인터넷 사이트에서 가장 신선한 만우절 장난이었네요. 추천 저도 날립니다!
세계구조
15/04/11 23:17
수정 아이콘
저같이 비전공인데 프로그래밍에 관심이 많은 사람에겐 랜덤여신님 글이 매번 재밌네요. 고맙습니다.
BessaR3a
15/04/11 23:35
수정 아이콘
짝짝짝짝짝!!!!!!
영양아래
15/04/11 23:47
수정 아이콘
고생하셨습니다 흐흐 저도 글씨 쓰기로 역사의 한켠에 함께 했네요 흐흐~
15/04/12 01:05
수정 아이콘
정말 유쾌한 이벤트였습니다. 감사합니다.
즐겁게삽시다
15/04/12 04:12
수정 아이콘
컴 사양이 구려서 제대로 못즐겼는데 만우절날 덕분에 너무 즐거웠습니다. 해커정신이랄까요? 정말 사람들을 즐겁게 하는 코딩이 이런 거구나 싶었습니다.
츄지Heart
15/04/12 13:38
수정 아이콘
너무 멋집니다. 많이 배우고 있고요. 글 자주 써주세요!
15/04/15 10:36
수정 아이콘
랭기지별 websocket 성능 간단 비교가 굉장히 흥미롭네요.
개인적으로는 c++ websocket server성능도 같이 비교되었으면 좋겠습니다. 궁금하네요.. 크크
랜덤여신
15/04/15 10:50
수정 아이콘
드디어 관심 가져 주시는 분이 나왔군요! 사실 저도 그 부분을 신경 써서 작성했습니다. 다만 벤치마크라는 게 논란이 될 때가 많아서 조심스럽군요. 특히 이런 장난감 수준의 벤치마크는 말이죠.

제가 예측하기로는 C++ 성능이 러스트보다 나을 겁니다. 현존하는 러스트의 웹 소켓 라이브러리들은 모두 synchronous I/O만 쓰거든요. 그래서 벤치마크 코드는 그냥 쿨하게 스레드 100개를 씁니다. 성능상 영 좋지 않죠. 그럼에도 여타 언어 구현체들을 압도한다는 게 저수준 언어의 재밌는 점이지만요.

지금 찾아 보니 Boost.Asio 쓰는 C++ 웹 소켓 라이브러리가 하나 있군요. 생각난 김에 지금 테스트해 봐야겠습니다.
랜덤여신
15/04/15 11:39
수정 아이콘
C++ 결과 추가했습니다. 뭔가 좀 충격적인 결과가 나왔군요!

아무래도 제가 사용한 C++ 웹 소켓 라이브러리의 성능이 영 좋지 않은가 봅니다. https://github.com/zaphoyd/websocketpp 를 썼는데... 음.
15/04/15 12:53
수정 아이콘
헛 점심먹고왔는데, 아이고 제가 본의아니게 일을 드렸네요. 크크. 식사는 하셨는지요?

예전에 자주쓰던 랭기지라 혹시 있을까 했는데, 또 찾아봐주시고 테스트까지 해주셨네요.
덕분에 고생하신자료 아주 맘편히(?) 봤습니다.
결과가 신기하네요. 뭐 이것저것 요인이 있겠지만 의견주신 라이브러리 성능에 저도 한표 드립니다.

논외로 생업도 있으실텐데, 이렇게 작업하시는 것도 저같은 게으른 놈에게는 대단해보입니다.
덕분에 rust에 급 관심이가고 있습니다. 홈페이지 외에 추가로 추천해주실 곳있으면 부탁드릴께요.
랜덤여신
15/04/18 05:15
수정 아이콘
아직까지는 본진(?)이 가장 문서가 많지만, http://rustbyexample.com/ 도 유용해 보입니다.

그리고 한국 사용자 모임( http://rust-kr.org/ )도 있으니 참고하세요! 정기적으로 코딩 모임( http://rust-kr.org/pages/_pages )도 열립니다.
15/04/20 11:21
수정 아이콘
감사합니다. 참고할께요.!
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
57510 [일반] [야구]2011년 8월 17일 그일이 없었다면? [45] 오바마7369 15/04/13 7369 0
57509 [일반] 대학생, 직장인 유용한 엑셀 정보 모음.jpg [22] 김치찌개15222 15/04/12 15222 18
57508 [일반] 전 세계에서 가장 많은 돈을 버는 은퇴한 운동선수 Top10 [26] 김치찌개8000 15/04/12 8000 2
57507 [일반] PDW? 개인 방어 화기? [11] 저퀴5999 15/04/12 5999 1
57506 [일반] [축구] 이번시즌 첫 슈퍼매치 관전포인트 [8] Korea_Republic2518 15/04/12 2518 0
57505 [일반] 장동민 욕설 관련 파문을 보고 든 생각.... [190] 야율아보기12792 15/04/12 12792 1
57504 [일반] 마시고 죽어 보자고! [10] 토다기4785 15/04/12 4785 0
57503 [일반] 빈볼과 불문율, 김성근 감독과 롯데에 대하여(영상) [131] 호가든11928 15/04/12 11928 0
57502 [일반] 김성근씨가 또 황당한 짓을 하고있네요. [434] 삭제됨23403 15/04/12 23403 17
57501 [일반] 성완종 사건이 '앙꼬없는 진빵'이 될거 같습니다. [84] 마빠이7755 15/04/12 7755 1
57500 [일반] [야구] 힘들었던 잠실 더비 3연전 후기 [17] SKY923294 15/04/12 3294 0
57499 [일반] 로마사에서 등장하는 강력한 스포츠 서포터들 [4] swordfish-72만세5364 15/04/12 5364 1
57498 [일반] LG G4의 디자인이 공개되었습니다. [75] 종이사진11284 15/04/12 11284 0
57497 댓글잠금 [일반] '제발 좀 닥치고 있어라' [184] 아칼리16049 15/04/12 16049 36
57495 [일반] [UFC계층] 오늘 새벽 크로캅 vs. 곤자가의 경기가 있었습니다. [17] 삭제됨5671 15/04/12 5671 0
57494 [일반] 신경써야할 법이 만들어지고 있군요. [17] 이니그마7778 15/04/12 7778 0
57493 [일반] 결혼합니다. [16] 삭제됨4742 15/04/12 4742 2
57492 [일반] 1. [164] 삭제됨17101 15/04/12 17101 5
57491 [일반] 인공지능 이야기 4 - 유전자 알고리즘(2) [19] 마술사얀8910 15/04/12 8910 15
57490 [일반] 웃음을 위해서라면 무엇이든 괜찮은가. 장동민 논란. [319] dd.lbx20745 15/04/12 20745 10
57489 [일반] 현재 삼성라이온즈에서 제일 잘 치는 타자 [42] style6876 15/04/12 6876 0
57488 [일반] 만우절 장난: PGR21 온라인이 만들어지기까지 [41] 랜덤여신8498 15/04/11 8498 54
57487 [일반] [축구] 오늘 FA컵 64강이 열렸습니다. [13] ChoA3317 15/04/11 3317 2
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로