UE4多執行緒任務系統詳解

2021-09-25 03:07:32 字數 2229 閱讀 3837

首先,了解一下該系統重要的資料型別.

1. fqueuedthreadpool:虛基類,佇列執行緒池,  fqueuedthreadpoolbase繼承自fqueuedthreadpool,

fqueuedthreadpoolbase維護了乙個tarrayqueuedwork(需要被執行的工作),  tarrayallthreads(所       有的執行緒)

tarrayqueuedthreads ( 空閒的執行緒)

2. fqueuedthread繼承自frunnable,  代表了執行緒的執行體,但並非執行緒本身。乙個執行緒建立後將會執行frunnable的run()函式.

3. frunnablethread代表了執行緒本身,該類會派生出平台相關的子類,win32下對應的是frunnablethreadwin,建議讀者看看某個平台下的具體實     現。在建立時需要指定乙個frunnable,用於執行緒執行。

4. fevent: 虛基類,提供了事件操作的介面,用於執行緒的啟用掛起, 該類會派生出平台相關的子類,win32下對應的是feventwin。

兩個重要介面: wait()將會使執行緒掛起,trigger()將會啟用執行緒,配對使用。

了解了相關的資料型別後,可以開始剖析多執行緒任務系統的流程了,先從asyncwork.h開始。

asyncwork.h中有幾個使用多執行緒任務系統的例子,先來了解我們如何使用多執行緒來執行任務。

大體流程如下:    

先自定義乙個任務類,用於執行我們的任務

class exampleautodeleteasynctask : public fnonabandonabletask

//任務模板類,其作用是託管我們自定義的任務類,如執行完任務後自動銷毀.

template

class fautodeleteasynctask : private iqueuedwork

if (queuedpool)

else

}void dowork()

virtual void dothreadedwork()

void startsynchronoustask()

void startbackgroundtask()

//使用多執行緒任務的例子

void example()

如何使用多執行緒來執行任務已經展示完了,就是這麼easy!

接下來分析多執行緒來執行流程,重點是queuedpool例項化時做了什麼 以及 queuedpool->addqueuedwork(this);

我們先看一下queuedpool例項是如何得到的:queuedpool = gthreadpool;  而gthreadpool是在引擎初始化的時候建立的,**在launchengineloop檔案裡,如下:

if (fplatformprocess::supportsmultithreading())

gthreadpool  建立之後便呼叫了它的create

gthreadpool->create(innumqueuedthreads)

}。。。。。。。    

}在fqueuedthread的create介面裡,建立了平台相關的執行緒和系統事件,該執行緒的執行體是fqueuedthread的run函式.

fqueuedthread::create()

講到這裡,先小結一下,例項化gthreadpool實際上也就是建立了n個執行緒,每個執行緒都處於乙個不斷掛起,醒來,掛起的迴圈中。

這n個執行緒用於執行非同步任務,使用者需要執行自定義的任務可以參考asyncwork.h的例子。

那麼,一定在某個地方會呼叫doworkevent->trigger()使run能夠跳出死迴圈,執行後面的**。

聰明的讀者一定想到了在前面提到的 (gthreadpool等於queuedpool)queuedpool->addqueuedwork(this), 沒錯,就是它,在addqueuedwork裡面便間接呼叫了doworkevent->trigger()

queuedpool->addqueuedwork(inqueuedwork)

if (thread != nullptr)

else

queuedwork.add(inqueuedwork);

fqueuedthread::dowork(iqueuedwork* inqueuedwork)

呼叫doworkevent->trigger()之後,執行緒的run()得以繼續執行,接下來的工作便是不斷取出task來執行.

fqueuedthread::run()

}

UE4多執行緒

frunnable為我們提供了四個重要的介面 class core api frunnable virtual void exit init是對frunnable物件的初始化,它是由frunnablethread在建立執行緒物件後,進入執行緒函式的時候立即被frunnablethread呼叫的函式,...

UE4非同步程式設計專題 多執行緒

frunnable為我們提供了四個重要的介面 class core api frunnable virtual void exit init是對frunnable物件的初始化,它是由frunnablethread在建立執行緒物件後,進入執行緒函式的時候立即被frunnablethread呼叫的函式,...

UE4換裝系統

角色骨骼模型換裝原理無非就是把角色模型拆分多個部分,每部份必須使用同一套骨骼,拆解的部分根據所在骨骼空間位置找到相應父主骨骼空間位置,然後設定合成輸出。舉個簡單例子 假如把角色拆分四部分,分別如下 uskeletalmeshcomponent bodysmc 作為父主骨骼模型 uskeletalme...