요즘 저는 회사를위한 새로운 MMORPG 모바일 게임의 아키텍처를 설계하려고합니다. 이 게임은 Mafia Wars, iMobsters 또는 RISK와 유사합니다. 기본 아이디어는 상대방 (온라인 사용자)과 싸울 군대를 준비하는 것입니다.
이전에 여러 모바일 앱에서 작업 한 적이 있지만 이것은 새로운 것입니다. 많은 어려움을 겪은 후, 나는 고급 흐름도를 통해 설명 된 아키텍처를 생각해 냈습니다.
우리는 클라이언트-서버 모델로 가기로 결정했습니다. 서버에 중앙 집중식 데이터베이스가 있습니다. 각 클라이언트에는 자체 로컬 데이터베이스가 있으며 서버와 동기화 상태를 유지합니다. 이 데이터베이스는 자주 변경되지 않는 사항 (예 :지도, 제품, 인벤토리 등)을 저장하기위한 캐시 역할을합니다.
이 모델을 사용하면 다음 문제를 해결하는 방법을 잘 모르겠습니다.
- 서버와 클라이언트 데이터베이스를 동기화하는 가장 좋은 방법은 무엇입니까?
- 이벤트를 서버로 업데이트하기 전에 로컬 DB에 저장해야합니까? 중앙 DB에 변경 사항을 저장하기 전에 어떤 이유로 앱이 종료되면 어떻게됩니까?
- 간단한 HTTP 요청이 동기화 목적에 도움이됩니까?
- 현재 로그인 한 사용자를 확인하는 방법 (한 가지 방법은 클라이언트가 x 분마다 서버에 요청을 계속 보내서 활성화되었음을 알리는 것입니다. 그렇지 않으면 클라이언트가 비활성화 된 것으로 간주합니다).
- 클라이언트 측 유효성 검사가 충분합니까? 그렇지 않은 경우 서버가 무언가를 검증하지 않으면 조치를 되 돌리는 방법은 무엇입니까?
이것이 효율적인 솔루션인지 어떻게 확장되는지 확실하지 않습니다. 이미 그러한 앱에서 일한 사람들이 자신의 경험을 공유하여 더 나은 무언가를 생각 해낼 수 있다면 정말 감사하겠습니다. 미리 감사드립니다.
추가 정보:
클라이언트 쪽은 marmalade라는 C ++ 게임 엔진에서 구현됩니다. 크로스 플랫폼 게임 엔진으로 모든 주요 모바일 OS에서 앱을 실행할 수 있습니다. 우리는 확실히 스레딩을 달성 할 수 있으며 이는 흐름도에 설명되어 있습니다. 서버에는 MySQL을, 클라이언트에는 SQLite를 사용할 계획입니다.
이것은 턴 기반 게임이 아니므로 다른 플레이어와의 상호 작용이 많지 않습니다. 서버는 온라인 플레이어 목록을 제공하며 전투 버튼을 클릭하여 전투를 벌일 수 있으며 일부 애니메이션 후에 결과가 발표됩니다.
데이터베이스 동기화를 위해 두 가지 솔루션을 염두에 두십시오.
- 각 레코드의 타임 스탬프를 저장하십시오. 또한 로컬 DB가 마지막으로 업데이트 된시기를 추적하십시오. 동기화 할 때 타임 스탬프가 더 큰 행만 선택하고 로컬 DB로 보냅니다. 삭제 된 행에 대해 isDeleted 플래그를 유지하면 모든 삭제가 단순히 업데이트로 작동합니다. 그러나 모든 동기화 요청에 대해 전체 DB를 스캔하고 업데이트 된 행을 찾아야하는 성능에 대해 심각한 의문이 있습니다.
- 다른 기술은 사용자에 대해 발생하는 각 삽입 또는 업데이트에 대한 로그를 유지하는 것입니다. 클라이언트 앱이 동기화를 요청하면이 테이블로 이동하여 업데이트 또는 삽입 된 테이블의 행을 찾으십시오. 이 행이 클라이언트로 성공적으로 전송되면이 로그를 제거하십시오. 그러나 사용자가 다른 장치를 사용하면 어떻게 될지 생각합니다. 로그 표에 따르면 해당 사용자에 대한 모든 업데이트가 전송되었지만 실제로는 다른 장치에서 수행되었습니다. 따라서 장치도 추적해야 할 수도 있습니다. 이 기술을 구현하는 데 시간이 오래 걸리지 만 첫 번째 기술을 수행하는지 확실하지 않습니다.