Correct way to drive Main Loop in Cocoa

Posted by Kyle on Game Development See other posts from Game Development or by Kyle
Published on 2012-03-25T22:06:21Z Indexed on 2012/03/25 23:42 UTC
Read the original article Hit count: 524

Filed under:
|
|
|

I'm writing a game that currently runs in both Windows and Mac OS X. My main game loop looks like this:

while(running)
{
    ProcessOSMessages(); // Using Peek/Translate message in Win32
                         // and nextEventMatchingMask in Cocoa
    GameUpdate();
    GameRender();
}

Thats obviously simplified a bit, but thats the gist of it. In Windows where I have full control over the application, it works great. Unfortunately Apple has their own way of doing things in Cocoa apps.

When I first tried to implement my main loop in Cocoa, I couldn't figure out where to put it so I created my own NSApplication per this post. I threw my GameFrame() right in my run function and everything worked correctly.

However, I don't feel like its the "right" way to do it. I would like to play nicely within Apple's ecosystem rather than trying to hack a solution that works.

This article from apple describes the old way to do it, with an NSTimer, and the "new" way to do it using CVDisplayLink. I've hooked up the CVDisplayLink version, but it just feels....odd. I don't like the idea of my game being driven by the display rather than the other way around.

Are my only two options to use a CVDisplayLink or overwrite my own NSApplication? Neither one of those solutions feels quite right.

© Game Development or respective owner

Related posts about engine

Related posts about architecture