2013-10-28 36 views
0

我正在用OpenGL ES 1.x开发一个适用于Android的小型应用程序。没有glBegin-glEnd功能,因此必须为要绘制的对象定义顶点(以及颜色和texcoord)数组,然后使用矩阵运算来移动,缩放和旋转它们。这对大型物体很好,没什么可抱怨的...在Android中绘制临时对象的最佳方式OpenGL ES 1.x

但是,如果想绘制小的“临时”对象(例如,从A点到B点的一条线),事情会变得有点烦人。因此,我创造了一些小的实用功能,如:

DrawHelper.drawLine(起点,终点)

我注意到两种方法可以做到这一点。我的问题是哪个版本更受欢迎?既然我们正在处理这样简单的帮助函数,并且这两种方法都很容易理解,那么即使潜在的速度增益很低,也可能从一开始就写得尽可能好。所以,请没有 “标杆和第一识别瓶颈” .. =)

方法1:

抽签助手有包含点(0,0,0)和(1,0,0)FloatBuffer。我每次用适当的模型视图矩阵绘制这条线,将两个点转换到所需的位置。

方法2:

抽签助手有一个虚拟FloatBuffer我用FloatBuffer.put在新的点,每次喂。

方法1对于较大的对象(如圆或其他几何形状)显然更好(?)。简单的线条或简单的三角形如何?

回答

1

你总是选择涉及工作量较少的方法。应用矩阵乘法比两个向量分配需要更多的计算。此外,矩阵变换方法向GPU(整个4×4矩阵)发送约2.5倍的数据比发送两个3向量。

OTOH Java增加了通过FloatBuffer的惩罚。

+0

谢谢,我会记住这一点,但我不确定你的论点是否适用于所有情况。假设你想在不同的位置多次绘制一个简单的正方形。我从别处读到的内容表明,最好不要改变缓冲区的内容,而是在OpenGL中转换位置。当然,我也无法证实这是正确的。 (另外,可以想象glTranslate被优化为只发送3个参数,我不知道..) –

+1

@ user2582805:对于多个位置的问题,您可以使用实例化。不,没有对glTranslate进行优化。 glTranslate始终在CPU上运行,并在堆栈上的当前4×4矩阵上相乘,然后必须将其传输到GPU。 – datenwolf

+0

好吧,我想我会和那个一起去的。谢谢! –