我的CSV包含以下列:time
,carId
,x
,y
。我正在编写一个脚本,它将读取CSV并生成汽车对象,并根据数据随时更新其位置。
在大约20分钟的时间内,必须实例化大约3500辆汽车对象。虽然他们不会在某个时间点进入模拟(一旦汽车到达我的公路网中的某些点,它就会消失),但我想为数百个汽车物体移动的情况做好准备立刻通过网络。
在优化这个大型项目时,我仍然是Unity及其渲染管道的新手。我知道在某些情况下,与setActive(false)
相比,游戏对象destroy()
更好,也许这就是其中之一。在Unity中处理这么多游戏对象时我还应该考虑什么?
答案 0 :(得分:2)
这听起来像是使用对象池的绝佳机会。使用setActive您正走在正确的轨道上。
请遵循以下简短教程:https://unity3d.com/learn/tutorials/topics/scripting/object-pooling
它应该通过实例化/销毁大量对象来减少很多延迟。
答案 1 :(得分:2)
在处理这么多游戏对象时我还应该考虑什么 统一?
在大多数情况下,这实际上取决于将在屏幕上同时显示的对象或汽车的数量。
如果只有少量汽车,则使用Object Pooling来回收对象。
您还应该使用LOD来优化和减少为对象渲染的三角形数量。
如果是同时运行数百辆汽车的交通模拟,那么您应该使用现在内置于Unity中的GPU Instancing。要启用GPU,请使用标准着色器并检查"启用GPU实例化"框。
在素材上启用后,您可以使用Graphics.DrawMeshInstanced
来实例化对象,MaterialPropertyBlock
可以更改它们的外观。