UnrealEngine4多線程任務(wù)構(gòu)建
來源:
52vr |
責(zé)任編輯:傳說的落葉 |
發(fā)布時(shí)間: 2019-06-13 08:39 | 瀏覽量:
這篇文章介紹了UE4中多線程任務(wù)的C++構(gòu)建。
在游戲的主線程中,如果存在一個(gè)很復(fù)雜的運(yùn)算,那么游戲很容易造成卡頓。在這篇文章里,我使用查找第N個(gè)質(zhì)數(shù)的函數(shù)作為范例,并且分別創(chuàng)建了一個(gè)在游戲主進(jìn)程以及新開線程中的調(diào)用。
函數(shù)構(gòu)建
新建一個(gè)AActor,加入如下函數(shù):
[代碼]:
01 |
// Header file. |
02 |
protected : |
03 |
04 |
/* Calculates prime numbers in the game thread */ |
05 |
UFUNCTION(BlueprintCallable, Category = MultiThreading) |
06 |
void CalculatePrimeNumbers(); |
07 |
08 |
/* Calculates prime numbers in a background thread */ |
09 |
UFUNCTION(BlueprintCallable, Category = MultiThreading) |
10 |
void CalculatePrimeNumbersAsync(); |
11 |
12 |
/* The max prime number */ |
13 |
UPROPERTY(EditAnywhere, Category = MultiThreading) |
14 |
int32 MaxPrime; |
新建一個(gè)FuntionLibrary,在其中加入CalculatePrimeNumbers函數(shù),用于計(jì)算結(jié)果:
[代碼]:
01 |
// MainFunctionLibrary.cpp |
02 |
03 |
void UMainFunctionLibrary::CalculatePrimeNumbers(int32 UpperLimit) |
04 |
{ |
05 |
//Calculating the prime numbers... |
06 |
for (int32 i = 1; i <= UpperLimit; i++) |
07 |
{ |
08 |
bool isPrime = true ; |
09 |
for (int32 j = 2; j <= i / 2; j++) |
10 |
{ |
11 |
if (FMath::Fmod(i, j) == 0) |
12 |
{ |
13 |
isPrime = false ; |
14 |
break ; |
15 |
} |
16 |
} |
17 |
18 |
if (isPrime) |
19 |
GLog->Log( "Prime number #" + FString::FromInt(i) + ": " + FString::FromInt(i)); |
20 |
} |
21 |
} |
接著在Actor中添加CalculatePrimeNumbers函數(shù):
[代碼]:
1 |
void AMultiThreadingActor::CalculatePrimeNumbers() |
2 |
{ |
3 |
//Performing the prime numbers calculations in the game thread... |
4 |
UMainFunctionLibrary::CalculatePrimeNumbers(MaxPrime); |
5 |
} |
并且添加一個(gè)CalculatePrimeNumbersAsync函數(shù)的空實(shí)現(xiàn)。在編譯通過之后,在Actor的繼承BP中添加操作如下:
Task的創(chuàng)建
提到多線程就一定是Tasks。在這里我們創(chuàng)建一個(gè)在另一個(gè)線程中執(zhí)行CalculatePrimeNumbers函數(shù)的類。
在這里我們需要新添加一個(gè)類繼承自FNonAbandonableTask的類(可以閱讀引擎源代碼查看該類的詳細(xì)信息)。
[代碼]:
01 |
class PrimeCalculationAsyncTask : public FNonAbandonableTask |
02 |
{ |
03 |
int32 MaxPrime; |
04 |
05 |
public : |
06 |
/*Default constructor*/ |
07 |
PrimeCalculationAsyncTask(int32 MaxPrime) |
08 |
{ |
09 |
this ->MaxPrime = MaxPrime; |
10 |
} |
11 |
12 |
/*This function is needed from the API of the engine. |
13 |
My guess is that it provides necessary information |
14 |
about the thread that we occupy and the progress of our task*/ |
15 |
FORCEINLINE TStatId GetStatId() const |
16 |
{ |
17 |
RETURN_QUICK_DECLARE_CYCLE_STAT(PrimeCalculationAsyncTask, STATGROUP_ThreadPoolAsyncTasks); |
18 |
} |
19 |
20 |
/*This function is executed when we tell our task to execute*/ |
21 |
void DoWork() |
22 |
{ |
23 |
UMainFunctionLibrary::CalculatePrimeNumbers(MaxPrime); |
24 |
} |
25 |
}; |
RETURN_QUICK_DECLARE_CYCLE_STAT宏函數(shù)就是用于處理線程池相關(guān)的信息,而DoWork函數(shù)則是進(jìn)行函數(shù)的調(diào)用。
因此在這里就可以在CalculatePrimeNumbersAsync函數(shù)中來進(jìn)行調(diào)用了。需要注意的是我們需要?jiǎng)?chuàng)建一個(gè)FAutoDeleteAsyncTask來進(jìn)行對(duì)應(yīng)的操作,它能夠保證在task完成后把自己刪除。
[代碼]:
1 |
void AMultiThreadingActor::CalculatePrimeNumbersAsync() |
2 |
{ |
3 |
auto task = new FAutoDeleteAsyncTask<primecalculationasynctask>(MaxPrime); |
4 |
if (task) |
5 |
task -> StartBackgroundTask(); |
6 |
}</primecalculationasynctask> |
如果讀者想要了解更多關(guān)于UE4中的多線程操作,可以從源代碼中的AsyncWork.h開始讀起。
-
分享到:
相關(guān)文章
網(wǎng)友評(píng)論
您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)
關(guān)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼: 看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門