java - Android OpenGL ES 1.x 中绘制临时对象的最佳方式

标签 java android opengl-es

我正在使用 OpenGL ES 1.x 为 Android 开发一个小型应用程序。没有 glBegin-glEnd 功能,因此必须为要绘制的对象定义顶点(以及颜色和纹理坐标)数组,然后使用矩阵运算来移动、缩放和旋转它们。这对于大型物体非常有效,没有什么可提示的......

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

DrawHelper.drawLine(起点、终点)

我注意到有两种可能的方法可以做到这一点。我的问题是这些版本中哪一个是首选?由于我们正在处理如此简单的辅助函数,并且这两种方法都简单易懂,因此最好从一开始就将它们编写得尽可能好,即使潜在的速度增益非常低。所以请不要“首先进行基准测试并确定瓶颈”.. =)

方法一:

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

方法2:

绘制助手有一个虚拟的 FloatBuffer,我每次都使用 FloatBuffer.put 来输入新点。

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

最佳答案

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

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

关于java - Android OpenGL ES 1.x 中绘制临时对象的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19635466/

相关文章:

java - 显示以 "null"开头的结果

java - 从 JSONObject 转换非原始 Double

android - 使用jsp将android连接到mysql

java - 使用 Regex 修复 Java 中未转义的 XML 实体?

java - 如何在没有 getter 的情况下获取附加到实体的实体列表?

java - 如何在新的更新 Oreo 8.1 中隐藏软键盘

java - java类初始化函数定义

ios - 为什么 GLK ViewController Delegate 中没有更新?

opengl-es - 使用 CVPixelBufferRef 和 Shaders 在 ffmpeg 的 OpenGL 中渲染 YUV 视频

ios - ARKit,用于 ARSCNView 的金属着色器