绘制多个相同对象的最有效方法是什么?

9
我想制作一个由许多立方体组成的游戏,并计划将其发布在移动平台和使用WebGL的Web上。我的问题是,每个立方体调用drawelements时会影响帧速率。有没有办法通过单个绘图调用来绘制它们?立方体之间唯一的区别是位置和颜色。

魔方的位置相对于彼此会随时间改变吗? - LarsH
它们可能会随时间而变化,因为我想要可摧毁的物体。 - Xavier
参见:https://dev59.com/F2ox5IYBdhLWcg3wNRxj - jwrush
3个回答

4
我也遇到了同样的问题。昨天我问了类似的问题并自己回答了它。请看这个链接:Efficient way of drawing in OpenGL ES。您需要创建顶点缓冲区并仅使用gl.bufferData将其上传到图形卡内存一次。然后每次执行gl.drawElements或gl.drawArrays时使用对该缓冲区的引用。在下一次3D场景内容更改之前,您可以使用已上传到图形卡内存中的此缓冲区。

0

按照UITableView的模型来处理单元格的重用。建立一个对象,跟踪你已经绘制的对象并将它们与标识符链接起来。然后,你可以通过该标识符简单地重用它们。如果你知道你要绘制许多相同对象的版本,请使用该对象来最小化渲染/分配。


0
如果您正在使用顶点数组进行glDrawElements(),我建议改用顶点缓冲对象。这将在服务器端(GRAM)而不是客户端(系统RAM)存储数据。这样,您可以使用更少的CPU<->GPU数据传输开销调用glDrawElements()。
或者,您可以将立方体存储在显示列表中。这样,您可以使用glTranlate()移动一个立方体,然后只需调用显示列表即可呈现它。使用显示列表的唯一注意事项是,您在显示列表中所做的任何操作都是不可变的;您无法更改显示列表中的调用而不完全重新编译它。

2
OpenGL ES不支持显示列表。 - Jon-Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接