天天看點

UE4_異步_資料處理(Json)

如果一個數字城市demo,需要将第三方海量的資料進行處理展示,将資料的處理放在GameThread 上顯然是不合理。這個時候需要用多線程解析資料,防止遊戲線程的阻塞

關于異步和多線程

前兩天面試被别人問到一個問題,異步和多線程的差別。面試的人告訴了我一個“答案”。這個“答案”不重要,重要是讓我去思考了下面這段話。

基礎理論固然重要,但是它并不太适合程式設計的初學者。進入程式設計這個行業的人形形色色,我們并不能夠去問一個統一的、仿照他人面試模式的面試。就好像我們做程式設計總在不斷地copy一樣。在我工作的身邊有c++使用20幾年的人,我當然尊重他的理論技術和所謂的“經驗”,但抱歉,這工作的年限和“經驗”并不能夠使他比工作2年的人适合解決現實的問題。有很多時候,它是一個應用場景的問題

“杯”裝完了,開始寫正文。

異步

是目的,

多線程

是實作目的的手段。這就是我認為的差別。

至于更深得、更細的、更廣度的解答,留給那些大佬們去解答吧。

異步解析資料

在解析資料上,最開始我想的是用

new 線程

的方式去解決問題。但看

UE4

的多線程實作起來有點困難,我就在想有沒有更好的辦法。

于是第一種解決思路,是用得

FNonAbandonableTask

。它的實作方式請參考我的這篇部落格UE4_多線程、異步執行任務裡的

FAsyncTask

第一種解決問題的思路,代碼量有點大,有沒有更簡單的辦法呢。于是繼續去搜尋學習,找到了一個函數

AsyncTask

AsyncTask 資料解析

下面就是一些代碼的複制粘貼,不能通用,因為解析的是我的項目

json

,處理的是我自己定義的結構體數組。

.h檔案

DECLARE_DYNAMIC_DELEGATE_OneParam(FDealHttpDataDelegate,
                                  const TArray<FPOIData>&, poiDataArr);

UCLASS()
class WHOVERSIZESCREEN_API UHttpTest : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	                            
	UFUNCTION(BlueprintCallable,Category="testAnalysis")
		static void AnalysisPOIDataCall(UVaRestJsonValue* jsonObject, 
	    const FDealHttpDataDelegate& Event);

}
           

.Cpp

void UHttpTest::AnalysisPOIDataCall(UVaRestJsonValue* jsonObject,const FDealHttpDataDelegate& Event)
{
	// 尋找一個UE4 内置的線程池裡空餘的線程解析資料
	AsyncTask(ENamedThreads::AnyThread,[Event,jsonObject](){
	   // FPOIData 是自定義的結構體數組
		TArray<FPOIData> poiDataArr;
		auto data_arr = jsonObject->AsArray();
		循環解析資料(){
		************
		資料解析部分
		************
		poiData.ID = ID;
		poiData.POIName = POIName;
	    poiData.LocationX = Location_x;
		poiData.LocationY = Location_y;

		poiDataArr.Add(poiData);
		// 将處理好的資料同步到主線程
	    AsyncTask(ENamedThreads::GameThread,[Event,poiDataArr](){
			Event.ExecuteIfBound(poiDataArr);
	             });
	  });
}
           

繼續閱讀