Jus*_*ers 7 opengl-es core-graphics objective-c core-video ios
实际问题
几个答案将解决我的问题:
CGImage从直接数据提供程序(创建时CGDataProviderCreateDirect)重新加载其数据CGContextDrawImage吗?或者是否有其他方法可以设置self.layer.contents来做到这一点?CGContext配置,或技巧,我可以使用至少30 fps渲染1024x768图像CGContextDrawImage.CVOpenGLESTextureCacheCreateTextureFromImage自己的纹理数据进行实时缓冲更新?我认为我最大的问题是创建一个,CVImageBuffer因为我从Apples的文档中复制了纹理的其他属性.如果有人有任何关于此的更多信息,那将是非常棒的.背景(手):
我正在开发一个项目,我需要实时修改NPOT图像数据的像素(至少30 fps)并在iOS屏幕上绘制.
我的第一个想法是使用OpenGL glTexSubimage2D进行更新,不幸的是,最终速度非常慢(在iPad上为6 fps),因为驱动程序在每帧都将我的RGB数据转换为BGR.因此,请将它发送到您说的BGR中,我也是如此,但出于某种原因,您无法glTexSubImage2D使用GL_BGRgo figure 调用.我知道一些缓慢是因为它不是2图像数据的力量,但我的要求决定了这一点.
更多阅读引导我,CVOpenGLESTextureCacheCreateTextureFromImage但所有的例子是使用直接相机输入来获得CVImageBufferRef我尝试使用文档(没有官方但只是标题注释)来使我自己的CVImageBuffer形成我的图像数据,但它不适用于此(不错误只是调试器中的空纹理),这让我觉得Apple专门为处理实时摄像机数据而构建它,并且除了IDK之外,它还没有在这个区域之外进行过多次测试.
无论如何在通过倾倒OpenGL并将我的想法转换为CoreGraphics放弃我的尊严后,我被引导到这个问题最快的方法在iphone上绘制屏幕缓冲区
,建议使用CGImage支持CGDataProviderCreateDirect,这允许您返回指向图像数据的指针CGImage需要它,真棒吗?好吧,它似乎没有像宣传的那样工作.如果我使用,CGContextDrawImage那么一切正常.我可以修改像素缓冲区,每次绘制时,它都应该从我的数据提供者那里请求图像数据,调用方法CGDataProviderDirectCallbacks(Note:它们似乎有内置优化,如果它具有与之相同的地址,则忽略更新的指针透水).CGContextDrawImage不是超快(大约18 fps),即使使用禁用插值也会超过6 fps.Apple的文档告诉我使用self.layer.contents将比快得多CGContextDrawImage.使用self.layer.contents第一次分配的工作,但从CGImage不请求从数据提供者重新加载,就像CGContextDrawImage我做的那样,即使我打电话[layer setNeedsDisplay].在我引用的SO问题中,用户通过每帧从数据源创建和销毁新的CGImage来展示他对问题的解决方案,这是一个绝对缓慢的过程(是的,我确实尝试过),所以是真正问题的时间.
注意:我已经分析了所有这些操作,并且知道问题确实是glTexSubImage针对OpenGL的,CGContextDrawImage并且确实是CoreGraphics的问题所以没有"go profile"的答案.
EDIT现在可以在http://github.com/narpas/image-sequence-streaming找到演示此技术的源代码.
感谢Brad Larson和David H帮忙解决这个问题(请参阅我们在评论中的完整讨论).结果是使用OpenGL和CoreVideo CVOpenGLESTextureCache结果是将原始图像推送到屏幕的最快方式(我知道CoreGraphics不是最快的!),在iPad上为我提供60 fps全屏1024x768图像1.文档很少现在就这样,我会尽可能地解释,以帮助人们:
CVOpenGLESTextureCacheCreateTextureFromImage允许您创建一个OpenGL纹理,该纹理具有直接映射到CVImageBuffer您用于创建它的内存.这允许您CVPixelBuffer使用原始数据创建say a 并修改从中收集的数据指针CVPixelBufferGetBaseAddress.这为您提供了OpenGL的即时结果,无需修改或重新上载实际纹理.确保CVPixelBufferLockBaseAddress在修改像素之前锁定并在完成后解锁.注意,此时这在iOS模拟器中不起作用,仅在我推测来自VRAM/RAM部门的设备上,其中CPU无法直接访问VRAM.Brad建议使用条件编译器检查在原始glTexImage2D更新和使用纹理缓存之间切换.
需要注意的几件事(这些因素的组合导致它对我不起作用):
CVPixelBuffer备份与kCVPixelBufferIOSurfacePropertiesKey见链接,例如(再次感谢布拉德).GL_CLAMP_TO_EDGEOpenGL ES 2.0的NPOT纹理数据glBindTexture(CVOpenGLESTextureGetTarget(_cvTexture), CVOpenGLESTextureGetName(_cvTexture));并不像我一样愚蠢,并CVOpenGLESTextureGetTarget用于两个参数.CVPixelBufferGetBaseAddress更新纹理获得的指针中.| 归档时间: |
|
| 查看次数: |
3352 次 |
| 最近记录: |