我正在制作一个基于 2d 瓷砖的游戏。我的一些测试级别很少有瓷砖,有些有 500,000 用于测试目的。运行 Visual Studio 附带的性能分析器会显示瓶颈:
需要这么长时间的确切原因是什么?我该如何避免这种情况?
UPD:没关系,我只是遍历整个数组,而不是仅遍历约 200 个可见图块。
我正在制作一个基于 2d 瓷砖的游戏。我的一些测试级别很少有瓷砖,有些有 500,000 用于测试目的。运行 Visual Studio 附带的性能分析器会显示瓶颈:
需要这么长时间的确切原因是什么?我该如何避免这种情况?
UPD:没关系,我只是遍历整个数组,而不是仅遍历约 200 个可见图块。
.Visible 是一个属性。要了解为什么这是一个瓶颈,您需要查看该 getter 的实现。虽然它看起来只是一个简单的布尔值,但它在幕后可能很复杂。
并不是说评估每个单独的 Visibility 属性/字段会花费很多时间-而是您要执行 500k 次-它加起来。由于这是分析器估计的瓶颈,这意味着绝大多数项目已Visibility
设置为 false - 否则您会假设Draw()
方法调用将显示为瓶颈。优化这一点的一种方法是分离可见项目并仅对其进行迭代。
500k是典型场景吗?请记住,根据您的实际需求,复杂性会有很大差异。
如果你真的必须处理 500k 块,我会有第二个可见块列表,或者一个包含这些可见块的数组索引的整数列表。
为查找具有特定属性的对象而进行的顺序检查意味着运行“n”次迭代的最坏情况,其中“n”是记录总数。这无疑是一个瓶颈。
您可能希望单独保留一组可见项目。