1. 源代码

  AsyncWork.h

2. 多线程的使用

  参考文档:https://wiki.unrealengine.com/Using_AsyncTasks

  当我们需要执行一个需要很长时间的任务时,放在主线程里会导致很卡,把此任务放到其他线程里则会好很多,此时多线程就可以起到关键的作用了。

  在UE4里,我们可以使用FAsyncTask 或者FAutoDeleteAsyncTask。

  使用FAsyncTask 时,我们需要手动停止或删除任务;使用FAutoDeleteAsyncTask时,系统则会自动在任务结束后,删除任务。

  需要先建个继承FNonAbandonableTask的类,如源码中的例子:

  1. class ExampleAutoDeleteAsyncTask : public FNonAbandonableTask
  2. {
  3. friend class FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>;
  4.  
  5. int32 ExampleData;
  6.  
  7. ExampleAutoDeleteAsyncTask(int32 InExampleData)
  8. : ExampleData(InExampleData)
  9. {
  10. }
  11.  
  12. void DoWork()
  13. {
  14. ... do the work here
  15. }
  16.  
  17. FORCEINLINE TStatId GetStatId() const
  18. {
  19. RETURN_QUICK_DECLARE_CYCLE_STAT(ExampleAutoDeleteAsyncTask, STATGROUP_ThreadPoolAsyncTasks);
  20. }
  21. };

  然后具体调用就是:

  1. void Example()
  2. {
  3. // start an example job
  4. (new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>()->StartBackgroundTask();
  5.  
  6. // do an example job now, on this thread
  7. (new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>()->StartSynchronousTask();
  8. }

  注意:StartBackgroundTask()是在另一个线程中执行此任务;StartSynchronousTask()是在当前线程中马上执行此任务。

  举个例子:

  1. .h:
  2.  
  3. #pragma once
  4.  
  5. #include "CoreMinimal.h"
  6. #include "GameFramework/Actor.h"
  7. #include "Kismet/KismetSystemLibrary.h"
  8. #include "MyActor.generated.h"
  9.  
  10. UCLASS()
  11. class ASYNCWORKSTUDY_API AMyActor : public AActor
  12. {
  13. GENERATED_BODY()
  14.  
  15. public:
  16. // Sets default values for this actor's properties
  17. AMyActor();
  18.  
  19. protected:
  20. // Called when the game starts or when spawned
  21. virtual void BeginPlay() override;
  22.  
  23. public:
  24. // Called every frame
  25. virtual void Tick(float DeltaTime) override;
  26.  
  27. void TestAsync(FString Content);
  28.  
  29. //多线程例子
  30. void Example();
  31.  
  32. };
  33.  
  34. class ExampleAutoDeleteAsyncTask : public FNonAbandonableTask
  35. {
  36. friend class FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>;
  37.  
  38. int32 ExampleData;
  39.  
  40. UObject* Object;
  41.  
  42. AMyActor* Target;
  43.  
  44. ExampleAutoDeleteAsyncTask(int32 InExampleData, UObject* InObject, AMyActor* InTarget)
  45. : ExampleData(InExampleData),
  46. Object(InObject),
  47. Target(InTarget)
  48. {
  49. }
  50.  
  51. void DoWork()
  52. {
  53. UKismetSystemLibrary::PrintString(Object, FString::FromInt(ExampleData));
  54.  
  55. //调用AMyactor的测试函数
  56. if (Target) Target->TestAsync("Success");
  57. }
  58.  
  59. FORCEINLINE TStatId GetStatId() const
  60. {
  61. RETURN_QUICK_DECLARE_CYCLE_STAT(ExampleAutoDeleteAsyncTask, STATGROUP_ThreadPoolAsyncTasks);
  62. }
  63. };
  64.  
  65. .cpp:
  66. #include "MyActor.h"
  67.  
  68. // Sets default values
  69. AMyActor::AMyActor()
  70. {
  71. // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
  72. PrimaryActorTick.bCanEverTick = true;
  73.  
  74. }
  75.  
  76. // Called when the game starts or when spawned
  77. void AMyActor::BeginPlay()
  78. {
  79. Super::BeginPlay();
  80. UKismetSystemLibrary::PrintString(this, "Hello");
  81. Example();
  82.  
  83. }
  84.  
  85. // Called every frame
  86. void AMyActor::Tick(float DeltaTime)
  87. {
  88. Super::Tick(DeltaTime);
  89.  
  90. }
  91.  
  92. void AMyActor::TestAsync(FString Content)
  93. {
  94. UKismetSystemLibrary::PrintString(this, Content);
  95. }
  96.  
  97. void AMyActor::Example()
  98. {
  99. //在其他线程里执行此任务
  100. auto task = new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>(, GetWorld(), this);
  101. if (task) task->StartBackgroundTask();
  102. //此任务会在当前线程中马上开始。
  103. auto task2= new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>(, GetWorld(), this);
  104. if (task2) task2->StartSynchronousTask();
  105. }

UE4的多线程的更多相关文章

  1. 《Exploring in UE4》多线程机制详解[原理分析]

    转自:https://zhuanlan.zhihu.com/c_164452593 目录一.概述二."标准"多线程三.AsyncTask系统3.1 FQueuedThreadPoo ...

  2. UE4 Sockets多线程TCP通信

    转自:https://blog.csdn.net/zilisen/article/details/75007447 一.简介 UE4引擎是提供了Sockets模块和Networking模块的,博主在研 ...

  3. UE4 Socket多线程非阻塞通信

    转自:https://blog.csdn.net/lunweiwangxi3/article/details/50468593 ue4自带的Fsocket用起来依旧不是那么的顺手,感觉超出了我的理解范 ...

  4. 【UE4 C++ 基础知识】<12> 多线程——FRunnable

    概述 UE4里,提供的多线程的方法: 继承 FRunnable 接口创建单个线程 创建 AsyncTask 调用线程池里面空闲的线程 通过 TaskGraph 系统来异步完成一些自定义任务 支持原生的 ...

  5. 【UE4 C++ 基础知识】<14> 多线程——AsyncTask

    概念 AsyncTask AsyncTask 系统是一套基于线程池的异步任务处理系统.每创建一个AsyncTas,都会被加入到线程池中进行执行 AsyncTask 泛指 FAsyncTask 和 FA ...

  6. BGFX多线程渲染

    BGFX多线程渲染 1. 多线程基础 1. 并发概念 1. 并发任务简介 在多年以前,在手机.pc端.游戏机等,都是一个单核的CPU.这样,在硬件层面上,处理多个任务的时候,也是把一些任务切分成一些小 ...

  7. UE4 多线程(一)

    UE4中使用多线程的有两种方式,一种方式就是使用FRunnable和FRunnableThread,另一种方式是Task Graph System.Task Graph System有时会占用游戏线程 ...

  8. 【UE4 C++ 基础知识】<13> 多线程——TaskGraph

    概述 TaskGraph 系统是UE4一套抽象的异步任务处理系统 TaskGraph 可以看作一种"基于任务的并行编程"设计思想下的实现 通过TaskGraph ,可以创建任意多线 ...

  9. 《图解UE4渲染体系》Part 1 多线程渲染

    上回书<Part 0 引擎基础>说到,我们粗略地知道UE4是以哪些类来管理一个游戏场景里的数据的,但这仅仅是我们开始探索UE4渲染体系的一小步. 本回主要介绍UE4渲染体系中比较宏观顶层的 ...

随机推荐

  1. vs2017专业版和企业版的密钥

    Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB-G3CDH

  2. APS.NET MVC + EF (00)---C#基础

    命名参数 命名参数是把参数附上参数名称,这样在调用方法的时候不必按照原来的参数顺序填写参数,只需要对应好参数的名称也能完成方法调用. static void Main(string[] args) { ...

  3. 2019 吉比特java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.吉比特等公司offer,岗位是Java后端开发,因为发展原因最终选择去了吉比特,入职一年时间了,也成为了面试官 ...

  4. js之预解析

    一.所谓的预解析就是:在当前作用域中,JavaScript代码执行之前,浏览器首先会默认的把所有带var和function声明的变量进行提前的声明或者定义. 1)var声明的变量在预解析的时候只是提前 ...

  5. EXCHANGE上冒充任意用户--Exchange Server权限提升漏洞(CVE-2018-8581)分析

    0x00 前言 这是我们2018年Top 5趣案系列中的第三个案例.这些漏洞都有一些因素使它们从今年发布的大约1,400个报告中脱颖而出.今天我们将分析一个Exchange漏洞,它允许任何经过身份验证 ...

  6. select用法 多并发处理

    select默认最大检查套接口数量是1024,有定义 #define __NFDBITS (8 * sizeof(unsigned long)) #define __FD_SETSIZE 1024 # ...

  7. Android 使用traceView

    Android在做性能优化的时候需要使用traceView进行检测,traceView可以详细的记录下线程执行的时间让我们在做优化的时候可以清楚优化哪些内容.首先我们需要使用这个traceView,在 ...

  8. python基础之对象之间的交互

    面对对象编程之对象之间的交互 这是一个猫狗大战的例子 # 猫类 class Cat: def __init__(self, name, hp, attack): self.name = name # ...

  9. Linux中Nginx中添加自签证书TLS

    创建自签证书TLS openssl req \ -newkey rsa: \ -x509 \ -nodes \ -keyout test.com.key \ -new \ -out test.com. ...

  10. 使用awk格式化输出文本

    注意:本文并不是一篇awk入门文章,而是偏重实例讲解 awk借鉴了c语法,因此awk在许多地方还保留有c语言的痕迹,比如printf语句:for,if的语法结构等 介绍 最简单地说,AWK 是一种用于 ...