簡體   English   中英

OpenGL多線程比使用單線程慢

[英]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.

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