我设法使用NSOpenGLView
设置CVDisplayLinkSetOutputCallback
作为在我的应用中渲染场景的方法。一切似乎都正常工作,并且回调方法以相当不错的速度触发。
到目前为止,我的实现基于this论坛帖子(特别是this帖子)中的代码(很久以前)(2009年)。
通过该线程进一步挖掘,提到了为固定步长间隔设置NSTimer
,这将调用update:(NSTimeInterval)duration
方法来集成物理模拟等。但是,似乎帧之间的增量时间也是在显示链接回调方法中计算的,我发现它很混乱。
我之前没有考虑更新场景的固定步长时间间隔,说实话,这对我来说似乎不太对,但我仍在学习OpenGL以及游戏开发的细微差别。
在显示链接回调中将更新和渲染方法结合在一起是一种很好的方法,还是更适合坐在其他地方?
我已经使用GLKit
用于iOS并且可以完成所有工作并且工作非常简单,因为您符合相应的委托方法,并且相应地调用了更新和呈现方法。
到目前为止,我的代码如下所示:(基于论坛帖子中的代码)
static CVReturn displayLinkOutputCallback(CVDisplayLinkRef displayLink, const CVTimeStamp *now, const CVTimeStamp *outputTime, CVOptionFlags flagsIn, CVOptionFlags *flagsOut, void *displayLinkContext)
{
NSOpenGLView *view = (__bridge NSOpenGLView *)displayLinkContext;
NSTimeInterval deltaTime = 1.0 / (outputTime->rateScalar * (double)outputTime->videoTimeScale / (double)outputTime->videoRefreshPeriod);
[view update:deltaTime];
[view drawRect:[view frame]];
return kCVReturnSuccess;
}
这是一种可行的方法吗?我应该使用NSTimer
吗?或者是否有一种可能更适合的替代方法?
我对CVDisplayLink
并不太熟悉,所以我不确定这是否是实现更新方法以及渲染场景的最佳位置。 CVDisplayLink
应该以这种方式使用,即:用于场景渲染和一次更新吗?
任何进一步的信息将不胜感激。