OS X 图形框架能否基于自定义缓冲区实现 60 Hz 渲染?
Posted
技术标签:
【中文标题】OS X 图形框架能否基于自定义缓冲区实现 60 Hz 渲染?【英文标题】:OS X graphics framework able to achieve 60 Hz rendering based on custom buffer? 【发布时间】:2017-10-09 00:34:35 【问题描述】:有哪些方法可以基于自定义/自备 RGB/RGBA 缓冲区实现 60 Hz 渲染性能?
我有一个具有功能渲染逻辑的项目,它刷新内存中的 RBBA 缓冲区以供其显示。
我只是在寻找一种在 OS X 上基于此驱动窗口显示表面或视图的方法。
根据我的研究,Quartz 或 Core Graphics 似乎具有必要的原语,但缺乏以所需刷新率执行此操作的性能。与 NSTimer 一起启用此功能也没有正确的刷新节奏或分辨率来达到 60 FPS(根据 Apple 的文档)。
【问题讨论】:
你想看CADisplayLink:developer.apple.com/documentation/quartzcore/cadisplaylink 【参考方案1】:基于一些令人鼓舞的原型结果,我将基于 CGDataProviderCreateWithData 到 CGImageRef 到 NSImage 到 NSImageView 进行一个零碎的实现。
我正在刷新基于 NSTimer 的缓冲区,刷新间隔为 0.016 秒。
仍然很想知道那里有什么更好的选择。
代码 sn-p 如下,将其放在那里以防万一。
// byteBuffer is a 306 x 242 uint8_t* based RGBA (4 byte per pixel ) buffer.
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(byteBuffer, byteBuffer, 306 * 242 * 4, NULL);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGImageRef image = CGImageCreate(306, 242, 8, 32, 306 * 4, colorSpace, kCGBitmapByteOrder32Big, dataProvider, NULL, NO, kCGRenderingIntentDefault);
CGSize size = 306, 242 ;
// maintain a reference to NSImage* in this controller based code
self.nsImage = [[NSImage alloc] initWithCGImage: image size: size];
// set new image on NSImageView (self.myView)
self.myView.image = self.nsImage;
上面的代码可以从下面的NSTimer/选择器组合中调用:
[NSTimer scheduledTimerWithTimeInterval:0.016 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
- (void)timerFireMethod:(NSTimer*)timer
// Here you can call your (above) update buffer code
[self updateView];
[self.myView setNeedsDisplay:YES];
【讨论】:
以上是关于OS X 图形框架能否基于自定义缓冲区实现 60 Hz 渲染?的主要内容,如果未能解决你的问题,请参考以下文章