我正在制作3D游戏。在游戏中,我有一个在空间中有位置的实体列表。
仅绘制屏幕上或相机半径范围内的实体的最佳方法是什么?
例如,如果我有100,000个实体,那么它们中的10个将在给定时间出现在屏幕上。迭代整个数组并有一个:
是一种浪费if(entity.position.x > (camera.x-radius) || entity.position.x < (camera.x+radius)|| ..y..z)
draw(); // or update
答案 0 :(得分:1)
也许你应该用八叉树划分你的空间。您必须在八叉树单元格中分配/维护对象。使用这种结构,您可以快速找到必须渲染的Octree单元格,然后在这些单元格内渲染实体。
这可能并不明显,但你可能会获得更好的表现!如果对象可能移动,则更难:您必须使八叉树保持最新而不迭代所有实体。
答案 1 :(得分:1)
这称为查看Frustum Culling 。这是深度article with source code,
我还找到了另一种选择,similar article。
答案 2 :(得分:1)
这取决于您使用的相机和视图的类型。有几种可能性:
您可以使用视图矩形并测试对象的边界矩形是否与视图矩形相交。
您可以使用视锥体(锥形体积)并测试每个对象,无论边界框是否与平截头体相交。