3

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

对于每一帧:

  • 我通过 将该帧的数据转换为NSData对象NSData:initWithBytes:length
  • 然后我CIImage通过CIImage:imageWithBitmapData:bytesPerRow:size:format:colorSpace.
  • 从那开始CIImage,我NSOpenGLView使用NSOpenGLView:drawImage:inRect:fromRect. 由于目标图像的“马赛克”性质,大约有 15-20 次使用各种源/目标 Rect 对此进行调用。

使用 30hzNSTimer调用2012 MacMini/2.6ghz/i7[self setNeedsDisplay:YES]NSOpenGLView,我可以达到大约 20-25fps——它在 30hz 时并不坚如磐石。NSTimer这可以用 a而不是 a来预期CVDisplayLink

但是......暂时忽略这个NSTimer问题,是否有任何建议/指针可以让这种逐帧渲染更有效?

谢谢!

注意:我想坚持使用CIImage对象,因为我想在某些时候访问过渡效果。

4

1 回答 1

1

每一帧,对NSData's的调用initWithBytes:length:都会导致 8MB 内存分配和 8MB 副本。

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

(或者,如果您更喜欢自己管理目标缓冲区内存,请将对象保留为NSData类,但使用initWithBytesNoCopy:length:freeWhenDone:&NO作为最后一个参数对其进行初始化。)

于 2013-08-05T07:28:12.270 回答