OpenGL - 我应该存储属性/统一位置吗?

EOG*_*EOG 7 opengl-es opengl-es-2.0

glGetUniformLocationglGetAttribLocation耗时?

哪种方式更好?

  1. 打电话glGetAttribLocationglGetUniformLocation每次我需要它?
  2. 将位置存储在可变数据中并在需要时使用它们?

Nic*_*las 9

哪种方式更好?

想一想.不管如何快速glGetUniformLocationglGetAttribLocation有,他们无法不仅仅是取出一个变量更快.因此,如果您关注性能,那么请使用始终更快的方法.


小智 7

根据我的测试,获取此类位置所需的时间大约是单个glDrawElements调用所需时间的 100 到 200 倍。这只是基于 的估计System.nanoTime(),但我认为值得在初始化时将它们存储在变量中。

  • 这是一个更好的答案。(当然,我希望数据是正确的,但我可以想象它是正确的,因为获取属性是同步的,而绘图不是)。 (2认同)

GLE*_*LES 6

无论是在Android还是iPhone上,对于opengl表面你都会有类似的方法: onSurfaceCreated和onSurfaceChanged,养成在这两种方法中获取制服和属性的习惯.

你可以更快地渲染渲染的唯一方法(当你的代码跨越1000行代码时很快会成为你的优先考虑)只是在onDrawFrame方法中只有gluseprogram,glbindbuffer,纹理绑定和其他绑定,总是在onSurfaceCreated和onSurfaceChanged中缓存变量

  • 好答案.着色器中使用的属性,制服和其他变量应缓存在init()方法中,而不是draw_Frame()方法中. (2认同)