UE4_非同步_資料處理(Json)
阿新 • • 發佈:2021-02-15
如果一個數字城市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);
});
});
}