gpt4 book ai didi

android - 为什么 glClear 在 OpenGLES 中阻塞?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:04:12 37 4
gpt4 key购买 nike

我正在尝试分析我的渲染器,但我看到了一些我无法解释的奇怪的分析行为。

我正在使用 glSurfaceView,我已将其设置为连续渲染。

这就是我的onDrawFrame() 的结构

public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}

这在轻负载下表现缓慢,所以我创建了一个计时器类并开始对此进行分析。我对我所看到的感到非常惊讶。

我像这样在我的 onDrawFrame 方法上放置了一些探针:

public void onDrawFrame(GL10 unused) {
swapTimer.end();

clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();

drawTimer.start();
executeAllDrawCommands();
drawTimer.end();

swapTimer.start();
}

clearTimer 测量调用 glClear 所需的时间,drawTimer 测量运行所有绘制调用所需的时间,swapTimer 测量从 onDrawFrame 退出到返回的时间(调用 eglSwapBuffers 所花费的时间)。

当我运行一个负载很轻的场景时,我得到了一些我无法解释的非常奇怪的数字:

swapTimer  : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)

我预计交换时间会有点长,因为我相信该设备以 ~30fps 的速度强制启用垂直同步,但我不知道为什么实际的“清除”调用会阻塞 11 毫秒?我以为它只是应该发出一个异步命令并返回?

当我画一个更繁忙的场景时,数字会发生相当大的变化:

swapTimer  :  2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)

在这个场景中,我的绘制调用花费了太多时间,看起来它隐藏了很多 vsync 周期,并且清除调用上的 block 完全消失了。

对于为什么 glClear 在我的轻载场景中阻塞有任何解释吗?

如果有人怀疑我的测量技术,请链接到我的“定时器”类源代码:http://pastebin.com/bhXt368W

最佳答案

I put a glFinish (and finishTimer.start()/end() around it), and it takes all the time away from glClear. Instead now glFinish takes some number of milliseconds, and glClear becomes instant.

这就解释了。

当你的场景很亮并且绘图渲染得非常快时,清除像素并用新颜色填充像素的时间将需要一些时间(它总是需要时间,否则渲染器落后并且正在绘制新颜色东西)。较新的 Android 设备具有填充率限制。例如,Nexus One 的填充率锁定为 30 Hz - 无论您的实际绘图速度有多快,屏幕都将以该频率同步。如果绘图以低于 30 Hz 的频率完成,渲染器将与屏幕同步。这就是您注意到此延迟的原因,即使您删除了 glClear() 调用,您也应该注意到这一点。渲染器在屏幕更新之前并且比屏幕更新更快。

当渲染器有很多对象要绘制时,同步将停止(考虑到您繁忙场景的配置文件数据),因为渲染器现在在屏幕更新之后。

当您使用 glFinish() 时,它会消除 glClear() 函数否则会导致的时间,按照填充率逻辑,这意味着 glFinish() 现在是确保与屏幕同步的函数。

计算:

F = 1/T

简单场景:

F = 1/T = 1/((20+11+2)*10^-3) =~ 30 赫兹

同步的延迟时间出现在您的分析器中。渲染器正在与屏幕同步。这意味着如果您删除 glClear()glFinish() 调用,延迟 将出现在其他地方。

重场景:

F = 1/T = 1/((2+0+44)*10^-3)) =~ 22 赫兹

同步的延迟时间不会出现在您的分析器中。渲染器在屏幕的更新频率之后。

It seems like this is all related to vsync

这似乎是正确的。

关于android - 为什么 glClear 在 OpenGLES 中阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12224230/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com