我在做調整,用OpenGL圖像,所以我需要這樣的工作流程:使用glTexImage2D可以達到什麼樣的數據速率?
- 上傳的圖像數據,以顯卡
- 變換圖像
- 下載結果返回給主存儲
每一步都會停止,直到上一步完成。這可以。我需要儘快完成所有這些步驟。與其他操作複用對我來說不會有任何改進;我需要儘快完成這個圖像。
現在,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? (我覺得「不」,請告訴我,如果是這樣的話)
有沒有一種工具可以用來驗證這是我係統的速度,從而證明我的代碼,或者肯定是把責任歸咎於我碼?
您是否驗證過上傳時沒有自動格式轉換的風險?這種轉換可能會由您的驅動程序在軟件中完成,因此速度很慢。 – unwind
@unwind我還沒有驗證過這個。我會怎麼做呢?不過,這仍然很奇怪。我正在通過網絡下載圖像,解壓jpeg並在160ms內將所有R與B切換。格式轉換應該非常複雜,需要花費一秒鐘..? –
如果多次使用相同的紋理對象並且紋理尺寸或內部格式不會改變,那麼當然使用'glTexSubImage2D'而不是'glTexImage2D'將是一個開始,因爲這不會完全重新分配整個每次都會產生紋理,這可能會導致dirver /硬件方面的維護工作量很大。 –