gpt4 book ai didi

objective-c - 呈现 Renderbuffer 时导致执行时间波动的原因是什么? (OpenGL)

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:28 25 4
gpt4 key购买 nike

是这样的:

  • 由于 usleep,drawGL 函数在帧的确切末尾被调用,如建议的那样。这已经保持稳定的帧率。

  • 渲染缓冲区的实际呈现发生在 drawGL() 中。测量执行此操作所需的时间,给我波动的执行时间,导致我的动画卡顿。此计时器使用 mach_absolute_time,因此它非常准确

  • 在帧的末尾,我测量了timeDifference。是的,平均为 1 毫秒,但偏差很大,从 0.8 毫秒到 1.2 毫秒不等,峰值可达 2 毫秒以上。

示例:

// Every something of a second I call tick
-(void)tick
{
drawGL();
}

- (void)drawGL
{
// startTime using mach_absolute_time;

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

// endTime using mach_absolute_time;
// timeDifference = endTime - startTime;
}

我的理解是,一旦创建了帧缓冲区,呈现渲染缓冲区应该总是花费同样的努力,不管帧的复杂性如何?这是真的?如果没有,我该如何预防?

顺便说一句,这是 iPhone 应用程序的示例。所以我们在这里讨论的是 OpenGL ES,但我认为这不是特定于平台的问题。如果是,那是怎么回事?这不应该发生吗?同样,如果是这样,我该如何防止这种情况发生?

最佳答案

您遇到的偏差可能是由很多因素引起的,包括操作系统调度程序启动并将 cpu 分配给另一个进程或类似问题。事实上,正常人不会区分 1 毫秒和 2 毫秒的渲染时间。电影以 25 fps 的速度运行,这意味着每帧显示大约 40 毫秒,人眼看起来很流畅。

至于动画卡顿,您应该检查如何保持恒定的动画速度。我见过的最常见的方法大致如下所示:

while(loop)
{
lastFrameTime; // time it took for last frame to render
timeSinceLastUpdate+= lastFrameTime;

if(timeSinceLastUpdate > (1 second / DESIRED_UPDATES_PER_SECOND))
{
updateAnimation(timeSinceLastUpdate);
timeSinceLastUpdate = 0;
}

// do the drawing

presentScene();
}

或者您可以将 lastFrameTime 传递给每一帧的 updateAnimation 并在动画状态之间进行插值。结果会更加流畅。

如果您已经在使用与上述类似的东西,也许您应该在渲染循环的其他部分寻找罪魁祸首。在 Direct3D 中,代价高昂的事情是调用绘制基元和更改渲染状态,因此您可能需要检查这些的 OpenGL 类似物。

关于objective-c - 呈现 Renderbuffer 时导致执行时间波动的原因是什么? (OpenGL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/677211/

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