这篇博客介绍了UE4中多线程任务的C++构建。
在游戏的主线程中,如果存在一个很复杂的运算,那么游戏很容易造成卡顿。在这篇博客里,我使用查找第N个质数的函数作为范例,并且分别创建了一个在游戏主进程以及新开线程中的调用。
函数构建
新建一个AActor,加入如下函数:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
新建一个FuntionLibrary,在其中加入CalculatePrimeNumbers
函数,用于计算结果:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
接着在Actor中添加CalculatePrimeNumbers
函数:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
并且添加一个CalculatePrimeNumbersAsync
函数的空实现。在编译通过之后,在Actor的继承BP中添加操作如下:
Task的创建
提到多线程就一定是Tasks。在这里我们创建一个在另一个线程中执行CalculatePrimeNumbers函数的类。
在这里我们需要新添加一个类继承自FNonAbandonableTask
的类(可以阅读引擎源代码查看该类的详细信息)。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
RETURN_QUICK_DECLARE_CYCLE_STAT
宏函数就是用于处理线程池相关的信息,而DoWork函数则是进行函数的调用。
因此在这里就可以在CalculatePrimeNumbersAsync
函数中来进行调用了。需要注意的是我们需要创建一个FAutoDeleteAsyncTask
来进行对应的操作,它能够保证在task完成后把自己删除。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
如果读者想要了解更多关于UE4中的多线程操作,可以从源代码中的AsyncWork.h开始读起。
<全文完>
原文链接:http://blog.csdn.net/noahzuo/article/details/51372972