FrameBuffer в файл внутри libgdx или OpenGL

Я стараюсь делать скриншоты наиболее эффективным способом. Я думаю, что использование FrameBuffer — это самый эффективный способ делать снимки экрана, потому что я могу обрабатывать данные в другом потоке, а не в потоке рендеринга. Как я могу получить информацию из FrameBUffer и передать ее в файл?

FrameBuffer m_fbo;

render(){
   m_fbo = new FrameBuffer(Format.RGB565, (int)(w * m_fboScaler), (int)(h * m_fboScaler), false);
   m_fboRegion = new TextureRegion(m_fbo.getColorBufferTexture());
   m_fboRegion.flip(false, true);
   m_fbo.begin();
   ...rendering...
   m_fbo.end();
   writeTextureRegionToFile(); - i need some lines of code for the implementation of this method
}

person Duna    schedule 05.04.2013    source источник


Ответы (1)


Содержимое FrameBuffer находится в памяти, управляемой OpenGL, поэтому вам (насколько я понимаю) по-прежнему необходимо извлекать эти байты с помощью API OpenGL в потоке рендеринга. В частности, вам нужен класс ScreenUtils чтобы получить byte[], содержащий RGBA8888 содержимое вашего FrameBuffer.

Как только вы получите необработанные байты, вы, конечно, можете выполнять любое сжатие/преобразование/вывод в другом потоке. Существует сообщение на форуме, в котором есть быстрый и грязный редактор PNG. . Специфичный для Libgdx (?) формат CIM также является опцией (см. ="nofollow">PixmapIO class), но сначала вам придется преобразовать байты в Pixmap.

person P.T.    schedule 05.04.2013
comment
все еще нужно получить эти байты с помощью API OpenGL в потоке рендеринга - при этом fps падает до 6. Было бы полезно, если бы это можно было сделать в отдельном потоке. - person Duna; 26.06.2013
comment
Libgdx (и LWJGL под ним) позволяют только одному потоку выполнять вызовы OpenGL, поэтому мало надежды получить его из потока рендеринга. - person P.T.; 26.06.2013