Unity 2017.2タイルマップのサイズ制限は何ですか?


17

Unity 2017.2のタイルマップ機能に関するドキュメントを掘り下げてきました。

Unityは、特定のタイルマップメッシュでサポートするタイルの最大数を制限していますか?

各タイルは1回インスタンス化され、実行時にTilemapメッシュのクワッドをテクスチャリングするために使用されることを知っているので、メッシュクワッドカウントの制限は最終的にハードウェアに依存し、多かれ少なかれ任意に高くなると思います。

それは正しい仮定ですか、それともエンジンにハードキャップがありますか?


1
なぜ下票なのか?これは正当な質問です。
フィリップ

回答:


25

あなたのRAMはあなたの限界ですです。

次のテストは、これらの仕様を持つシステムで実行されました。

  • Intel i5-6600
  • 16 GB 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ミリオン)のタイルであり、タスクマネージャーによるとUnity.exeは11 GBをわずかに超えるRAMを消費していました。

まあ、しかしまばらなマップはどうですか?

以下は、100タイル単位で増加するxおよびy座標に単一のタイルを配置する別のスクリプトです。

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で60 Fps、60000x60000で30 Fps、90000x90000で15 Fpsに達しました。テストゲームの実行中にスクリプトを削除しても、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マップを生成しました。数分かかりましたが、スクリプトが完了すると、安定した95 Fpsで実行されました。

結論:少なくともゲーム用PCでは、数百万のタイルを含むマップが実現可能です。


5
これは私が長い間見た中で最も美しい答えです。"確認してみましょう!" システムを 実行 するスクリプトをハンマーに書き込み、スクリプトコンピューターが喫煙を開始します。ありがとう@Philipp!
ステファン

8192 ^ 2テストの生成中のフレームレートはどのくらいでしたか?世代の努力がどれほどシステムを動かなくなったのか不思議です。
ステファン

1
@Stephan Zero FPS。先ほど言ったように、生成には数分かかります。そして、このスクリプトはUpdate生成中に-methodのままにならないため、生成が完了するまでゲームとUnityエディターはフリーズします。マップの生成中にゲームをレスポンシブにしたい場合は、生成をコルーチンに移動します。コルーチンは一度に1つのチャンクを生成し、それらの間で処理を行います。
フィリップ

@Stephanそして、ところで、SetTilesBlockを使用してすべてのタイルを一度に設定する方が高速かもしれません。しかし、ここでテストマップをすばやく生成することは私の目標ではありませんでした。
フィリップ

ああ!当たり前。何らかの理由で、それが中断すると思っていました。それは興味深い考えです。今週の週末にそれをいじる必要があります。この機能が新しくなって以来、この機能に関する結果はまだそれほど多くないようです。徹底的な対応ありがとうございます!すでに多くの注目を集めています。後世を助ける!
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.