Хотя я не могу быть единственным человеком в мире, пытающимся достичь этого, похоже, никто не хочет на это отвечать (не обращайте на вас внимание, ребята из stackoverflow, просто указываю на разработчиков Mac, которые знают, как это работает).
Вот почему я хочу изменить это типичное поведение и помочь тем, кто ищет то же самое. Другими словами: я нашел решение! Мне все еще нужно улучшить этот код, но это в основном все!
1 / Когда вам нужен настоящий собственный цикл, как в Windows, вам нужно позаботиться об этом самостоятельно. Итак, позвольте какао построить ваш стандартный код, но возьмите main.m (при необходимости измените его на .mm для c ++, как в этом примере, потому что я использовал c ++) и удалите одну-единственную строку кода. Вы не позволите какао настроить ваше приложение / окно / представление для вас.
2 / Какао обычно создает AutoreleasePool для вас. Это поможет вам с управлением памятью. Теперь этого больше не будет, поэтому вам нужно его инициализировать. Ваша первая строка в основной функции будет:
[[NSAutoreleasePool alloc] init];
3 / Теперь вам нужно настроить делегата приложения. Мастер XCode уже настроил класс AppDelegate для вас, так что вам просто нужно его использовать. Также мастер уже настроил ваше главное меню и, вероятно, назвал его MainMenu.xib. По умолчанию хорошо, чтобы начать. Убедитесь, что вы #import "YourAppDelegate.h" после строки #import . Затем добавьте следующий код в вашу основную функцию:
[NSApplication sharedApplication];
[NSApp setDelegate:[[[YourAppDelegate alloc] init] autorelease]];
[NSBundle loadNibNamed:@"MainMenu" owner:[NSApp delegate]];
[NSApp finishLaunching];
4 / Mac OS теперь будет знать, о чем приложение, добавит к нему главное меню. Выполнение этого, во всяком случае, ничего не даст, потому что окна пока нет. Давайте создадим это:
[Window setDelegate:[NSApp delegate]];
[Window setAcceptsMouseMovedEvents:TRUE];
[Window setIsVisible:TRUE];
[Window makeKeyAndOrderFront:nil];
[Window setStyleMask:NSTitledWindowMask|NSClosableWindowMask];
Чтобы показать, что вы можете сделать здесь, я добавил строку заголовка и активировал кнопку закрытия. Вы можете сделать намного больше, но мне нужно сначала изучить это.
5 / Теперь, если вы запустите это, вам может повезти и вы увидите окно на микросекунду, но вы, вероятно, ничего не увидите, потому что ... программа еще не в цикле. Давайте добавим цикл и послушаем входящие события:
bool quit = false;
while (!quit)
{
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES];
switch([(NSEvent *)event type])
{
case NSKeyDown:
quit = true;
break;
default:
[NSApp sendEvent:event];
break;
}
[event release];
}
Если вы запустите это, вы увидите окно, которое будет отображаться, пока вы просто не нажмете клавишу. Когда вы нажмете клавишу, приложение сразу закроется.
Вот оно! Но будьте осторожны ... проверьте Монитор активности. Вы увидите, что ваше приложение использует 100% CPU. Зачем? Потому что цикл не переводит процессор в спящий режим. Теперь тебе решать. Вы можете облегчить себе задачу и уснуть (10000); в то время. Это будет много, но не оптимально. Я, вероятно, буду использовать вертикальную синхронизацию opengl, чтобы убедиться, что процессор не используется чрезмерно, и я также буду ждать событий из моих потоков. Может быть, я даже сам проверил прошедшее время и подсчитал время, чтобы сделать общее время на кадр, чтобы у меня была приличная частота кадров.
Для помощи с Opengl:
1 / Добавить каркас cocoa.opengl в проект.
2 / Перед [Window ...] положить:
NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:windowattribs];
NSOpenGLContext *OGLContext = [[NSOpenGLContext alloc] initWithFormat:format shareContext:NULL];
[format release];
3 / После [Window setDelegate: ...] поставить:
[OGLContext setView:[Window contentView]];
4 / Где-то после обработки окна поставить:
[OGLContext makeCurrentContext];
5 / После [выпуск события] поставить:
glClearColor(1, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
[OGLContext flushBuffer];
Это очистит ваше окно до полностью красного на частоте кадров 3300 на моем MacBook Pro 2011.
Опять же, этот код не является полным. Когда вы нажимаете на кнопку закрытия и снова открываете ее, она больше не будет работать. Мне, вероятно, нужно перехватить события для этого, и я их пока не знаю (после дальнейших исследований эти вещи можно сделать в AppDelegate). Кроме того, вероятно, есть много других вещей, которые можно сделать / рассмотреть. Но это только начало. Пожалуйста, не стесняйтесь поправлять меня / заполните меня /...
Если я все сделаю правильно, я мог бы создать для этого веб-страницу учебника, если меня никто не побьет.
Надеюсь, это поможет вам всем!