Mein Ziel ist es, eine native Cocoa-App für OSX 10.4+ zu erstellen, die mit OpenGL rendert, um ein Spiel zu portieren, das ich gerade erstelle. Mein Problem ist, dass ich nach Apples Tech Notes (siehe Links unten) nicht herausfinden kann, wie man das Aktualisieren und Rendern in Cocoa trennt. Das ist meine Frage: Wie kann eine Cocoa-App mit einer anderen Rate aktualisiert werden, als sie rendert? Mit anderen Worten, das Rendering von Cocoa ist ereignisbasiert, und ich möchte nicht auf ein Ereignis warten, um meine Simulation zu aktualisieren.Rendern und Aktualisieren mit OS X unter OpenGL
Hier ist das Fleisch von dem, was ich habe Arbeit:
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;
}
Was ich ist nicht oben über den Code wie das Rendering und die Aktualisierung auf demselben Ereignis geschehen, und die Absicht ist der Fall, dass das Betriebssystem erzählt meine Anwendung, dass es einen Rahmen rendern sollte.
Unter Windows würde ich diesen Code unten in einem WinMain() geben würde genau das, was ich suche.
while(true) {
process_events(); //PeekMessage, handle WM_ events
int elapsedTime = GetElapsedSeconds();
prepare(elapsedTime);
if (fps_lock(elapsedTime, 60)) {
render();
}
swapBuffers();
}
Hier ist, was ich angeschaut habe (ich würde mehr schreiben als nur zwei Links, weil ich ein paar Forschung habe ich getan habe, aber meine niedrige rep hinderte mich daran, das zu tun):
Vielen Dank im Voraus für mich etwas zu zeigen ich habe vielleicht verpasst haben, oder war etwa völlig abwegig.
Viele Informationen hier für eine grundlegende Frage. Vielleicht möchten Sie es vereinfachen, z. B. "Rendern und Aktualisieren mit unterschiedlichen Raten?" und fügen Sie Ihr Codebeispiel hinzu. Viel Glück. :-) –