gpt4 book ai didi

android - 如何在 Android 上加速着色器加载/编译

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:18 30 4
gpt4 key购买 nike

我为 Android 编写了一个 OpenGL 动态壁纸,它使用 17 个像素和 17 个顶点着色器。在我的 HTC Legend 上,加载和编译大约需要 3 秒。加载时间约为其中的 20%,其余时间用于编译。

每次运行全屏应用程序时,动态壁纸的 OpenGL 上下文都会被销毁,当壁纸再次可见时,所有着色器、纹理等都需要重新加载,导致屏幕卡住约 3 秒每次,这对我来说是 Not Acceptable :(

我已经阅读了一些资料,显然,预编译着色器是不可能的。我还能做些什么来解决这个问题?是否可以在后台线程中加载和编译着色器?在这种情况下,我可以展示某种进度动画。不会很好,但总比没有好...

[编辑1]加快速度的另一个重要原因是整个基于 OpenGL 的动态壁纸生命周期很难在所有设备上正常工作(这是轻描淡写的说法)。每当上下文丢失/重新创建时引入较长的加载时间会比我想要的更让人头疼。无论如何:

正如答案 1 所建议的,我尝试查看 GL_OES_get_program_binary 扩展,以制作某种编译一次存储编译版本每个安装的应用程序,但我担心此扩展的实现范围有多大。例如,我的 Tegra2 平板电脑似乎不支持它。

我正在考虑的其他方法:

1) Ubershader:将所有像素着色器放入一个大着色器中,使用 switch 或 if 语句。这会显着降低像素着色器的速度吗?它会使着色器太大并让我超出所有那些讨厌的寄存器/指令计数/纹理查找限制吗?顶点着色器的想法相同。这会将我的整个着色器数量减少到 1 个像素和 1 个顶点着色器,并有望使编译/链接速度更快。有人试过这个吗?[EDIT2] 我刚试过这个。不。编译/链接现在需要 8 秒,然后会出现模糊的“链接失败”错误:(

2) 穷人的后台加载:不要在开始时加载/编译着色器,而是在前 17 帧的每一帧更新中加载/编译一个着色器。至少我会刷新显示,我可以显示一个进度条让用户看到正在发生的事情。这在慢速设备上工作正常,但在快速设备上,这可能会使整个着色器加载/编译阶段比需要的慢......

最佳答案

检查您的实现是否支持 OES_get_program_binary .

关于android - 如何在 Android 上加速着色器加载/编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8718574/

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