Обновите NSOpenGLView в цикле, не отпуская основной цикл запуска в Какао - PullRequest
2 голосов
/ 21 июня 2011

Я создаю приложение Cocoa / OpenGL, в течение примерно 2 секунд за один раз мне нужно контролировать каждый видеокадр, а также записывать на цифровое устройство ввода-вывода. Если после выполнения вызовов openGL я освобождаю основной поток (например, если я выполняю вызовы openGL внутри таймерного метода с интервалом около 0,01 с), openGLview обновляется при каждом вызове glFinish().
Но если я вместо этого продолжу загружать основной поток, как в течение 2-секундного цикла while, вызовы openGl не будут работать (удивительно, что первый вызов glFinish() будет работать, а остальные не будут). В документации сказано, что glFinish должен блокировать поток до тех пор, пока не будут выполнены команды gl. Кто-нибудь может, пожалуйста, помочь мне понять, что здесь происходит, или предоставить решение этой проблемы. Чтобы было понятно, я хочу представить 200 кадров один за другим, не пропуская кадр и пометив каждый кадр как обновленный, записав в цифровой порт ввода-вывода (у меня нет проблем с этим) все на Snow Leopard.

1 Ответ

4 голосов
/ 21 июня 2011

Это не совсем мой отдел - довольно ванильный пользователь NSOpenGLView - но из Mac OpenGL docs похоже, что вы, возможно, захотите использовать CVDisplayLink ( Q & A1385 ) за это.Даже если это не сработает, другие вещи там, вероятно, должны помочь.

РЕДАКТИРОВАТЬ

Я только провел некоторые базовые испытания по этому вопросу, но выглядитнапример, вы можете делать то, что хотите, до тех пор, пока вы сначала устанавливаете правильный контекст OpenGL, а затем меняете буферы после каждого кадра (при условии, что вы используете контекст с двойной буферизацией):

// inside an NSOpenGLView subclass, somewhere outside the usual drawing loop
- (void) drawMultipleFrames
{
    // it might be advisable to also do a [self lockFocus] here,
    // although it seems to work without that in my simple tests

    [[self openGLContext] makeCurrentContext];

    // ... set up common OpenGL state ...

    for ( i = 0; i < LOTS_OF_FRAMES; ++i )
    {
        // ... draw your frame ...

        glFinish();
        glSwapAPPLE();
    }

    // unlockFocus here if locked earlier
}

Я ранее пытался использовать *Вместо 1016 * в конце каждого кадра - это не требует glSwapAPPLE, но не блокирует, как glFinish, так что вы можете получить растоптанные кадры друг над другом.Кажется, это работает нормально с другими приложениями, работает в фоновом режиме и т. Д., Но, конечно, YMMV.

...