[英]OpenGL Multithreading slower than using a single thread
我正在使用Windows 7並使用VC ++ 2010,這是一個32位應用程序
我試圖讓我的渲染器工作多線程,但事實證明我做得比沒有多線程慢。
我希望它有主線程將渲染命令添加到列表,以及工作線程執行這些命令的渲染。
這一切都確實發生了,它可以很好地吸引屏幕,但是這樣做時我得到的fps就更少了......
我使用Fraps中的基准工具來獲取這些數據:
時間是基准測試的時間,在這種情況下為30秒。
最小值,最大值,平均值均為FPS值。
使用多線程:
Frames, Time (ms), Min, Max, Avg
28100, 30000, 861,1025, 936.667
沒有多線程:
Frames, Time (ms), Min, Max, Avg
21483, 30000, 565, 755, 716.100
這是一些偽代碼(帶有相關的事件函數調用):
Main Thread:
Add render comands to queue
ResetEvent (renderCompletedEvent);
SetEvent (renderCommandsEvent);
WaitForSingleObject (renderCompletedEvent, INFINITE);
Render Thread:
WaitForSingleObject (renderCommandsEvent, INFINITE);
Process commands
SetEvent (renderCompletedEvent);
ResetEvent (renderCommandsEvent);
你為什么期望這會更快?
只有一個線程可以執行任何操作,您可以在一個線程中創建命令,並在另一個線程中發出信號並等待它完成,這只需要在第一個線程中執行它,只需要更多的開銷。
要利用多線程,您需要確保兩個線程同時執行某些操作。
我不是opengl專家,但一般來說,重要的是要意識到線程實際上並不用於加速,它們是為了保證某些子系統以整體速度為代價響應。 這可能會保留一個gui線程和一個網絡線程,以確保gui和網絡響應。 這實際上是以主線程的性能成本完成的。 CPU將把1/3的時間用於主線程,將1/3的時間用於網絡線程,將1/3的時間用於gui線程,即使沒有gui事件可以處理也沒有進出網絡。 因此,無論主線程在做什么,只能獲得非多線程情況下CPU時間的1/3。 好處是,如果大量數據開始通過網絡到達,則始終保留處理它的CPU時間(如果沒有可以填充網絡緩沖區,那么可能會很糟糕,然后其他數據開始被丟棄或覆蓋)。 可能的例外是,如果多個線程在不同的核心上運行。 但是,即使這樣小心,核心也可以共享相同的緩存,因此如果兩個核心使每個其他緩存無效,性能可能會急劇下降,而不會提高。 如果內核共享一些資源以將數據移入GPU或從GPU移出數據,或者具有一些其他共享限制資源,則這又可能導致性能損失,而不是增益。
簡而言之,單個CPU系統上的線程總是關於子系統的響應性,而不是性能。 當不同的線程在多個核心上運行時,可能會有性能提升(默認情況下,這些窗口通常不會執行,但可以強制執行)。 但是,當這些內核共享某些資源可能會造成傷害,而不是幫助時,例如共享緩存空間或上下文中的某些共享GPU相關資源時,可能會出現這樣的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.