gpt4 book ai didi

objective-c - 带原始位图数据的高效 Cocoa 动画

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:16 28 4
gpt4 key购买 nike

我有一个 RGBA 分配数据的原始位图图像;行显然是 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 次使用各种源/目标 Rects 对此进行调用。

使用 30hz NSTimer那叫[self setNeedsDisplay:YES]NSOpenGLView 上,我可以在 2012 MacMini/2.6ghz/i7 上达到大约 20-25fps——它在 30hz 时并不坚如磐石。这在 NSTimer 中是意料之中的而不是 CVDisplayLink .

但是...忽略 NSTimer目前的问题,是否有任何建议/指示可以使这种逐帧渲染更高效一些?

谢谢!

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

最佳答案

每一帧,对 NSDatainitWithBytes:length: 的调用都会导致 8MB 内存分配和 8MB 复制。

您可以通过将 NSData 对象替换为持久性 NSMutableData 对象(在开始时设置一次)并使用它的mutableBytes作为帧的 24 位到 32 位转换的目标缓冲区。

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

关于objective-c - 带原始位图数据的高效 Cocoa 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050009/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com