gpt4 book ai didi

android - OpenGL ES 线程上的垃圾收集

转载 作者:行者123 更新时间:2023-11-29 21:53:14 25 4
gpt4 key购买 nike

我的最后一个问题没有得到解答,所以我正在尝试不同的方法。我将许多纹理 (256x256 RGBA888) 动态加载到内存中,并在需要时丢弃它们。问题是,有时当我将纹理上传到 OpenGL ES 时需要 40-80 毫秒,很少会更多。我发现,这段缓慢的时间是在垃圾收集之后。问题是,此 GC 有时会阻塞 GL 线程(FPS 下降),有时会阻塞纹理加载器线程(正常)。有什么好的方法可以阻止 GCGL 线程上发生吗?

我尝试在每 1、2、3...n 个纹理解码后在纹理加载器线程上调用 System.gc(),这有效地消除了 GC-ingGL 线程上,但现在纹理加载速度慢得多,因为该线程必须等待 GC 完成。使“n”变大会使加载速度更快,但 GL 线程上的 GC 更有可能出现,因此会出现断断续续的动画。

对于在不同线程中解码的位图,是否有一些方法可以删除 GL 线程上的 GC-ing?我不在 GL 线程上解码/分配任何位图,GC-ing 仅在加载新纹理时发生。

编辑:应用程序针对 android 3.2 及更新版本,也适用于手机。这种情况发生在手机 (HTC One S - 4.0.3) 和平板电脑 (Nexus 7 - 4.1、Galaxy Tab 2 10.1 - 3.2 和 4.0、Acer Icona A200 - 4.0) 上

最佳答案

您无法完全禁用垃圾收集,它将由 Dalvik VM 在您不干预的情况下启动。

您可以通过使用一些自定义纹理加载来最小化内存分配和释放,例如使用预分配数组来存储源纹理数据等。正如您提到的,所有纹理都具有相同的尺寸和颜色深度,因此您需要任何图像的相同大小(256x256x4 = 262144 字节)的临时缓冲区。

最终,您可以将 OpenGL 代码移动到 JNI C/C++ 代码,以您想要的方式管理内存。

关于android - OpenGL ES 线程上的垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13911374/

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