gpt4 book ai didi

ios - iOS 上的 Opengles 图像纹理预加载

转载 作者:行者123 更新时间:2023-11-29 02:48:30 26 4
gpt4 key购买 nike

我正在 iOS 上创建一个图片之间具有复杂过渡的照片幻灯片。核心动画不适合这个目的,因为可能的转换是有限的,所以我求助于 Opengles 2.0。问题是将图像上传到 GPU 并创建纹理是一项耗时的操作,即使是 960x640 图像也需要大约 200 毫秒,这不适合实时播放场景。预先创建所有纹理是不可行的,因为它们可能有 100 个。我想知道 Core Animation 如何处理这个问题并且无论您在动画中分配多少 CGImages 都足够流畅地运行? (只要图像在不同的时间而不是一起呈现)。

最佳答案

纹理加载非常耗时,大多数处理大量纹理的应用程序都是在某些初始化时加载它们。这是最简单的方法,但肯定是最消耗资源的。你必须明白后面发生的事情是读取图像文件,解压缩它,在 CPU 上创建原始 RGB(A) 数据,在 GPU 上分配内存并将原始数据发送到 GPU ...

由于处理大量纹理的最佳方法是最好在您需要它们之前就将它们加载到后台。在您的情况下,正如评论中已经提到的,您将需要为这些纹理创建一些智能缓存。这仍然不够,因为加载本身可能会使您的线程无响应。您将需要添加一个后台任务来处理这些图像。

我建议您创建 2 个额外的线程。第一个应该将图像数据加载到 CPU,而第二个将数据推送到 GPU。第一个线程非常简单,而第二个线程需要一些额外的 GL 代码才能完成。每个线程都需要自己的 openGL 上下文才能与 GPU 通信,因此一旦创建了该线程,您还需要创建一个额外的上下文。这些上下文不知道彼此的资源,这导致在一个上下文中创建纹理将使其在另一个上下文中无法使用。为此,您将需要一个称为共享组的额外参数。因此,首先创建共享组,然后使用相同的共享组创建两个上下文,以便可以访问纹理。请注意,上下文最好是在您应该使用它的线程上创建的(尽管将其简单地设置为当前线程可能就足够了)。

关于ios - iOS 上的 Opengles 图像纹理预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24818480/

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