Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 具有原始位图数据的高效Cocoa动画_Objective C_Cocoa_Animation_Nsopenglview_Ciimage - Fatal编程技术网

Objective c 具有原始位图数据的高效Cocoa动画

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,我使用

我有一个RGBA malloc数据的原始位图图像;行显然是4字节的倍数。该数据实际上来自AVI(24位BGR格式),但我将其转换为32位ARGB。每帧大约有8mb的32位数据(1920x1080)

对于每个帧:

  • 我通过
    NSData:initWithBytes:length
    将该帧的数据转换为
    NSData
    对象
  • 然后我通过
    CIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace
    将其转换为
    CIImage
    对象
  • 从该
    CIImage
    ,我使用
    NSOpenGLView:drawImage:inRect:fromRect
    将其绘制到最终的
    NSOpenGLView
    上下文中。由于目标图像的“马赛克”特性,使用各种源/目标RECT对此进行了大约15-20次调用
使用在
NSOpenGLView
上调用
[self-setNeedsDisplay:YES]
的30hz
NSTimer
,我可以在2012 MacMini/2.6ghz/i7上获得大约20-25fps的速度——30hz时它不是坚如磐石。使用
NSTimer
而不是
CVDisplayLink
时会出现这种情况

但是。。。现在忽略
NSTimer
问题,是否有任何建议/建议可以让逐帧渲染更高效一些

谢谢


注意:我想继续使用
CIImage
对象,因为我希望在某个时候访问过渡效果。

每一帧,调用
NSData
initWithBytes:length:
会导致8MB内存分配和8MB拷贝

您可以通过将
NSData
对象替换为持久的
NSMutableData
对象(在开始时设置一次)并将其用作帧的24位到32位转换的目标缓冲区,来消除这种每帧分配/复制


(或者,如果您希望自己管理目标缓冲区内存,请将对象保留为
NSData
class,但使用&pass
NO
作为最后一个参数对其进行初始化。)

更新:我的原始代码在大约19.3ms内生成了一帧。使用NSMutableData对象需要16.6ms。使用NSData:initWithBytesNoCopy需要14.6ms。所以运行时间减少约25%。好提示!谢谢