Unity 2017.2 Tilemap的大小限制是多少?


17

我一直在研究Unity 2017.2的Tilemap功能的文档。

Unity是否会限制将为特定tilemap网格支持的最大tile数量?

我知道每个图块都实例化一次,并在运行时用于纹理化Tilemap网格上的四边形,因此我猜想网格四边形的数量限制最终取决于硬件,或多或少都很高。

这是正确的假设,还是引擎上有严格的上限?


1
为什么要下票?这是一个合理的问题。
菲利普

Answers:


25

RAM是您的极限

在具有这些规格的系统上执行了以下测试:

  • 英特尔i5-6600
  • 16 GB RAM
  • NVIDIA GeForce GTX 1070
  • Windows 7家庭高级版

这是我运行的脚本,该脚本通过用单个图块(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(7000万)的图块,Unity.exe消耗的RAM略高于11 GB。

好吧,但是稀疏地图呢?

这是一个不同的脚本,该脚本将单个图块放置在以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的内存占用量几乎没有增加,这表明空的tileet单元几乎不需要RAM。但是,随着拼贴的增长,FPS持续下降。它在30000x30000时达到60 Fps,在60000x60000时达到30 Fps,在90000x90000时达到15 Fps。当我在测试游戏运行时删除脚本时,Fps保持如此低的水平。因此,这种变慢并非来自更改图块图。仅仅是从渲染它而已。因此,当您要创建一个非常庞大的开放世界游戏时,可能必须使用在运行时创建和销毁的多个较小的tilemap。

结论:巨大但几乎为空的图块贴图并不会占用太多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!
Stephan

生成8192 ^ 2测试期间的帧速率是多少?我很好奇,一代人的努力使系统陷入瘫痪。
斯蒂芬

1
@Stephan零FPS。正如我所说,这一代需要花费几分钟。并且由于该脚本Update在生成过程中并未保留其-方法,因此游戏和Unity编辑器将冻结,直到生成完成为止。如果您希望游戏在地图生成过程中响应,请将生成的图像移至协程中,协程一次生成一个块并在它们之间产生收益。
菲利普

@Stephan顺便说一句,使用SetTilesBlock一次设置所有图块可能会更快。但是,快速生成测试图并不是我的目标。
菲利普

哦! 好的 由于某种原因,我认为它会中断。这是一个有趣的想法。这个周末我必须去玩。自从这项功能如此新以来,似乎还没有取得很多令人惊奇的结果。感谢您的彻底答复!它已经引起了很多关注。帮助后代!
Stephan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.