【问题标题】:OpenGL - Should I store Attribute/Uniform locations?OpenGL - 我应该存储属性/统一位置吗?
【发布时间】:2012-08-03 20:33:12
【问题描述】:

glGetUniformLocationglGetAttribLocation 是否耗时?

哪种方式更好?

  1. 每次需要时都致电glGetAttribLocationglGetUniformLocation 吗?
  2. 在变量中存储位置并在需要时使用它们?

【问题讨论】:

    标签: opengl-es opengl-es-2.0


    【解决方案1】:

    哪种方式更好?

    考虑一下。不管glGetUniformLocationglGetAttribLocation 有多快,它们不能比仅仅获取一个变量更快。因此,如果您关心性能,请使用总是更快的方法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

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

      无论是在 Android 还是 iPhone 上,对于 opengl 表面,您将拥有如下方法: onSurfaceCreated 和 onSurfaceChanged, 在这两种方法中养成在这里获取制服和属性的习惯。

      使渲染速度更快的唯一方法(当您的代码超过 1000 行代码时,这将很快成为您的首要任务)是在 onDrawFrame 方法中仅使用 gluseprogram、glbindbuffer、纹理绑定和其他绑定, 总是在 onSurfaceCreated 和 onSurfaceChanged 中缓存变量

      【讨论】:

      • 好答案。着色器中使用的属性、制服和其他变量应缓存在 init() 方法中,而不是 draw_Frame() 方法中。
      猜你喜欢
      • 1970-01-01
      • 2017-10-12
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      相关资源
      最近更新 更多