Objective c 具有原始位图数据的高效Cocoa动画
我有一个RGBA malloc数据的原始位图图像;行显然是4字节的倍数。该数据实际上来自AVI(24位BGR格式),但我将其转换为32位ARGB。每帧大约有8mb的32位数据(1920x1080) 对于每个帧:Objective c 具有原始位图数据的高效Cocoa动画,objective-c,cocoa,animation,nsopenglview,ciimage,Objective C,Cocoa,Animation,Nsopenglview,Ciimage,我有一个RGBA malloc数据的原始位图图像;行显然是4字节的倍数。该数据实际上来自AVI(24位BGR格式),但我将其转换为32位ARGB。每帧大约有8mb的32位数据(1920x1080) 对于每个帧: 我通过NSData:initWithBytes:length将该帧的数据转换为NSData对象 然后我通过CIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace将其转换为CIImage对象 从该CIImage,我使用
- 我通过
将该帧的数据转换为NSData:initWithBytes:length
对象NSData
- 然后我通过
将其转换为CIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace
对象CIImage
- 从该
,我使用CIImage
将其绘制到最终的NSOpenGLView:drawImage:inRect:fromRect
上下文中。由于目标图像的“马赛克”特性,使用各种源/目标RECT对此进行了大约15-20次调用NSOpenGLView
NSOpenGLView
上调用[self-setNeedsDisplay:YES]
的30hzNSTimer
,我可以在2012 MacMini/2.6ghz/i7上获得大约20-25fps的速度——30hz时它不是坚如磐石。使用NSTimer
而不是CVDisplayLink
时会出现这种情况
但是。。。现在忽略NSTimer
问题,是否有任何建议/建议可以让逐帧渲染更高效一些
谢谢
注意:我想继续使用
CIImage
对象,因为我希望在某个时候访问过渡效果。每一帧,调用NSData
的initWithBytes:length:
会导致8MB内存分配和8MB拷贝
您可以通过将NSData
对象替换为持久的NSMutableData
对象(在开始时设置一次)并将其用作帧的24位到32位转换的目标缓冲区,来消除这种每帧分配/复制
(或者,如果您希望自己管理目标缓冲区内存,请将对象保留为
NSData
class,但使用&passNO
作为最后一个参数对其进行初始化。)更新:我的原始代码在大约19.3ms内生成了一帧。使用NSMutableData对象需要16.6ms。使用NSData:initWithBytesNoCopy需要14.6ms。所以运行时间减少约25%。好提示!谢谢