我正在制作一个3D游戏。在游戏中,我有一个在空间中有位置的实体列表。
仅绘制屏幕上或相机半径内的实体的最佳方法是什么?
例如,如果我有 100,000 个实体,那么其中可能有 10 个将在给定时间出现在屏幕上。遍历整个数组并拥有一个:
if(entity.position.x > (camera.x-radius) || entity.position.x < (camera.x+radius)|| ..y..z)
draw(); // or update
也许你应该用八叉树划分你的空间。您必须分配/维护八叉树单元格中的对象。通过这样的结构,您可以快速找到必须渲染哪些八叉树单元格,然后在这些单元格中渲染实体。
这可能并不明显实现,但您可能会获得更好的性能!如果对象可能移动,这就更难了:您必须保持八叉树是最新的,而不需要遍历所有实体。
这取决于您使用的相机类型和视图。有几种可能性:
您可以使用视图矩形并测试对象的边界矩形是否与视图矩形相交。
您可以使用视锥体(锥形体积)并测试每个对象的边界框是否与视锥体相交。