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