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