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