粒子系统

Unreal也实现了一个类似于 OGL的流程,这样只关心什么时候画什么问题。 具体流程

  1. Particle Simulatation Time(tick) 是在 GameThread中做。
  2. Particle data finialzation(Packing Gemotry,Draw Calls) 是在Render Thread中做。
  3. Particle Visuals 在GPU上做。

例子数量等等都是影响性能的。

开始

是在UWorld.Tick中RunTickGroup的TG_DuringPhysics.

Unreal这种engine,在运行的中有很多都是预编译,并且是能提前就提前。

流程

  1. Anim Trail Notify Time
  2. Trail Tick Time
  3. Trail Render Time
  4. Particle SkelMeshSurf Time
  5. Particle Collision Time
  6. Mesh Tick Time
  7. Mesh Render Time
  8. Wait for ASync Time
  9. Async Work Time
  10. UpdateInstances Time
  11. Update Bounds Time
  12. Activate Time
  13. Initialize Time
  14. SetTemplate Time
  15. Particle Packing Time
  16. Pacrticle Render Time
  17. Particle Tick Time
  18. PSys Comp Tick Time
  19. Sprite Update Time
  20. Sprite Spawn Time
  21. Sprite Tick Time
  22. Sprite Render Time
  23. Sort Time
  24. Beam Tick Time
  25. Beam Render Time
  26. Beam Spawn Time
  27. Particle Tool Time
  28. Beam Particles
  29. Beam Ptcls Spawned
  30. Beam Ptcls killed
  31. Beam Ptcls Tris
  32. Particle Draw Calls
  33. Sprite Particles
  34. Sprite Ptcls Spawned
  35. Sprite Ptcls Updated
  36. Sprite Ptcls Killed
  37. Mesh Particles
  38. Trail Particles
  39. Trail Ptcls Spawned
  40. Trail Ptcls Killed
  41. Trail Ptcls Tris

VectorField

C:UnrealEngine-4.10EngineShadersVectorFieldCompositeShaders.usf C:UnrealEngine-4.10EngineSourceRuntimeEnginePrivateVectorField.cpp c:UnrealEngine-4.10EngineSourceRuntimeEngineClassesComponentsVectorFieldComponent.h

[0x56268844] UVectorField::UVectorField(UVectorField * this, const FObjectInitializer & ObjectInitializer) Line 95 C++
> [0x574F7160] UVectorField::__DefaultConstructor(const FObjectInitializer & X) Line 14 C++
[0x574F70E4] InternalConstructor<UVectorField>(const FObjectInitializer & X) Line 2357 C++ [0x52907BE4] UClass::CreateDefaultObject(UClass * this) Line 2657 C++ [0x52089438] UClass::GetDefaultObject(UClass * this, bool bCreateIfNeeded) Line 2073 C++ [0x52C2E698] UObjectLoadAllCompiledInDefaultProperties() Line 661 C++ [0x52C2CFC4] ProcessNewlyLoadedUObjects() Line 751 C++ [0x52039D98] FEngineLoop::PreInit(FEngineLoop * this, const TCHAR * CmdLine) Line 1388 C++ [0x5202F908] FEngineLoop::PreInit(FEngineLoop * this, int32 ArgC, TCHAR ** ArgV, const TCHAR * AdditionalCommandline) Line 662 C++ [0x5207A5B0] AndroidMain(android_app * state) Line 283 C++ [0x5207C6A0] android_main(android_app * state) Line 425 C++ [0x520B0AC0] android_app_entry(void * param) Line 233 C++ [0x403BAC28] libc.so!__pthread_start(void*)() C++ [0x40395294] libc.so!__start_thread() C++

粒子系统的各种特效都是可以用Vector Field来实现的,有全局的,也有局部的。这样来实现对粒子的控制。 https://docs.unrealengine.com/latest/INT/Engine/Rendering/ParticleSystems/VectorFields/index.html 而这些的变化相当于uniform的参数传给shader。从而实现动态的vector field. 通过vector field来带动粒子的 运动,在实际上的时候,就相当于各种volume的效果。

添加一个curve,相当于添加一个函数,只需要一个输入的timedelta,然后是输出以及要输出给shader的相关设置。 大部分是uniform参数,因为Unreal自己维护了每一个resource在显存中的位置以及状态。 游戏中大部分情况,所有资源都是事先放在GPU的显存中的。只是修改部分内容而己。尽可能把变化用参数或者计算来传递。

并且GPU粒子与CPU的粒子可能支持的feature可能有所不同。甚至不兼容。

例如特殊造型的可以用Init Location module来实现。

而对于particle系统优化原则与steps https://docs.unrealengine.com/latest/INT/Engine/Rendering/ParticleSystems/Optimization/Concepts/index.html