【发布时间】:2011-03-23 21:40:01
【问题描述】:
我们有一个即将到来的项目,需要我们将纹理图像信息推送到 iPad 应用程序的 EAGLView。一般来说,对于 OpenGL 来说是绿色的,是否有表面等待纹理信息的影响? OpenGL 在等待图像数据时会做什么? OpenGL 是否需要不断更新它的纹理,还是会保留数据直到我们再次更新纹理?我们不会在视图中有循环或任何东西,而是更像一个观察者模式。
【问题讨论】:
我们有一个即将到来的项目,需要我们将纹理图像信息推送到 iPad 应用程序的 EAGLView。一般来说,对于 OpenGL 来说是绿色的,是否有表面等待纹理信息的影响? OpenGL 在等待图像数据时会做什么? OpenGL 是否需要不断更新它的纹理,还是会保留数据直到我们再次更新纹理?我们不会在视图中有循环或任何东西,而是更像一个观察者模式。
【问题讨论】:
当您上传纹理时,您会将其交给 GPU — 因此在您无法直接访问的内存中制作了一个副本。然后可以根据需要多次绘制它。所以不需要经常更新。
OpenGL 在等待图像数据时不会做任何其他事情,它是一个同步 API。上传数据的调用将花费尽可能长的时间,纹理对象事先没有与之关联的图形,之后将与您上传的任何内容关联。
一般情况下,OpenGL对象,包括纹理对象,属于特定的上下文,上下文属于特定的线程。然而,iOS 实现了share groups,它允许您将多个上下文放入一个共享组中,允许在它们之间共享对象,但您必须对同步有点小心。
iOS 提供了一个特定的 CALayer 子类CAEAGLLayer,您可以使用它从 OpenGL 中进行绘制。何时绘制以及绘制频率取决于您。所以你的方法是更原生的,如果有的话。很多样本都包装了
显然首先尝试“主线程上的所有内容”的最简单方法。如果您没有做那么多,那么它可能会足够快并节省您的代码维护。但是,上传的成本可能比您预期的要高,因为 OpenGL 的工作方式是您指定数据及其所在的格式,让 OpenGL 根据您所使用的特定 GPU 的需要重新排列它。我们说的是 0.3 秒的数量,而不是 30 秒,但如果用户同时点击按钮或尝试移动滑块,就会出现明显的停顿。
因此,如果保持主线程响应证明是一个问题,我想您会想跳到后台线程,在与主线程上的共享组相同的共享组中创建一个新上下文,上传,然后跳回去做实际的绘图。在这种情况下,如果差距大到足以证明这样做是合理的,那么您将如何与用户沟通已收到并正在处理的数据与尚未收到数据不同,这取决于您。
【讨论】: