안녕하세요? 비니아빠 바야바입니다.
일단 조회수를 위해 제목만 거창하게 달아봤습니다. 죽여주세요.
오늘은 제가 만든 온라인 게임들은 어떻게 만들어졌는지 진짜 간단하게 소개해보려고 합니다.
2G->3G->LTE를 거치면서 모바일 네트워크 성능은 점점 더 진화하고 있고,
앞으로 모바일 온라인 게임이 마켓의 트렌드가 자리잡을 날도 머지 않았기 때문입니다.
1. 게임 서버
알까기 온라인의 초창기 시절에는 집에서 개인PC 한대를 서버 전용으로 돌렸습니다.
동접이 늘어나서 향후에는 17만원 상당의 서버 호스팅 서비스를 이용했구요.
알까기, 장기, 오목, 탱크가디언까지 4개 온라인 게임을 1대의 서버에서 모두 실행했습니다.
최근에 개발한 치킨팝 온라인은 KT의 클라우드 서비스를 이용하고 있는데 성능은 괜찮습니다만,
KT측의 클라우드 서비스가 죽어서 2번 정도 서비스가 중단되는 사태가 있었습니다.
게임 서버는 윈도우 서버를 사용했고, Visual C/C++를 이용해 서버당 동접 3천명을 처리하도록 개발했습니다.
알까기는 최대 1700명을 기록했고, 장기가 900명, 오목이 250명, 탱크는 150명 수준을 기록했습니다.
게임 서버의 스레드는 이벤트 방식으로 원스레드 방식을 썼습니다.
Z9별이라는 MMORPG를 개발할 당시에는 멀티스레드를 사용했습니다만, 제가 만든 게임들은 모두 턴 게임였기 때문에
필요성이 느껴지지 않아서 그냥 원스레드로 개발했고, 성능에도 아무런 문제가 없었습니다.
2. 데이터 베이스
게임의 DB는 윈도우 서버라서 MS-SQL을 썼습니다.
다만 서버 호스팅 비용보다 MS-SQL 임대 비용이 더 비싼 관계로, 월 6,900원짜리 DB호스팅을 이용했습니다.
그럭저럭 사용할 만한 수준은 됐습니다만, 역시 전용 DB가 없으니 속도상 느린 것은 어쩔 수 없더군요.
DB호스팅을 한 후에, 게임 서버와 ODBC로 연결하여 쿼리를 날렸습니다.
MySQL이 더 편하신 분들은 MySQL을 쓰셔도 아무런 문제가 없습니다.
3. 소켓과 프로토콜
온라인 게임을 만들려면 서버에서 TCP 소켓을 열고 패킷을 주고 받아야 합니다.
제가 자바를 할줄 몰라서 그렇긴 합니다만, 자바로도 충분히 게임 서버를 만들 수 있을걸로 생각됩니다.
게임 서버에서 TCP 소켓을 열고, 패킷을 주고받을 프로토콜이 완성되면
안드로이드 클라이언트에서 서버와의 통신을 위한 스레드를 하나 만듭니다.
게임이 돌아가는 동안에도 네트워크와 계속 통신하면서 데이터를 보내고 받아오고 해야 하기 때문입니다.
socket.setSoTimeout( 60000 );
socket.setTcpNoDelay( true );
서버프로그램은 아주 먼~~~ 옛날 TCP 공부한다고 짜본 몇가지 프로그램이 전부인데...
20년간 네트워킹과는 거의 무관한 일들만 하다가 바야바님 글을 읽고 자신감이 생기네요..^^
좋은글 잘읽었습니다.
서버 한대당 동접 3천명이 정말 놀랍습니다!!
쪽지는 너무 겸손하셨던 것 같네요ㅋ
저는 예제를 컨버트한 수준이라.. 부끄러울따름입니다ㅠ_ㅠ
저도 어서 서버단 시도해봐야겠네요! 불끈불끈!!!
또 겸손하시면 저같은 초짜들은 어쩌나요ㅠ_ㅠㅋ;;
기존에 사용하고 계신 서버로 랭킹 테이블이나 로그인유저 테이블에
우선 간단하게 [사용자ID/점수]만 저장하고, 불러오시는게 가장 빠르고 비용이 적게 드는 방법인 것 같습니다.
(사용하시던 방식 그대로 쿼리문 날리시면 됩니다.
한참 초짜인 제가 감히 말씀드리기 부끄럽네요;;;; 왠지 이미 알고계신걸 제가 말해버리는 것 같아서;;;;)
출력부는 리스트.
리스트 방식도 익히 알고계시듯 최적화 빼면 그리 어려운 것이 아니니,
보여주기는 저처럼 리스트 이용하시면 편하긴 하실테구요. (저는 이상하게 컨트롤을 잘 못써서 여기서 엄청헤맸습니다;;;)
하지만 역시 직접 그리는게 로망이죠^^; (리스트 쓰면 xml 전환에 리소스 더 먹습니다.ㅠ_ㅠ)
혹시 다른 이유로 기존 서버연동 대신, 웹서버 방식을 고려하신다면,
아까 말씀드린 옆동네에서 '웹서버 연동' 키워드로 검색해보시면 예제가 나옵니다ㅋ
저도 해당 예제를 보고 도움받았구요. (컨트롤 관련해서도 배우고, 이것저것 쓸데없는 것도 많이 알게되었네요ㅋ)
웹서버 방식은
아까 말씀드렸듯, 네이버 접속요청시, 네이버 화면이 뜨고, 각종 링크 및 플래시배너가 뜨는 것과 같은 원리입니다.
즉, 웹(http)에 접속하고, 웹이 리턴하는 화면(데이터)을 긁어오는 방식입니다.
말그대로 HTTP 구조를 따르는 방식이죠.
뭔가 아까랑 똑같은 말만 했네요;;
완성하시면 꼭 보여주세요ㅋ
저는 며칠전 런칭한 신작이 제대로 반응이 없어서=_=;; 여태 고주망태 놀았습니다.
다시 정신차리고 신작 개발 들어가야겠네요ㅎㅎ
바야바님 글 감사히 보고 힘얻고 갑니다.
방화벽 같은 문제는 없었나요?
폰이 집에 있는 WiFi 공유기를 통해 접근하는 경우도 있을텐데
이럴때 방화벽 문제가 생기지는 않는지 해서요
80 포트로 통신하면 되나요 ;;;
앗 이글이 여기 있었네요.
바야바님의 다른 게임개발 글들은 개발자 게시판에 있어서
"바야바님 온라인게임 개발글을 어디서 봤는데?" 하면서 한참 해맸네요.
저번 모임때 얘길듣고 온라인게임 부분유료화로 기획중입니다.
어찌 만들어갈지 앞이 캄캄하네요.
오우 이런 노하우를 올려주시다니..ㅎㅎ 좋은 글 감사드립니다^^