【问题标题】:Measure Render-To-Texture Performance in OpenGL ES 2.0在 OpenGL ES 2.0 中测量渲染到纹理的性能
【发布时间】:2011-07-13 03:17:56
【问题描述】:

基本上,我正在使用由两个三角形和一个片段着色器组成的屏幕大小的矩形进行某种图像处理,它正在执行整个处理工作。实际效果类似于动画,因为它依赖于一个统一变量,称为current_frame

我对用“MPix/s”来衡量性能非常感兴趣。我所做的是这样的:

/* Setup all necessary stuff, including:                 */
/* - getting the location of the `current_frame` uniform */
/* - creating an FBO, adding a color attachment          */
/*   and setting it as the current one                   */

double current_frame = 0;
double step = 1.0f / NUMBER_OF_ITERATIONS;

tic(); /* Start counting the time */

for (i = 0; i < NUMBER_OF_ITERATIONS; i++)
{
    glUniform1f(current_frame_handle, current_frame);
    current_frame += step;
    glDrawArrays(GL_TRIANGLES, 0, NUMBER_OF_INDICES);
    glFinish();
}

double elapsed_time = tac(); /* Get elapsed time in seconds */

/* Calculate achieved pixels per second */
double pps = (OUT_WIDTH * OUT_HEIGHT * NUMBER_OF_ITERATIONS) / elapsed_time;

/* Sanity check by using reading the output into a buffer */
/* using glReadPixels and saving this buffer into a file  */

就理论而言,我的概念有什么问题吗?

另外,我的印象是移动硬件上的glFinish() 不一定要等待之前的渲染调用,可能会进行一些优化。

当然,我总是可以强制在每次抽奖后执行glReadPixels(),但这会很慢,所以这并没有真正的帮助。

您能否告诉我我的测试场景是否合理以及是否有更多可以做的事情。

【问题讨论】:

    标签: c++ c performance opengl-es render-to-texture


    【解决方案1】:

    关于速度,使用glDrawArrays() 仍然会复制共享顶点。

    glDrawElements() 是减少顶点数的解决方案 数组,因此它允许向 OpenGL 传输更少的数据。

    http://www.songho.ca/opengl/gl_vertexarray.html

    只需将其放入其中以帮助加快您的结果。就您的时间概念而言,对我来说它看起来不错。您是否获得了与您希望的结果相似的结果?

    【讨论】:

    • 谢谢!很高兴知道这一点。不过,每帧只有 6 个顶点。一般来说,我得到了一些相当荒谬的高结果。在 256x256 纹理(即大约 650Mpix/s)上进行 10,000 次迭代需要 1 秒,其中着色器只是复制纹理。那是在 SGX530 上。我真的很困惑。
    • IDK 伙计,这是很多像素哈哈。将迭代减少一半,看看它是否将您的经过时间减少了大约一半。如果它仍然接近同一时间,您的问题可能是 GL 状态,但我对此表示怀疑
    • 嗯,SGX530的理论填充率在500-1000 Mpix/s左右。尽管如此,阅读纹理应该会减慢它的速度。而且,我已经尝试过更改参数。对于 4 倍大的图像 (512x512),执行相同次数的迭代需要多 4 倍的时间,因此它似乎是线性的。尽管如此,这并没有让我对自己的测量结果更有信心。
    • 读取纹理?你期待更慢的结果吗?我在这里看不到读取纹理的代码
    • 这当然发生在着色器中。类似gl_Color = texture2D(texture, tex_coords);
    【解决方案2】:

    我会预先计算所有可能的帧,然后使用 glEnableClientState() 和 glTexCoordPointer() 来更改在每个帧中绘制现有纹理的哪一部分。

    【讨论】:

    • 这与 OpenGL ES 2.0 无关。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2014-10-28
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多