【发布时间】:2021-12-01 07:54:48
【问题描述】:
(解决方案在最后)
我有一个瓦片地图,它可以根据我存储在字典中的数据按位置传播到相邻的瓦片。
虽然检查很快就完成了,但它确实需要相当多的资源,导致我每次调用函数时都会出现延迟。
目前,我通过每次完成循环迭代时实际等待一点来确保代码不会执行得太快。虽然我可以接受我的代码没有尽可能快地执行,但这并不是正确的方法。
所以基本上:有没有办法限制单一脚本/函数在 unity/c# 中的执行不使用超过一定百分比的游戏资源(或类似的东西)?或者也许有一种方法可以显着提高我找不到的功能性能?
提前致谢!
解决方案
感谢来自Michael Urvan 和akaBase 的伟大建议,我能够通过使用块大大提高性能。我无法实施所有建议的改进,因此请查看(并投票)他们各自的答案以获得更高的性能。
如何:我每隔几秒重置一个布尔值。设置该布尔值后,我循环遍历Update()-方法中的部分必要图块(块)并记住下一个Update()-调用的最后一个索引。当我到达 tile-list 的末尾时,我就完成了,可以将 bool 设置为 false 并重置索引。
这是我完成的代码的简化版本:
{
[SerializeField] private Tilemap tilemap;
[SerializeField] private List<TileType> tileTypes;
[SerializeField] private List<TileType> growthTileTypes;
private Dictionary<Vector3Int, TileData> tileDataByPosition;
private List<TileData> spreadingTileDatas;
private Dictionary<TileBase, TileType> tileTypeByTile;
private bool spreading;
private spreadIndex = 0;
private int chunkSize = 10;
private void Awake()
{
// set up stuff here
InvokeRepeating("ResetSpreading", 10, 10);
}
private void Update()
{
if (spreading == true)
{
Spread();
}
}
private void Spread()
{
for (
int index = spreadIndex;
index < spreadingTileDatas.Count && index < spreadIndex + chunkSize;
index++
)
{
// do stuff here
}
spreadIndex += chunkSize;
if (spreadIndex >= spreadingTileDatas.Count)
{
spreadIndex = 0;
spreading = false;
}
}
}
【问题讨论】: