2012-03-29 2 views
2

Я начинаю работать над редактором 3D-частиц и эволюционистом. Ive сделал что-то подобное в прошлом с OpenGL, но на этот раз я делаю приложение mac os x cocoa. У меня просто есть несколько вопросов относительно кода, который я использую при настройке OpenGL.Настройка непрерывного рендеринга в приложении mac osx для какао с использованием OpenGL

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

[self setNeedsDisplay:YES]; 

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

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

Heres код, который я продолжаю работать в в Интернете:

-(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); 
} 

ответ

4

Вы не указали, будете ли вы рисовать контент 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, но это медведь для наложения содержимого.

+0

В настоящее время я расширяю NSOpenGLView. Что бы вы рекомендовали использовать программируемую трубопроводную линию OpenGL для рендеринга тысяч частиц в трехмерном пространстве? –

+0

@JimmyBouker - Оба будут обрабатывать задачи рендеринга так же хорошо. Если вы когда-либо планируете что-то сделать поверх своего взгляда, CAOpenGLLayer сэкономит вам время. Если вам нужно многопоточное рендеринг, NSOpenGLView делает это немного проще. –

+0

Большое спасибо зоопарку, у меня определенно будет многорежимный рендеринг, и я не буду ничего класть поверх своей поверхности. Благодарю Брэда –

Смежные вопросы