? 欧美成人在线播放乱妇,日韩久久综合网,熟天天做天天爱天天爽综合网
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

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中添加操作如下:
 

Unreal Engine 4 —— 多線程任務(wù)構(gòu)建

 
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)閉

全部評(píng)論:0條

推薦
熱門