E来开个天坑,来看一看Engine\Source\Runtime\Engine\Classes\Particles\ParticleSystemComponent.h

FParticleSysParam 是参数类型,里面ParamType决定哪个类型起作用,例如ParamType = EParticleSysParamType::TSPT_Scalar,那起作用的是Scalar。后面有行代码,有点意思:

这是一个template的特化源定义是这样的:

POD(Plain Old Data)用POD究竟有什么好处呢?
1:字节赋值。可以安全的使用 memset memcpy对POD类型初始化和拷贝操作。
2:提供对C内存布局兼容。C++程序可以与C函数进行互操作,POD类型的数据在C和C++间的操作总是安全的。
3:保证了静态初始化的安全有效。静态初始化的时在很多时候能够提高程序性能,而POD类型的对象初始化更简单,(比如放入目标文件的.bss段,在初始化直接赋0)
这里,unreal重新实现了POD类型的检查,实现的方式比较有意思,用到template变参,有兴趣的可以看看这里。
看到这里,我发现这里面的细节太多,我还是要看看它的大脉络,我换到了Engine\Source\Runtime\Engine\Private\Particles\ParticleSystemManager.cpp,在看它时,无意中看到了它的内存管理模型,逻辑功能主要是在Array.h,可以先看看文档。这里面的实现还是很有意思的,

使用它时有两个前提,1,元素不能依赖构造函数来初始化(not safe for element types that require constructors)。2,元素可以不通过拷贝构造(copy constructor)移动到新的内存。
上面对Array的Remove应用,有两个意思,一是remove,二是更新了老的index(源码中的Handle)指向的新元素的index。这个说起来有点拗口,还是看下Array.h这部分的源码吧。

它的实现是,把尾部的元素填入新出现的元素空坑。也就是说,尾部元素被移动了,它的index发生变化了,那外面的保存的index也要更新!
网友评论