1.5Gb에 도달하면 앱이 다운됩니다.
이것은 각 타일의 크기가 ~ 80 바이트임을 의미하므로 타일을 올바르게 표현하지 않는 것이 좋습니다.
당신이 이해해야 할 것은 타일 의 게임 플레이 개념과 사용자가 보는 시각적 타일 사이에 분리가 필요하다는 것 입니다. 이 두 개념은 같은 것이 아닙니다 .
Terraria를 예로 들어 보겠습니다. 가장 작은 Terraria 세계는 4200x1200 타일 (5 백만 타일)을 차지합니다. 이제 세상 을 나타내는 데 얼마나 많은 메모리가 필요 합니까?
각 타일에는 전경 레이어, 배경 레이어 (배경 벽), 와이어가있는 "와이어 레이어"및 가구 항목이있는 "가구 레이어"가 있습니다. 각 타일은 얼마나 많은 메모리를 차지합니까? 다시, 우리는 시각적으로가 아니라 개념적으로 이야기하고 있습니다.
포 그라운드 타일은 서명되지 않은 쇼트에 쉽게 저장 될 수 있습니다. 전경 타일 유형은 65536 개를 넘지 않으므로 이보다 더 많은 메모리를 사용하는 데는 아무런 의미가 없습니다. 배경 타일의 256 개 미만의 유형의 배경 타일이 있기 때문에 배경 타일은 부호없는 바이트에 쉽게있을 수 있습니다. 와이어 레이어는 순전히 바이너리입니다. 타일에 와이어가 있거나없는 와이어입니다. 타일 당 1 비트입니다. 그리고 가구 층은 얼마나 많은 다른 가구가 있는지에 따라 다시 부호없는 바이트가 될 수 있습니다.
타일 당 총 메모리 크기 : 2 바이트 + 1 바이트 + 1 비트 + 1 바이트 : 4 바이트 + 1 비트 따라서 작은 Terraria 맵의 총 크기는 20790000 바이트 또는 ~ 20MB입니다. (참고 :이 계산은 Terraria 1.1을 기반으로합니다. 그 이후로 게임이 크게 확장되었지만 현대 Terraria조차도 타일 위치 당 8 바이트 또는 ~ 40MB까지 수용 할 수 있습니다.
이 표현을 C # 클래스의 배열로 저장 해서는 안됩니다 . 정수 또는 이와 유사한 배열이어야합니다. AC # 구조체도 작동합니다.
이제 지도의 일부 를 그릴 때가되자 (강조를 주목하십시오) Terraria는 이러한 개념적 타일을 실제 타일 로 변환해야합니다 . 각 타일은 실제로 전경 이미지, 배경 이미지, 선택적인 가구 이미지를 선택하고 와이어 이미지를 가져야합니다. XNA는 다양한 스프라이트 시트 등을 제공합니다.
당신이해야 할 일은 개념적지도의 보이는 부분을 실제 XNA 스프라이트 시트 타일로 변환하는 것입니다. 한 번에 전체 내용 을 변환하려고하면 안됩니다 . 저장하는 각 타일은 "I는 타일 유형 X입니다"라는 색인이어야합니다. 여기서 X는 정수입니다. 정수 인덱스를 사용하여 표시 할 스프라이트 를 가져옵니다 . 또한 XNA의 스프라이트 시트를 사용하여 개별 쿼드를 그리는 것보다 빠르게 수행 할 수 있습니다.
이제 타일의 보이는 영역을 다양한 청크로 분할해야하므로 카메라가 움직일 때마다 스프라이트 시트를 지속적으로 작성하지 않아도됩니다. 따라서 스프라이트 시트로 64x64 청크가있을 수 있습니다. 플레이어의 현재 카메라 위치에서 볼 수있는 64x64 청크 중 어느 것이 든 청크입니다. 다른 청크에는 스프라이트 시트도 없습니다. 청크가 화면에서 떨어지면 해당 시트를 버리게됩니다 (참고 : 실제로 삭제하지는 않습니다. 나중에 보관할 수있는 새 청크에 대해 보관하고 다시 지정하십시오).
최소한 서버 앱 (및 가능한 경우 클라이언트)에서 전체 맵을 처리하고 싶습니다.
귀하의 서버가 알거나 타일의 시각적 표현에 대해 신경 쓸 필요가 없습니다. 신경 써야 할 것은 개념적 표현입니다. 사용자는 여기에 타일을 추가하므로 해당 타일 색인을 변경합니다.