簡體   English   中英

Android上的PBO並沒有提高glReadPixels的性能

[英]PBO on Android doesn't improve glReadPixels performance

我想在OpenGL中截取當前幀的屏幕截圖以進行進一步處理,我試圖通過使用PBO異步讀取幀緩沖區來提高glReadPixels的性能。

我認為GL_PIXEL_PACK_BUFFER綁定到緩沖區后的glReadPixels應該立即返回,但它實際上需要比不使用PBO更多或更多的時間。

以下是我的代碼示例:

// 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的延遲減少到大約100ms,但是當我使用GLES30.glMapBufferRange映射緩沖區時,輸出幀看起來不正確。 我還在GLES11Ext中嘗試了GL_BGRA格式,但它會在glReadPixel中導致GL_INVALID_OPERATION。

有沒有其他方法可以讓Android上的glReadPixels立即返回,以便PBO可以提高性能?

正如Reto所建議的那樣,事實證明這是一個特定於實現的問題。 我最初測試的GPU是Adreno 306.當我在Samsung Note 4(Adreno 420)上測試相同的代碼時,它按預期工作。 因此,在不同的設備和GPU上測試此類問題總是值得的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM