NSOpenGLLayer и многопоточность - PullRequest
3 голосов
/ 13 сентября 2011

Я написал 3D-просмотрщик, используя Какао. Визуализация OpenGL выполняется в отдельном потоке, который создает свой собственный NSOpenGLContext.

Без обработки слоя метод drawRect трехмерного вида вызывается при обновлении, а поток OpenGL обновляет его, и все работает отлично ...

Теперь я должен реализовать приложение, используя слои Какао. Когда создается 3D NSView, создается подкласс NSOpenGLLayer и прикрепляется к представлению. Метод

(void)drawInOpenGLContext:NSOpenGLContext *)ctx
              pixelFormat:(NSOpenGLPixelFormat *)pixelFormat
             forLayerTime:(CFTimeInterval)timeInterval
              displayTime:(const CVTimeStamp *)timeStamp; 

вызывается Cocoa, но я не могу заставить мой поток OpenGL визуализировать что-либо.

Я пытался использовать контекст OpenGL, переданный drawInOpenGLContext в потоке OpenGL, я попытался сделать

[layer setOpenGLContext:ctx]

в потоке OpenGL с контекстом OpenGL, созданным в потоке и т. Д., Но ничего не работает.

1 Ответ

0 голосов
/ 29 августа 2013

Вы не забыли вызвать setWantsLayer на вашем NSView?Вам нужно вызывать это из NSView, чтобы сделать его размещением на уровне слоя.См. Документацию по NSView setWantsLayer.

_testOglView = [[NSView alloc]initWithFrame:[self.view bounds]];
[_testOglView setLayer:[[TestOpenGLLayer alloc] init]];
[_testOglView setWantsLayer:YES];
[self.view addSubview:_testOglView];

В моем классе TestOpenGLLayer мне нужно было только определить функцию drawInOpenGLContext.Я добавил к нему мои команды opeNGL, и представление правильно отобразило слой.Мне не нужно было вызывать [layer setContext].

...