2013-04-16 28 views
2

我在做調整,用OpenGL圖像,所以我需要這樣的工作流程:使用glTexImage2D可以達到什麼樣的數據速率?

  1. 上傳的圖像數據,以顯卡
  2. 變換圖像
  3. 下載結果返回給主存儲

每一步都會停止,直到上一步完成。這可以。我需要儘快完成所有這些步驟。與其他操作複用對我來說不會有任何改進;我需要儘快完成這個圖像。

現在,2非常快速,3不是很糟糕,很可能是因爲結果是原始圖像的縮略圖 - 極小。

1是我的瓶頸。我測量在1.2秒內上傳20MB的圖像數據。這使我的東西像16MB /秒。在互聯網上的其他地方,我閱讀了關於人們expecting 5.5GB/s, and being disappointed by 2.5GB/s

不要緊,如果我直接使用glTexImage2D或通過PBO做到這一點。我已經嘗試了兩種方法,並且沒有測量出差異這是有道理的,因爲我沒有與任何東西複用。對於我的管道,無論如何,我都無法立即使用PBO。

我能想到的其餘解釋是這樣的:我的系統就這麼慢。我的顯卡是NVIDIA GeForce GTX 285(GT200),通過16x PCI-Express連接。我的測量速度是16MB/s,還是我忽略了一些東西?是否存在一個可以讓我測量最大數據速率的實用工具(一般用於Ubuntu/Linux)?

我不覺得舒適的結論是系統是這麼慢;畢竟,我的網絡接口速度非常快(1Gb/s〜125MB/s),並且只有cat-5e電纜才能實現這一目標。


更多細節:glTexImage2D情況下是非常簡單的:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width, image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, rawData); 

時序這條線單獨措施〜1200ms。

我也把它翻譯使用PBO,提到:

GLuint pbo = 0; 
glGenBuffers(1, &pbo); 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); 
glBufferData(GL_PIXEL_UNPACK_BUFFER, data_size, pixels, GL_STREAM_DRAW); 
glTexImage2D(target, level, internalformat, width, height, border, format, type, 0); 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0); 
glDeleteBuffers(1, &pbo);  

我也試圖與memorymapping:

glBufferData(GL_PIXEL_UNPACK_BUFFER, data_size, 0, GL_STREAM_DRAW); 
GLubyte* ptr = (GLubyte*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY); 
std::copy(pixels, pixels+data_size, ptr); 
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER); 

在時機沒有明顯差異的任何解決方案之間。


上傳紋理數據時我應該期待什麼樣的數據速率?

我的設置是否合理16MB/s? (我覺得「不」,請告訴我,如果是這樣的話)

有沒有一種工具可以用來驗證這是我係統的速度,從而證明我的代碼,或者肯定是把責任歸咎於我碼?

+0

您是否驗證過上傳時沒有自動格式轉換的風險?這種轉換可能會由您的驅動程序在軟件中完成,因此速度很慢。 – unwind

+0

@unwind我還沒有驗證過這個。我會怎麼做呢?不過,這仍然很奇怪。我正在通過網絡下載圖像,解壓jpeg並在160ms內將所有R與B切換。格式轉換應該非常複雜,需要花費一秒鐘..? –

+0

如果多次使用相同的紋理對象並且紋理尺寸或內部格式不會改變,那麼當然使用'glTexSubImage2D'而不是'glTexImage2D'將是一個開始,因爲這不會完全重新分配整個每次都會產生紋理,這可能會導致dirver /硬件方面的維護工作量很大。 –

回答

0

不,我並不期待更高的數據傳輸速率。

我的錯誤是我的數據上傳定時過高,所以我無意中將new Uint8Array(image.buffer)包含在我的計時中。在一個時間內,我看到這個電話花費了1190ms,而glTexImage2D花了10ms。

下一次課:在特定的C調用之前和之後執行確切的時間。只有那時我才發現問題。

非常感謝@ChristianRau手持我通過調試。

相關問題