Vico Bill< 刘 利 波 > 的个人网站

记录关于学习、工作中的技术点滴

C,C++,Rust,Ruby爱好者;热衷于游戏开发、任务自动化与跨平台;沉迷于游戏引擎与图形表现;深信'简单、多元'哲学的力量。


访问主页

游戏引擎-UE4 引擎流程

入口点:不同平台调用GuardMain入口函数。

GuardMain:

  • EnginePreInit():引擎预先初始化。=>GEngineLoop::PreInit()
  • EngineInit/EditorInit(GEngineLoop):引擎或编辑器初始化。=>GEngineLoop::Init()
  • EngineTIck():主循环每次调用的函数。=> GEngineLoop::Tick()
  • EngineExit/EditorExit():引擎或编辑器退出。=> GEngineLoop::Exit()

GEngineLoop::PreInit

主要负责解析命令行参数,初始化环境变量。

  • 尝试启动Launcher;
  • 从命令行读取游戏名称;
  • 创建控制台输出设备;
  • 加载ProjectFile;
  • 加载Enterprise文件目录;
  • 获取dll目录;加载核心模块-CoreUObject模块;
  • 创建线程池;
  • 加载PreInit模块:Engine,Renderer,AnimGraphRuntime,平台特定的模块(D3D12,OpenGLDrv),SlateRHIRenderer,Landscape,RenderCore,TextureCompressor,AudioEditor,AnimationModifiers
  • AppInit:初始化Text本地化
  • 创建日志
  • 初始化配置系统,加载Engine、Game、Input、Editor等ini
  • 加载Plugin和Module
  • 检测模块或插件是否过期,并编译模块
  • 初始化HMD设备
  • 初始化Session

GEngineLoop::Init

主要涉及子系统的初始化,特别是引擎的初始化。

  • 检测/Script/Engine.Engine 的GameEngine/UnrealEdEngine类名称,加载UGameEngine/UUnrealEdEngine类,并创建UGameEngineUUnrealEdEngine的实例GEngine。
  • MoviePlayer切换PreloadScreen
  • GEngine解析命令行
  • GEngine::Init():引擎初始化
  • SessionServicesModule::Start();创建EngineService实例
  • GEngine::Start()
  • 加载Media模块
  • 加载AutomationWorker、AutomationController模块
  • 加载ProfilerClient模块
  • 加载SequenceRecorder,SequenceRecorderSections模块
  • 线程心跳

GEngineLoop::Tick

  • 底层内存追踪器每帧更新stats信息
  • 线程心跳、游戏线程心跳
  • 更新热更新内容
  • 更新渲染
  • 当CVar更新时,执行回调
  • 刷新渲染命令;确保GPU命令执行
  • 刷新线程日志
  • GEngine::UpdateTimeAndHandleMaxTickRate()
  • 开始帧渲染线程
  • 每个场景更新一帧
  • 平台PumpMessages
  • 超时,Sleep
  • 平台文件更新
  • 处理Slate输入事件
  • Media模块更新
  • GEngine::Tick(deltaTime)
  • 等待影片播放完毕,之后切换到Viewport
  • Shader异步编译
  • 处理并行Slate任务
  • 模块更新
  • 同步每帧结束
  • 线程更新
  • GEngine::TickDeferredCommands()
  • Media模块渲染后更新(PostRender)
  • 帧渲染结束

virtual UEngine::Init()

  • 初始化引擎子系统
  • 设置默认游戏地图
  • 初始化HMD和手势控制、EyeTrackingDevice
  • 初始化Sound
  • 加载Engine.ini文件
  • 从配置文件,加载所有用到的引擎对象引用,如默认Material、Texture、Font;根据类名创建对应引擎类实例,初始化Timecode Provider,创建GameSingleton类实例,创建AssetManager类实例并初始加载
  • 创建World(UWorld)
  • 初始化Audio device
  • 执行命令行中额外的命令
  • 绑定网络事件回调
  • 初始化PortableServices(RPC)
  • 初始化引擎分析
  • 加载ImageWriteQueue,StreamingPauseRendering,MovieScene,MovieSceneTracks,LevelSequence,LiveCoding等模块。
  • AssetManager结束初始加载
  • 添加引擎统计数据,并传播统计数据
  • 记录HMD设备分析

virtual UEngine::Start()

virtual UEngine::Tick()=0

override UGameEngine::Init()

游戏引擎初始化。扩展自UEngine。

  • UEngine::Init
  • 加载GameUserSettings,应用分辨率设置
  • 创建GameInstance,并初始化.
    • 创建UWorld
  • 创建GameViewportClient,并初始化
  • 创建游戏窗口,并将此窗口与上一步创建的Viewport关联

override UGameEngine::Start()

  • GameInstace::StartGameInstance()
    • 播放回放
    • Engine::Browse:切换地图
    • 调用virtual GameInstace::OnStart

override UGameEngine::Tick()

  • 更新日志
  • 清理关闭的Viewport
  • 所有Viewport都关闭,执行退出
  • TickWorldTravel()
  • UWorld::Tick()
  • SkyLightComponent::UpdateSkyCaptureContents
  • ReflectionCaptureComponent::UpdateReflectionCaptureContents
  • GamePlayer::Exec()
  • 更新过渡类型
  • 等待LevelStreaming完成
  • World::UpdateLevelStreaming
  • 异步改变Map
  • FTickableGameObject::TickObjects:更新计时对象
  • GameViewport::Tick
  • RedrawViewports():渲染一切
  • StreamingManager::Tick()
  • AudioDeviceManager更新音频设备
  • 渲染模块更新
最近的文章

游戏引擎-UE4命名风格

通用名称规则 所有都为英文 所有资产依赖都应该在同一目录下(除了共享资产) 资源名称各式:<Prefix_>AssetName<_Number><_Suffix> 资产类型决定前缀。例如Blueprint:BP_assetname_01 具体类型(例如纹理)使用后缀以指定子类型 T_Grass_01_N :用于法线贴图 使用下划线以分割标识符和数值:SM_DoorHandle_01 使用2位的数值:SM_Pip...…

继续阅读
更早的文章

游戏引擎-UE4 加载关卡

虚幻4引擎中与场景相关的几个概念: 关卡(Level):UE4中的游戏场景,最为常用的概念。 地图(Map):地图是编辑好的场景,保存为.umap文件。一个工程可以有很多umap文件。在UE4中,一个Level可由多个umap组合而成。在UE4中,只有UEngine::LoadMap与之相关。 /// 通过UMAP文件资源加载关卡 UWorld* PersistentWorld = GetWorld(); // 新建流式关卡UClass* Streamin...…

继续阅读