Моя цель - создать собственное приложение Cocoa для таргетинга на OSX 10.4+, которое отображает OpenGL, чтобы порт игры, которую я создаю. Моя проблема заключается в том, что после технических нот Apple (см. Ссылки ниже) я не могу понять, как отделить обновление и рендеринг в Cocoa. Это мой вопрос: как обновление приложения Cocoa может отличаться от другого? Другими словами, рендеринг Cocoa основан на событиях, и я не хочу ждать события, чтобы обновить мою симуляцию.Рендеринг и обновление в OS X с использованием OpenGL
Вот мясо, что я работаю:
static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeStamp* now, const CVTimeStamp* outputTime, CVOptionFlags flagsIn, CVOptionFlags* flagsOut, void* displayLinkContext)
{
CVReturn result = [(__bridge GameView*)displayLinkContext getFrameForTime:outputTime];
return result;
}
- (CVReturn)getFrameForTime:(const CVTimeStamp*)outputTime
{
//TODO: find somewhere better to put this.
//TODO: the magic number is not doing what I expect it to.
float dt = (outputTime->videoTime - lastCapturedTime)/36000000.0f;
lastCapturedTime = outputTime->videoTime;
update(dt);
NSOpenGLContext *currentContext = [self openGLContext];
[currentContext makeCurrentContext];
// must lock GL context because display link is threaded
CGLLockContext((CGLContextObj)[currentContext CGLContextObj]);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
render();
glFlush();
[currentContext flushBuffer];
CGLUnlockContext((CGLContextObj)[currentContext CGLContextObj]);
return kCVReturnSuccess;
}
Что мне не нравится в коде выше, что делает и обновление произойдет на том же событии, и намерение мероприятия является то, что ОС сказал мое приложение должно отобразить фрейм.
В Windows, ставя этот код ниже в WinMain(), даст мне именно то, что я ищу.
while(true) {
process_events(); //PeekMessage, handle WM_ events
int elapsedTime = GetElapsedSeconds();
prepare(elapsedTime);
if (fps_lock(elapsedTime, 60)) {
render();
}
swapBuffers();
}
Вот что я смотрел (я вывесил бы больше, чем просто две ссылки, потому что у меня есть куча исследований, я сделал, но мой низкий респ помешал мне сделать это):
заранее спасибо за указание мне то, что я, возможно, пропустили, или же от отметки о полностью.
Много информации здесь для основного вопроса. вы можете захотеть упростить его, например «Как визуализировать и обновлять с разной скоростью»? и укажите пример кода. Удачи. :-) –