Unity 2017.2 타일 맵의 크기 제한은 무엇입니까? 인스턴스화되어 런타임에 Tilemap 메쉬에서 쿼드를 텍스처링하는

Unity 2017.2의 Tilemap 기능에 대한 설명서를 파고 들었습니다.

Unity가 특정 타일 맵 메시에 대해 지원할 최대 타일 수를 제한합니까?

각 타일은 한 번 인스턴스화되어 런타임에 Tilemap 메쉬에서 쿼드를 텍스처링하는 데 사용되므로 메쉬 쿼드 수 제한은 궁극적으로 하드웨어에 따라 다르며 다소 많거나 적습니다.

이것이 올바른 가정입니까, 아니면 엔진에 하드 캡이 있습니까?



답변

RAM이 한계 입니다.

이러한 사양의 시스템에서 다음 테스트가 수행되었습니다.

  • 인텔 i5-6600
  • 16GB RAM
  • NVIDIA GeForce GTX 1070
  • Windows 7 Home Premium

다음은 타일 맵을 단일 타일 (32×32 픽셀)로 채워서 타일 맵을 자라는 스크립트입니다. 이 메소드 Grow()는 다른 맵과 다른 행을 현재 맵에 추가합니다. 이 메소드는 각 업데이트마다 100 번 호출됩니다.

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 

    public int currentSize;


    void Start () {
       tilemap = GetComponent<Tilemap>;
        Grow();
    }

    void Update() {

        for (var i = 0; i < 100; i++) {
            Grow();
        }
        Debug.Log(currentSize);        
    }

    private void Grow() {
        for (int x = 0; x < currentSize; x++) {
            tilemap.SetTile(new Vector3Int(x, currentSize, 0), tile);
        }
        for (int y = 0; y < currentSize; y++) {
            tilemap.SetTile(new Vector3Int(currentSize, y, 0), tile);
        }
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);

        currentSize++;
    }
}

몇 분 후 컴퓨터에 메모리가 부족해 Unity가 충돌했습니다. 이 시점에서 타일은 8400×8400 (70 million) 타일이었고 작업 관리자에 따르면 Unity.exe는 11GB의 RAM을 약간 초과했습니다.

하지만 희소 맵은 어떻습니까?

다음은 x 및 y 좌표를 100 타일 단위로 증가시키는 단일 타일을 배치 한 다른 스크립트입니다.

public class TileTest : MonoBehaviour {

    public Tile tile;
    private Tilemap tilemap; 
    public int currentSize;


    void Start () {
        tilemap = GetComponent<Tilemap>();
    }

    void Update() {
        tilemap.SetTile(new Vector3Int(currentSize, currentSize, 0), tile);
        currentSize+= 100;
    }    
}

실제로 Unity.exe의 메모리 사용량은 거의 증가하지 않았으므로 빈 타일 세트 셀에는 거의 RAM이 필요하지 않습니다. 그러나 타일셋이 성장함에 따라 FPS는 계속 떨어졌습니다. 30000×30000에서 60Fps, 60000×60000에서 30Fps, 90000×90000에서 15Fps를 기록했습니다. 테스트 게임이 실행되는 동안 스크립트를 제거했을 때 Fps는 낮게 유지되었습니다. 따라서이 둔화는 타일 맵을 변경 한 것이 아닙니다. 단순히 렌더링 한 것이 었습니다. 따라서 거대한 오픈 월드 게임을 만들려면 런타임에 만들고 파괴하는 여러 개의 작은 타일 맵을 사용해야 할 수도 있습니다.

결론 : 거대하지만 대부분 비어있는 타일 맵은 많은 RAM을 사용하지 않지만 대부분 카메라 뷰포트에 있지 않더라도 렌더링 병목 현상이 발생 합니다.

그런 다음 주어진 크기의 타일 맵을 생성하는이 스크립트를 실험했습니다.

public class TileTest : MonoBehaviour {

    public Tile tile;
    public int xSize;
    public int ySize;

    void Start () {
        Tilemap tilemap = GetComponent<Tilemap>();

        for (int x = 0; x < xSize; x++) {
            for (int y = 0; y < ySize; y++) {
                tilemap.SetTile(new Vector3Int(x, y, 0), tile);
            }
        }
    }
}

이 스크립트를 사용하여 8192×8192 맵을 생성했습니다. 몇 분이 걸렸지 만 스크립트가 완료되면 꾸준한 95Fps에서 실행되었습니다.

결론 : 최소한 게임용 PC에서는 수백만 개의 타일이있는지도를 사용할 수 있습니다.