能够熟练的使用UE4中的异步处理应该能够很好的利用程序运行的资源,和计算。除此之外还有并行的处理。目的是要理清UE4中的线程的同步异步,并行操作和标准C++中的线程同步异步,并行操作。
UE4的异步处理的实现
首先从UE4的异步处理实现的部分,当然现在还没有用过,也没有整理~
时间有限,暂时记录下关键字:
- UE C++ ThreadPool
异步处理相关函数:
- Async
- Lambda记法
- AsyncTask
- ParallelFor
1
2
3//函数的位置
Engine/Source/Runtme/Cre/Pblic/Async/Async.h
Engine/Source/Runtme/Cre/Pblic/Async/ParallelFor.h
- Async
异步辅助API
- FScopeLock
资源的排他处理(FScopeLock)
虽然我上面的关于UE4多线程的使用处理都还没有完成,但是我先遇到了多线程的资源竞争问题,如果说内存上的一块资源是线程共享的,那么多线程操作的时候不加上锁的话数据就会变得很奇怪,老生常谈了。
UE4貌似提供了一个快速为数据加锁的实现方式:FScopeLock
使用方法也是很简单
声明一个
CriticalSection
,这又是一个相当重要的概念,但不是UE4专有的。1
2private:
FCriticalSection Mutex;在访问资源的函数内的开头使用
FScopeLock
进行处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// 参考各种参考资料的时候发现有好多种写法
// Way1:最直接也是参考引擎源码的写法
func()
{
FScopeLock ScopeLock(&Mutex); // 运行到大括号外资源互斥就会失效
// FScopeLock ScopeLock(Mutex) // 或者这种写法,但是UE4引擎中没有看到这种值传递的方式
...
}
// Engine\Source\Runtime\CoreUObject\Private\UObject\Obj.cpp 中的源码
bool IsExcluded(UClass* InClass)
{
// ...
FScopeLock ScopeLock(&ExclusionListCrit); // CriticalSection声明的都一样的方式
// ...
}
// Way2:
func()
{
Mutex.Lock();
// 这里的资源是线程互斥的
Mutex.UnLock();
}
关于线程资源排他(互斥)处理的方式还有其它方式,FThreadSafeCounter
,FThreadSafeBool
等,虽然我完全是第一次听说。
参考资料:
上面文章基本没看…需要找时间验证多线程处理的实现。
不过说实话,这里的资源互斥处理,我只是照着写,也不知道该怎么验证。
拓展内容
CriticalSection
关于这个概念需要找一篇文章好好理解了。