包含此页的版本:
不含此页的版本:
通过使用高效的查询版本和批处理来优化物理查询性能并减少垃圾回收开销。
标准物理查询,例如Physics.Raycast,Physics.SphereCast或Physics.OverlapSphere,为其结果在堆上分配内存。此分配可能会导致垃圾回收暂停,尤其是在频繁调用垃圾回收时。
相反,请使用这些查询的非分配对应项,这些查询将其结果写入您提供的预分配数组中。非分配对应物可以包括:
例如:
int hitCount = Physics.RaycastNonAlloc(ray, preAllocatedHitsArray, distance, layerMask);
使用非分配查询时,必须提供预分配的数组。例如RaycastHit[] preAllocatedHitsArray = new RaycastHit[10];.
适当调整此数组的大小:使其足够大,以便在典型方案中捕获最大预期命中数,但又不会大到浪费内存。如果实际的数量碰撞体 用于处理对象物理碰撞的不可见形状。碰撞体不需要与对象的网格体形状完全相同 - 在游戏中,粗略的近似值通常更有效且难以区分。更多信息
请参阅术语表found 超出缓冲区数组的大小,则仅返回数组容量以下的结果,其余的将被忽略。
提示:选择平衡典型需求与内存考虑因素的缓冲区大小。分析您的游戏以了解常见的命中计数。
运行许多单独的物理查询(例如,每帧多个光线投射)可能会降低性能,因为每次调用的开销。如果您需要同时执行多个查询,请使用 API 对它们进行批处理,例如RaycastCommand,SpherecastCommand或BoxcastCommand结合作业系统。
这种方法利用多线程并行处理查询,显着提高批量查询作的性能。当您有许多可以并行处理的独立光线投射(或其他查询)时,这尤其强大。
若要使用批量查询,请执行以下步骤:
NativeArray<RaycastCommand>替换为所有光线投射的参数。NativeArray<RaycastHit>以存储结果。RaycastCommand.ScheduleBatch,它返回一个JobHandle.jobHandle.Complete在访问结果之前。例如,确保作业在下一帧开始时或需要时完成。