我正在开发一个 GL 动态壁纸,它使用很少的 CPU 和只有适度的 GPU。在我的旧测试手机上,它大部分时间都可以以 58fps 左右的速度运行。但偶尔效果会上升,然后渲染时间会在每帧 16 毫秒到 50 毫秒之间抖动。例如,它会在 16 毫秒时渲染几帧,在十几帧左右滑动到 50 毫秒,在 50 毫秒时再渲染几帧,然后再向下滑动到 16 毫秒并重复。我发现,如果我将 CPU 调控器设置为“性能”(或“保守”,奇怪的是)而不是默认的“按需”,它将以全速呈现完整效果。或者,如果我不理会调速器并在我的代码中插入一个繁忙的循环(增加一个变量 100,
因此,在这款手机上,我的应用程序似乎受到 GPU 的限制,但只有当它减速时。现在,我不介意 GLSurfaceView 是否根据 GPU 时钟以较慢的速度呈现,但我的问题是我得到了交替的高帧率和低帧率的爆发,这使我的动画看起来流畅/frameskippy/fluid /frameskippy/等。每秒几次。似乎 GPU 时钟像疯了一样上下起伏?
通过使用 RENDERMODE_WHEN_DIRTY 并在严格定时的线程上调用 requestRender(),我得到了明显的改进,但是该死的 GPU 不断上升和下降。为什么它不能在较慢的时钟下尽可能快地渲染,或者只是跳到并停留在较高的时钟上?
到目前为止,我提出的最佳解决方案是使用滑动窗口来检测平均帧更新时间,然后应用与目标帧时间的差异,直到两个值收敛。渲染更新之间的时间较慢,但至少大致保持不变。所以这在理论上可行,但需要几秒钟才能达到稳定状态,同时看起来很糟糕。
我认为第三种选择可能是蚕食 GLSurfaceView 源并制作自定义版本。据我了解,阻塞的 GL 调用是在那里进行的,所以我更容易计时渲染调用并做出相应的反应。不过,我不太愿意尝试这样做,因为那里有很多代码,我必须花很多时间理解才能开始弄乱它。另外,我不得不担心 X 版 GLSurfaceView 与任何 Y 版 Android 的播放效果如何。
那么,说了这么多,我在这里还有其他选择吗?有没有更简单的解决方法?