我的CVDisplayLinkOutputCallback方法是否应该用于更新以及渲染OpenGL场景

时间:2013-09-05 18:12:30

标签: cocoa appkit nsopenglview

我设法使用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应该以这种方式使用,即:用于场景渲染和一次更新吗?

任何进一步的信息将不胜感激。

0 个答案:

没有答案