1. 程式人生 > 其它 >UE4_非同步_資料處理(Json)

UE4_非同步_資料處理(Json)

技術標籤:UE4虛幻4-C ++數字城市UE4

如果一個數字城市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);
	             });
	  });
}