Настройка непрерывного рендеринга в приложении Mac OSX Cocoa с использованием OpenGL - PullRequest
2 голосов
/ 30 марта 2012

Я начинаю работать над редактором и эволюционером системы частиц 3D. Я делал нечто подобное в прошлом с OpenGL, но на этот раз я делаю приложение Mac OS X Cocoa. У меня просто несколько вопросов относительно кода, с которым я продолжаю сталкиваться при настройке OpenGL.

1) Почему я вижу много людей в сети, использующих ...

[self setNeedsDisplay:YES];

Это правильный способ заставить OpenGL отображать, теперь я понимаю, что это приводит к вызову drawRect, но правильный ли это путь?

2) Является ли drawRect правильным методом, который я должен переопределить для метода рендеринга фрейма?

Вот код, с которым я продолжаю сталкиваться в сети:

-(void) prepareOpenGL {
    [[self window] makeFirstResponder:self];
    glClearColor(1.0f, 1.0f, 0.0f, 10.f);

    NSTimer *timer = [NSTimer timerWithTimeInterval:1.0/60.0 target:self selector:@selector(idle:) userInfo:nil repeats:YES];
   [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}

-(void)idle:(NSTimer *)timer {
    if(![[NSApplication sharedApplication] isHidden])
        [self setNeedsDisplay:YES];
}
-(void) drawRect:(NSRect)dirtyRect {
    glClear(GL_COLOR_BUFFER_BIT);
}

1 Ответ

4 голосов
/ 30 марта 2012

Вы не указали, будете ли вы рисовать свой контент OpenGL в NSOpenGLView или в CAOpenGLLayer.У этих двух есть немного разные способы обновления их контента для отображения на экране.

Для NSOpenGLView вам не нужно обновлять представление в его методе -drawRect:.На самом деле, я думаю, вы не захотите запускать -setNeedsDisplay: для обновления NSView из-за некоторых накладных расходов, которые могут возникнуть.В одном из моих приложений я использую CVDisplayLink для запуска обновлений со скоростью 60 FPS в рамках своих собственных пользовательских методов рендеринга в NSOpenGLView.Ни одно из этих прикосновений -drawRect:.Кадры выводятся на экран при вызове [[self openGLContext] flushBuffer], а не при принудительном перерисовке NSView.

CAOpenGLLayers немного отличаются тем, что вы переопределяете - drawInCGLContext:pixelFormat:forLayerTime:displayTime: с помощью пользовательского кода рендеринга.Этот метод запускается в ответ на ручное -setNeedsDisplay или самим CAOpenGLLayer, если его свойство asynchronous установлено в YES.Он знает, когда он будет готов представить новый контент по логическому значению, которое вы указываете в ответ на -canDrawInCGLContext:pixelFormat:forLayerTime:displayTime:.

Я использовал оба из них, и у каждого есть свои преимущества.CAOpenGLLayers значительно упрощают наложение других элементов пользовательского интерфейса на ваш рендеринг OpenGL, но их методы рендеринга могут быть затруднены для правильной работы из фонового потока.NSOpenGLViews можно легко обновлять в фоновом потоке, используя CVDisplayLink, но они могут использоваться для наложения контента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...