약
이것들은 실제로 하나의 두 가지 질문입니다. 우선 많은 양의 타일 데이터를 효율적으로 저장하는 방법을 찾고 있습니다. 다른 양상은 데이터 세트를 질의하고 타일을 디스플레이하는 것을 다룬다. 먼저 배경을 알려 드리겠습니다.
우리는 CraftyJS 라이브러리를 사용하여 브라우저 기반 멀티 플레이어 타이쿤 게임을 Canvas로 렌더링하고 있습니다. GUI의 배경에서 우리는 PHP에서 Yii Framework를 실행하고 있으며 모두 Python 랜덤 맵 생성기 및 게임 엔진에 연결됩니다.
첫 번째 대략적인 맵 렌더링 모양입니다. http://i.imgur.com/khAXtl.png
지도 데이터 저장
게임 세계는 게임이 시작될 때마다 무작위로 생성됩니다. 크기는 각 플레이어마다 100x100 육각형 타일입니다. 즉, 3 인 게임에는 90.000 개의 타일이 만들어집니다. 현재는지도를 렌더링하는 JavaScript 배열을 만듭니다.
렌더링에는 효과가 있지만 맵과의 모든 상호 작용을 위해 타일을 소유 한 플레이어, 타일 위에 어떤 종류의 구조, 현재 가격 등을 저장해야합니다. 처음에는 최소한 프로토 타입을 위해 MySQL을 사용하고 싶었지만 테스트를 마친 후에는 원하는 속도만큼 빠르지 않았습니다. 아마도 MongoDB와 같은 객체 저장소가 SQL 테이블 대신 타일 데이터를 저장하는 데 더 적합 할 것입니다. 아니면 다른 것?
지도 표시
내가 본 또 다른 문제는지도를 움직이는 것입니다. 현재 뷰포트에 있지 않더라도 각 타일에 Crafty 엔티티를 만들고 있습니다. Crafty는 뷰포트에있는 것만 렌더링하지만 각 렌더링 이벤트의 모든 타일을 저장하고 반복 할 수 있기 때문에 속도가 느립니다. 내가 현재 가지고있는 것은 그려진 속도가 느린 느린 맵으로, 움직일 때 매우 느리게 움직이며, 이제는 재생 가능하게 만들고 싶습니다.
첫 번째 아이디어는 뷰포트에있는 타일의 표시된 서브 세트를로드하는 것입니다. 그러나 플레이어가 뷰포트를 빈 공간으로 옮길 때 서버를 쿼리하고 응답을 다시 기다려야 만 맵을 렌더링 할 수 있습니다. 기본 응용 프로그램에서는 문제가 없지만 웹 게임에서는 게으르다.
맵에서 원활한 성능을 얻는 방법은 더 큰 타일의 하위 집합을 자바 스크립트 배열로 미리로드하여 캐시로 사용할 수 있습니다. 플레이어는 몇 개의 화면을 "캐시"하고 뷰포트를 이동할 때 더 많은 타일을 JS "캐시"에로드합니다.
올바른 방향으로 가고 있습니까? 비슷한 일을 한 사람에게서 더 많은 정보를 얻고 싶습니다. 저는 게임 개발에 익숙하지 않지만 지난 몇 주 동안 많은 출처를 살펴 보았습니다.