Unreal的起动模式,是并行化,先把所有的resource加载,然后设置,event事件。

PreInitModules

  1. basic - Engine,Render,AnimGraphRuntime - Landscape,ShaderCore
  2. platformSpecic

StartupCoreModules

  1. Core,Networking,Messaging,SessionServices
  2. Slate,SlateReflector,UMG,...

FEngineLoop::PreInit

这里主要处理 命令行参数,以及environment 设定,例如Workingspace,游戏的名字 等等。

  1. malloc profiler proxy 也是这里启动的。
  2. LogConsole
  3. 把当前线程注册成GameThread
  4. 初使化数学库的随机数中种子
  5. 初使化TaskGraphSystem,以及线程的profiling,并在后面初始化线程池
  6. loadCoreModules()
  7. GThreadPool GlobalThreadPool
  8. InitGamePHys()
  9. RHIInit
  10. 游戏资源的加载是ProcessNewlyLoadedUobjects()

FEngineLoop::Init

  1. 判断是editor还是game.
  2. MovePlayer
  3. InitTime
  4. load AutomationWorker
  5. GEngine::Init
  6. PostEngineInit

UGameEngine::Init

  1. UEngine::Init
  2. Load and apply user game settings
  3. Create GameInstance
  4. Initialize VIewport
  5. StartGameInstance

AndroidMain

  1. wait for JVM thread
  2. change the fd_limit
  3. Setup Joystick support with dlopen(“libandroid.so”)
  4. Setup Keymap
  5. wait for java activity OnCreate to Finish
  6. Initialize file system access
  7. GEgnineLoop.PreInit
  8. InitHMDs
  9. EEngineLoop.Init()
  10. deal while loop for tick until done. - FAppEvent Ticket - GEngineLoop.Tick
  11. exit
  12. 初使化RenderingEngineVarCache
  13. loadPreInitMOdules()
  14. 读配置文件/Scripts/Engine.xxSetting
  15. 创建SlateApplcation
  16. 初使化 RHIInit
  17. InitGamePhys
  18. RHIPostInit
  19. GEngineInit
  20. RunAutomation Smoketests

LoadMap

  1. SpawnAllLocalPlayer
  2. SetPlayer中会来处理 键盘mapping,以及一些事件callback都是在这里设置的。每一个player都可以不一样。

FEngineLoop::Tick

  1. Profilier FrameSync
  2. 更新ConsoleVariable
  3. ENQEUE_UNIQUE_RENDER_COMMAND
  4. UpdateTimeAndHandleMaxTickRate
  5. TickPFSChart
  6. Update memory allcator stats
  7. FStats::AdvanceFrame
  8. Handle some per-frame tasks on the rendering thread,主要是DeferredUpdateRendering
  9. GEngine->Tick
  10. ShaderCompiling
  11. GDistanceFieldAsyncQueue->ProcessAsyncTasks
  12. Tick Slate application
  13. ClearPendingStatGroups
  14. FModuleManager::GetModuleChecked<IAutomationWorkerModule>(AutomationWorkerModuleName).Tick() 这就是Hot compilable里的实现
  15. RHITick
  16. Find the objects which need to be cleaned up the next frame
  17. Cleanup
  18. FTicker::GetCoreTicker().Tick
  19. FSingleThreadManager::get().Tick()
  20. GEngine->TickDeferredCommands();
  21. ENQUEUE_UNIQUE_RENDER_COMMAND, ENDFrame
  22. Check for async platform hardware survey results
  23. Set CPU utilization stats
  24. Set the UObject count stat

UGameEngine::Tick

  1. Tick the modulemanager //HotReload->Tick()
  2. updateViewPort
  3. Update subsystems
  4. Begin ticking worlds
  5. Tick all travel and Pending NetGames(Seamless,server,client)
  6. UpdateSkyCaptureContents
  7. UpdateReflectionCaptureContents
  8. Tick the world
  9. Issue cause event
  10. Tick the Viewport
  11. Render everything //RedrawViewports();
  12. Update Audio
  13. Rendering Thread commands ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER
  14. Tick animation recorder

UWorld::Tick

  1. UMETA Pre Physics
  2. Start Physics
  3. During Physics
  4. End Physics
  5. Post Physics
  6. Fost Update Work
  7. Last Demotable
  8. Newly Spawned

Steps

  1. UpdateWorld’s subsystems (NavigationSystem for now)
  2. BeginFrame
  3. Doing ActorTicks
  4. PrePhysics
  5. CollisionTreeBuild
  6. RunTickGroup(TG_startPhysics) - call TaskGraph to do the work.
  7. TickAsyncWorks
  8. WaitForAsyncWork
  9. TickableObject->Tick
  10. Update cameras and streams volumes
  11. EndFrame
  12. Update profiler data
  13. UpdateSpeedTreeWind
  14. FXSystem->Tick ??
  15. garbageCollection

PhysScense

FPhysScene::EndFrame/StartEndFrame,

FinishPHysicsSim ->EndFrame

// the physics tick functions

void FStartPhysicsTickFunction::ExecuteTick(float DeltaTime, enum ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) void FEndPhysicsTickFunction::ExecuteTick(float De

Module的加载与管理

C:UnrealEngine-4.10EngineSourceRuntimeCorePrivateModulesModuleManager.cpp

其后台都是使用的DLL动态库加载,但是原始的动态库接口函数dlopen/dlsym/dlclose只提供了内容加载代码区,然后自己手工的把函数找出来。 同时虽然用一些常规的方法可以知道有些函数在这个DLL中,但是自动导出这些函数来供其他函数使用。这个方法可以用脚本语言这样来做,例如 python这些都已经实现的。 Unreal也是自己实现了类似于SWIG这样的接口,这样自己所有函数都可以实现动态的加载。 并且Unreal也自己记录哪些dll的加载了,所些没有加载。以及改动。并且在tick时实时的加载。