1

我正在制作一个3D游戏。在游戏中,我有一个在空间中有位置的实体列表。

仅绘制屏幕上或相机半径内的实体的最佳方法是什么?

例如,如果我有 100,000 个实体,那么其中可能有 10 个将在给定时间出现在屏幕上。遍历整个数组并拥有一个:

if(entity.position.x > (camera.x-radius) || entity.position.x < (camera.x+radius)|| ..y..z)
   draw(); // or update
4

3 回答 3

1

也许你应该用八叉树划分你的空间。您必须分配/维护八叉树单元格中的对象。通过这样的结构,您可以快速找到必须渲染哪些八叉树单元格,然后在这些单元格中渲染实体。

这可能并不明显实现,但您可能会获得更好的性能!如果对象可能移动,这就更难了:您必须保持八叉树是最新的,而不需要遍历所有实体。

于 2013-03-05T20:44:18.480 回答
1

这称为View Frustum Culling这是一篇带有源代码的深入文章,

我还找到了另一篇类似的文章

于 2013-03-05T22:01:39.153 回答
1

这取决于您使用的相机类型和视图。有几种可能性:

2D 视图或自上而下的地形

您可以使用视图矩形并测试对象的边界矩形是否与视图矩形相交。

3D 视图或透视图

您可以使用视锥体(锥形体积)并测试每个对象的边界框是否与视锥体相交。

于 2013-03-05T22:08:56.143 回答