Следует ли использовать мой метод CVDisplayLinkOutputCallback для обновления, а также для визуализации сцены OpenGL

Мне удалось создать NSOpenGLView с помощью CVDisplayLinkSetOutputCallback как способ визуализации сцены в моем приложении. Кажется, все работает правильно, и метод обратного вызова срабатывает с довольно приличной скоростью.

До сих пор моя реализация основывалась на коде, найденном в этой ветке форума (в частности, в этом посте) довольно давно (2009).

Копаясь дальше в теме, есть упоминание о настройке NSTimer для фиксированного интервала шага, который будет вызывать к update:(NSTimeInterval)duration метод интеграции физики моделирования и тому подобное. Тем не менее, похоже, что дельта-время между кадрами также вычисляется в методе обратного вызова отображаемой ссылки, что я нахожу довольно запутанным.

Ранее я не рассматривал фиксированный интервал времени для обновления своей сцены и, честно говоря, мне это не совсем подходит, но я все еще изучаю OpenGL и более тонкие нюансы разработки игр.

Является ли хорошим подходом связывать методы обновления и рендеринга вместе в обратном вызове отображаемой ссылки, или лучше подходить для того, чтобы сидеть в другом месте?

я использовал GLKit для iOS и для того, чтобы все было готово и работало, было довольно просто, потому что вы соответствовали соответствующим методам делегатов, и ваши методы update и render вызывались соответственно.

Пока что мой код выглядит так: (на основе кода, найденного в ветке форума)

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 ответов

Другие вопросы по тегам