【问题标题】:Getting stuck at 40 fps even with using CADisplayLink?即使使用 CADisplayLink 也卡在 40 fps?
【发布时间】:2011-06-02 06:37:07
【问题描述】:

一开始我使用 NSTimer,遇到了帧率卡在每秒 40 帧的问题。我已阅读有关使用 CADisplayLink 解决问题的信息。它似乎工作了一段时间,但最近,应用程序从 60 开始,然后过了一会儿(大约 5 - 20 秒),应用程序开始以 40 - 41 fps 运行并卡在那里。而且我正在剔除,以便在物体不在视线范围内时减少绘制,但它仍然卡在那里。一种似乎确实可以暂时解决问题的不寻常方法(大约 10 秒)是将电线从 iphone 底部断开,然后重新连接。显然,这并不理想,只是想知道为什么会发生这种情况以及为什么会对其进行某种程度的修复,就好像它重置了某些值或其他东西一样。任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 您在每次 CADisplayLink 渲染调用期间、之后或之间做什么? OpenGL 或 drawRect 渲染?读取任何像素?获取任何 UI 回调?声音的?其中一些可能会在刷新周期内停止硬件图形管道,否则会导致丢帧或丢帧。

标签: iphone frame-rate cadisplaylink opengl-es


【解决方案1】:

我在 3G 上遇到了同样的问题。我已将我的应用程序简化为在空白(粉红色)后缓冲区上绘制的 FPS 计数器,但它仍然是 40 fps。

经过一番谷歌搜索,我发现 cocos2d-iphone.org 论坛上正在讨论一个非常相似的问题。

解决方案是关闭视图控制器的自动旋转。所以我让我的 shouldAutorotateToInterfaceOrientation 总是返回 NO,这很有效(!!!)。我有稳定的 60 FPS。然后我返回了我的简单游戏图形,它稳定在 60 FPS。但我的游戏预计以横向模式运行,但目前以默认纵向模式运行。

我不想编写自己的自动旋转代码,所以看起来我要切换回 40 fps。有人知道如何避免这种自动旋转帧率下降吗?

【讨论】:

  • 我记得在 Apple 文档中的某处读过,如果您在 OpenGL ES 应用程序上进行自动旋转,您应该使用 gl 变换而不是依赖 UIViewController 的功能来滚动“您自己的”屏幕旋转,以实现更好的性能...
【解决方案2】:

同样的问题。我有一个非常基本的 openGL 视图(旋转立方体),它以 60fps 开始,一旦我运行一项繁重的任务以使其减速一点,它就再也不会回到 60fps 并且它稳定在 40fps。我正在使用 CADisplayLink,它只是在测试应用程序上运行,基本上没有尝试解决这个问题:/

如果有人有解决方案,我将非常感激。

【讨论】:

    【解决方案3】:

    您是否检查过您是否真的丢帧?您是否使用 CPU/GPU 到了每秒只能绘制 40 帧的程度,还是软件的某个地方有问题?

    请记住,如果CADisplayLink 无法触发屏幕刷新(由于主线程忙于绘制前一帧等操作),那么它可能会跳过它,因为它没有足够的时间来完成.因此,如果您的某些帧绘制时间超过 0.01666... 秒,您将错过立即绘制帧的时间间隔,并且减速可能看起来比实际情况更糟。

    还请记住,移动设备并不总是能够快速绘制所有内容。 iPhone 4 中的 A4 处理器非常好,但要每秒填充 60 次 960x640 屏幕像素仍然是一项艰巨的任务。如果您的帧速率是 40 fps 而不是 60 fps,绝大多数用户不会注意到 - 人眼通常不会注意到抖动或屏幕延迟,直到您达到 20 fps 或更低。

    【讨论】:

    • 我知道当有很多绘制和其他事情发生时会变慢,但奇怪的是当绘制和其他操作较少时,帧速率永远不会赶上。 (有点像人们遇到的 NSTimer 帧速率问题)。我正在使用 Opengl 顺便说一句。我将尝试一些解决方法,如果我发现了什么,我会发布
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多