Unity 2017.2 타일 맵의 크기 제한은 무엇입니까?


17

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

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

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

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


1
왜 공감해야합니까? 이것은 합법적 인 질문입니다.
Philipp

답변:


25

RAM이 한계 입니다.

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

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

다음은 타일 맵을 단일 타일 (32x32 픽셀)로 채워서 타일 맵을 자라는 스크립트입니다. 이 메소드 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가 충돌했습니다. 이 시점에서 타일은 8400x8400 (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는 계속 떨어졌습니다. 30000x30000에서 60Fps, 60000x60000에서 30Fps, 90000x90000에서 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);
            }
        }
    } 
}

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

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


5
이것은 내가 오랫동안 본 가장 아름다운 답변입니다. "알아 보자!" 시스템을 망치는 스크립트를 작성 합니다. 스크립트 컴퓨터가 담배를 피우기 시작 합니다. 감사합니다 @Philipp!
Stephan

8192 ^ 2 테스트 생성 중 프레임 속도는 얼마입니까? 세대의 노력이 시스템을 얼마나 많이 멈췄는지 궁금합니다.
Stephan

1
@ 스테판 제로 FPS. 내가 말했듯이, 세대는 몇 분이 걸립니다. 그리고이 스크립트는 Update생성하는 동안-메소드로 남지 않기 때문에 게임과 Unity 에디터는 생성이 완료 될 때까지 정지됩니다. 맵 생성 중에 게임이 반응하도록하려면 생성을 코 루틴으로 이동하여 한 번에 하나의 청크를 생성하고 그 사이에서 생성합니다.
Philipp

@Stephan 그리고 그런데, 그것은 사용에 더 빠를 수 SetTilesBlock 한 번에 모든 타일을 설정할 수 있습니다. 그러나 테스트 맵을 신속하게 생성하는 것이 나의 목표가 아닙니다.
Philipp

오! 응, 알았어 어떤 이유로 나는 그것이 중단 될 것이라고 생각했습니다. 흥미로운 생각입니다. 이번 주말에 함께 놀아 볼게요. 이 기능은 아직 완전히 새로운 기능을 수행 한 이후로 끔찍한 결과가 전혀없는 것 같습니다. 철저한 답변 감사합니다! 이미 많은 주목을 받았습니다. 후손을 돕는!
Stephan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.