首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android上的PBO不能提高glReadPixels的性能

Android上的PBO不能提高glReadPixels的性能
EN

Stack Overflow用户
提问于 2016-12-03 05:24:29
回答 1查看 1.1K关注 0票数 1

我想对OpenGL中当前帧的屏幕截图进行进一步的处理,并试图通过使用PBO异步读取框架缓冲区来提高glReadPixels的性能。

我的印象是,glReadPixels在GL_PIXEL_PACK_BUFFER绑定到缓冲区后应该立即返回,但它实际上需要类似的时间,甚至比不使用PBO花费更多的时间。

以下是我的代码样本:

代码语言:javascript
复制
// Setup PBO
GLES30.glGenBuffers(nPbo, pboIndex, 0);
for(int i=0;i<nPbo; i++){
    GLES30.glBindBuffer (GL_PIXEL_PACK_BUFFER, pboIndex[i]);
    GLES30.glBufferData(GL_PIXEL_PACK_BUFFER, size, null,GL_STREAM_READ);
}
GLES30.glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

......

// For each frame, trigger async transfer of framebuffer to PBO.
// Note that I don't even map the PBO to memory yet
GLES30.glBindBuffer (GL_PIXEL_PACK_BUFFER, pboIndex[index]);
// The following is a JNI method to overload glReadPixels in GLES20.glReadPixels,
// to allow passing int offset to the last param in order to use PBO, 
// and slowdown (around 500ms on my device) happens here
GLES3PBOReadPixelsFix.glReadPixelsPBO(0, 0, mWidth, mHeight, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE, 0); 
GLES30.glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);

基于这篇文章,减速的原因可能是内部格式(可能是GL_BGRA )和像素传输格式(在我的代码中是GL_RGBA )之间的转换。将传输格式更改为GL_RGB将使glReadPixels的延迟减少到大约100 to,但是当我用GLES30.glMapBufferRange映射缓冲区时,输出帧看起来不正确。我也尝试了GL_BGRA格式的GLES11Ext,但是它会导致glReadPixel中的GL_INVALID_OPERATION。

有没有其他方法可以让安卓系统上的glReadPixels立即返回,这样就可以提高性能?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-06 06:11:47

正如Reto所建议的,这最终是一个具体的实现问题。我最初测试的GPU是Adreno 306。当我在三星Note 4 (Adreno 420)上测试相同的代码时,它正常工作。因此,对于这类问题,在不同设备和GPU上进行测试总是值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40944553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档