Я пишу игру, которая в настоящее время работает как в Windows, и Mac OS X. Мой основной игровой цикл выглядит следующим образом:Правильный способ привода главного цикла в какао
while(running)
{
ProcessOSMessages(); // Using Peek/Translate message in Win32
// and nextEventMatchingMask in Cocoa
GameUpdate();
GameRender();
}
То, очевидно, немного упрощен, но это суть его. В Windows, где я полностью контролирую приложение, он отлично работает. К сожалению, у Apple есть собственный способ сделать что-то в приложениях Cocoa.
Когда я впервые попытался реализовать свой основной цикл в Cocoa, я не мог понять, куда его поместить, поэтому я создал свой собственный NSApplication
на this post. Я бросил свой GameFrame()
прямо в мою функцию run
, и все работало правильно.
Однако я не чувствую, что это «правильный» способ сделать это. Я хотел бы хорошо играть в экосистеме Apple, а не пытаться взломать решение, которое работает.
This article из apple описывает старый способ сделать это, с NSTimer
и «новым» способом сделать это, используя CVDisplayLink
. Я подключил версию CVDisplayLink
, но он просто чувствует .... странно. Мне не нравится, что моя игра управляется дисплеем, а не наоборот.
Могу ли я использовать только два варианта использования CVDisplayLink
или перезаписать свои собственные NSApplication
? Ни одно из этих решений не кажется совершенно правильным.
Метод CVDisplayLink в настоящее время работает для меня без проблем, он просто чувствует ... странно. Я знаю, что это не лучшая причина не использовать его, мне просто интересно, есть ли лучшее/более интуитивное решение. Это действительно то, что используют коммерческие игровые студии? – Kyle
Я бы предположил, что большинство коммерческих игр игнорируют рекомендацию Apple и делают петлю в основном потоке, иначе вообще не используют фреймворки Cocoa. С другой стороны, я думаю, что в большинстве игр для iPhone используется «CADisplayLink», что эквивалентно. Я также хотел бы отметить, что если вы используете vsync, ваша игра уже (косвенно) управляется дисплеем. –
По иронии судьбы, портирование на iPhone - это то, что обеспечило это вдохновение, чтобы найти «правильный» способ сделать это. Версия iPhone действительно управляется дисплеем, который не чувствует себя так же странно, потому что там больше смысла, IMO. Vsync - это вариант в моей игре, но во время разработки я держу его, чтобы выполнять реальные измерения производительности. – Kyle