实际问题
有几个答案可以解决我的问题:
- 我能否强制
CGImage
从直接数据提供程序(使用CGDataProviderCreateDirect
创建)重新加载其数据,就像CGContextDrawImage
一样?或者是否有其他方法可以通过设置self.layer.contents来实现它? - 是否有
CGContext
配置或技巧可用于使用CGContextDrawImage
以至少30 fps稳定地渲染1024x768图像。 - 是否有人能够成功地使用
CVOpenGLESTextureCacheCreateTextureFromImage
进行实时缓冲区更新并使用自己的纹理数据?我认为我的最大问题是创建一个CVImageBuffer
,因为我从苹果文档中复制了其他属性。如果有人对此有更多信息,那将太棒了。 - 如何将内存中的图像以30 fps的速度传输到屏幕上的任何其他指南。
背景(很多):
我正在处理一个项目,需要实时修改非2次幂图像数据的像素(最低30 fps),并在iOS屏幕上绘制出来。我的第一个想法是使用OpenGL和“glTexSubimage2D”进行更新,不幸的是这种方式非常慢(iPad上只有6 fps),因为驱动程序每帧都会将我的RGB数据转换为BGR。你建议以BGR格式发送它,我也这么做了,但由于某种原因,您不能使用“GL_BGR”调用“glTexSubImage2D”,真是令人费解。我知道一些缓慢是因为它是非2次幂图像数据,但我的要求规定了这一点。
更多的阅读让我了解到“CVOpenGLESTextureCacheCreateTextureFromImage”,但所有的例子都是使用直接相机输入来获取“CVImageBufferRef”。我尝试使用文档(尚未正式发布,只有头文件注释)从我的图像数据中创建自己的CVImageBuffer,但它无法与此配合使用(在调试器中只有一个空纹理),这使我认为Apple专门构建了这个来处理实时相机数据,并且它在这个领域之外没有得到很多测试,但我不确定。
无论如何,放弃了OpenGL并转向CoreGraphics后,我遇到了这个问题在iPhone上绘制屏幕缓冲区的最快方法,它建议使用由
CGDataProviderCreateDirect
支持的CGImage
,这样当CGImage需要时,可以返回一个指向图像数据的指针,很棒对吧?但是它似乎并没有完全按照广告所说的那样工作。如果我使用CGContextDrawImage
,那么一切都正常。我可以修改像素缓冲区,并且每次绘制时,它会像应该做的那样从我的数据提供程序请求图像数据,调用CGDataProviderDirectCallbacks
中的方法(注意:如果更新的指针具有与以前相同的地址,则它们似乎内置了一个忽略更新指针的优化)。即使我调用[layer setNeedsDisplay]
,CGImage也不会像CGContextDrawImage
那样从数据提供程序重新加载。在我引用的SO问题中,用户通过每帧创建和销毁来解决问题,这是一个无望的缓慢过程(是的,我试过了),因此现在是真正的问题。注意:我对所有这些操作进行了分析,知道问题确实是OpenGL的
glTexSubImage
和CoreGraphics的CGContextDrawImage
真正的问题,因此不要给出“进行分析”的答案。编辑:演示这种技术的源代码现在可以在http://github.com/narpas/image-sequence-streaming上找到。