AVCaptureSession и Cocos2d-x на macOS

Я внедряю функцию записи геймплея в кроссплатформенную игру Cocos2d-x. Мне удалось реализовать эти функции для iOS и Android, но я изо всех сил пытаюсь добиться хорошей производительности на macOS. Я успешно реализовал запись геймплея с помощью функции glReadPixels, но производительность очень низкая. Я получаю около 10-15 кадров в секунду на моем Macbook Pro. Я пытался реализовать AVCaptureSession для записи всего экрана, а затем обрезать необходимую область, как в образце AVScreenShack от Apple, но я получаю ошибки Cocos2d-x Renderer.

Журнал ошибок выглядит так:

OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/2d/CCParticleSystemQuad.cpp postStep 458
OpenGL error 0x0506 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445
FrameBuffer Status Error 33305
OpenGL error 0x0506 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445
FrameBuffer Status Error 33305
FrameBuffer Status Error 33305
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCRenderer.cpp saveRenderState 161
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCTextureAtlas.cpp drawNumberOfQuads 691
FrameBuffer Status Error 33305
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCRenderer.cpp restoreRenderState 192
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/2d/CCParticleSystemQuad.cpp postStep 458
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/2d/CCParticleSystemQuad.cpp postStep 458
OpenGL error 0x0506 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445
FrameBuffer Status Error 33305
OpenGL error 0x0506 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCFrameBuffer.cpp applyFBO 445
FrameBuffer Status Error 33305
FrameBuffer Status Error 33305
OpenGL error 0x0501 in /Users/milosz/Documents/job/butterflix/blix/cocos2d/cocos/renderer/CCRenderer.cpp saveRenderState 161

Моя первая мысль заключалась в том, что AVCaptureSession использует NSOpengGLContext для рендеринга кадров, поэтому я проверил, не изменился ли контекст, но это не так. Я также пробовал CVOpenGLTextureCache в соответствии с методом, который я использую на iOS, но безуспешно.

Однако, когда я запускаю пример AVScreenShack во время игры, он записывает весь экран и не мешает рендереру Cocos2d-x. Я думаю, это потому, что оба приложения работают в отдельных основных потоках, и поэтому не возникает никаких условий гонки. Могу ли я воспроизвести такое поведение в одном приложении для Mac? Или есть другой способ записать геймплей Cocos2d-x с приемлемой производительностью на MacOS?


person kuvukala    schedule 31.01.2017    source источник


Ответы (1)


У меня была похожая проблема, но с приложением Qt. После вызова [AVCaptureSession startRunning] мой OpenGL перестал работать должным образом. В моем случае текущий NSOpenGLContext был nil после вызова startRunning. Итак, решение для меня было:

QOpenGLContext *currentContext = QOpenGLContext::currentContext();
QSurface *currentSurface = currentContext->surface();
[m_Session startRunning];
currentContext->makeCurrent(currentSurface);
person zangel    schedule 23.03.2021