У меня есть CVPixelBuffer
, который я пытаюсь эффективно нарисовать на экране.
Неэффективный способ превращения в NSImage
работает, но очень медленно, пропуская около 40% моих кадров.
Поэтому я попытался отобразить его на экране с помощью CIContext
drawImage:inRect:fromRect
. CIContext
был инициализирован с помощью NSOpenGLContext
, представление которого было настроено на представление моего VC. Когда у меня есть новое изображение, я вызываю метод drawImage
, который не выдает никаких ошибок... но и ничего не отображает на экране (он регистрировал ошибки, когда мои контексты были настроены неправильно).
Я пытался найти пример того, как это делается в MacOS, но в настоящее время все кажется для iOS.
РЕДАКТИРОВАТЬ:
Вот часть кода, который я использую. Я пропустил ненужные разделы
viewDidLoad
я запускаю контексты GL и CI
NSOpenGLPixelFormatAttribute pixelFormatAttr[] = {
kCGLPFAAllRenderers, 0
};
NSOpenGLPixelFormat *glPixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes: pixelFormatAttr];
NSOpenGLContext *glContext = [[NSOpenGLContext alloc] initWithFormat:glPixelFormat shareContext:nil];
glContext.view = self.view;
self.ciContext = [CIContext contextWithCGLContext:glContext.CGLContextObj pixelFormat:glPixelFormat.CGLPixelFormatObj colorSpace:nil options:nil];
Затем, когда новый кадр готов, я делаю:
dispatch_async(dispatch_get_main_queue(), ^{
[vc.ciContext drawImage:ciImage inRect:vc.view.bounds fromRect:ciImage.extent];
vc.isRendering = NO;
});
Я не уверен, что звоню в нужное место, но я не могу понять, куда это должно идти.
[glContext makeCurrentContext];
. И не забудьте поменять местами буферы ([glContext flushBuffer];
) после рендеринга. - person Ripi2   schedule 20.09.2017drawImage:
в его методеdrawRect:
... и вызвавglFlush()
в конце. Однако изображение отображалось в правом верхнем углу экрана и было очень размытым. Позиционирование напоминает мне о том, как работает рендерер GL на iOS... так что у меня есть идея, как это исправить. - person CatalinM   schedule 20.09.2017drawImage:
CIContext
работает только с контекстами, созданными изCGLContext
илиCGContext
.glFlush()
— это стандартный вызов OpenGL, которому, по общему признанию, не было места в моей настройке как таковому... в любом случае, если мне не удастся найти простой способ рендеринга этого черезCIContext
, я сделаю чистая реализация OpenGL и покончим с этим. - person CatalinM   schedule 20.09.2017