Следует ли использовать мой метод 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
быть использован таким образом, то есть: для рендеринга сцены и обновления все в одном?
Любая дополнительная информация будет принята с благодарностью.