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 渲染?的主要内容,如果未能解决你的问题,请参考以下文章

QT for symbian 中自定义菜单怎么实现?

Java:Linux 中的图形

计算机图形学(OPENGL):帧缓冲

基于kubernetes调度框架的自定义调度器实现

基于kubernetes调度框架的自定义调度器实现

如何自定义 OS X 的 Finder 边栏