UE4之Slate: App启动与最外层Runtime结构
UE4版本:4.24.3源码编译;
Windows10 + VS开发环境
Slate为一套自定义UI框架,其绘制直接依赖的是OpenGL、DirectX这样的硬件加速AIP;
可以理解为一个单独的2D图形渲染引擎,如果有其他开源2D引擎(比如Cocos2d-x)的基础会更好的理解Slate;
UE4引擎的源代码以模块的方式组织,最直观的感受是查看源码目录:Engine/Source/Runtime目录中,每个子目录都是一个模块;
抛开所有的细节,UE4作为一个GUI App,总会有个一般的启动流程和App Tick(Loop),这里记录一下该最外层的对象结构;
1、App入口:
源码Engine/Source/Runtime/Launch为启动模块;
定义在Engine/Source/Runtime/Launch/Private/Launch.cpp中的GuardedMain(...)函数是UE4的统一[入口函数];
真正的平台相关的入口函数在各平台对应的源码文件中定义,比如Windows平台下会有:
Engine/Source/Runtime/Launch/Private/Windows/LaunchWindows.cpp中定义的WinMain(...)函数,
2、运行时调用流程
查看Engine/Source/Runtime/Launch/Private/Launch.cpp中的GuardedMain(...)函数,内部依次调用:
EnginePreInit(...) ---> EngineInit() ---> 循环调用EngineTick() ---> EngineExit()
上面每个函数内部调用的是GEngineLoop这个对象的对应函数
详情可以查看Engine/Source/Runtime/Launch/Public/LaunchEngineLoop.h/Engine/Source/Runtime/Launch/Public/LaunchEngineLoop.cpp对应的源码;
3、总结:
1、以上的App入口和运行时调用流程,只是一般意义上,或者说概念上的;UE4 C++源码中有很多的全局对象,每个全局对象的构造时机都是比Main函数要早的;
2、iOS、Android移动平台的App生命周模型下,不会调用上面说的入口函数GuardedMain(...);而是基于生命周期接口中调用GEngineLoop对象的对应函数;详细的可以参看Engine\Source\Runtime\Launch\Private\IOS\LaunchIOS.cpp、Engine\Source\Runtime\Launch\Private\Android\LaunchAndroid.cpp对应的源代码;
UE4 Runtime源代码量巨大,加上源码中间夹杂个各种宏定义、Editor相关的代码,查看源码过程中容易淹没的细节中;
可取的源码阅读方式应该是先了解清楚大体流程,然后每个模块单独分析;配合全局搜索、调用堆栈等方式了解各自模块的运行机制;
了解App运行时流程后,接下来可以去了解Slate模块内部的一些功能实现机制
UE4之Slate: App启动与最外层Runtime结构的更多相关文章
- UE4之Slate:App默认窗口的创建流程
UE4版本:4.24.3源码编译 Windows10 + VS2019开发环境 在先前分享的基础上,现在来梳理下App启动时默认窗口的创建流程,以及相关的类.对象之间的抽象层级: 纯C++工程配置 S ...
- 一触即发 App启动优化最佳实践
一触即发 App启动优化最佳实践 本文在 DiyCode 和 CSDN个人博客 同时首发,关注作者的 DiyCode帐号 或者 作者微博 可第一时间收到新文章推送. 文中的很多图都是Google性能优 ...
- iOS开发app启动原理及视图和控制器的函数调用顺序
main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当于fork+exec+waitpi ...
- IOS (APP 启动 相应处理)
APP 每次启动的入口都是通过: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSD ...
- vue隐藏APP启动时显示的{{}}
vue隐藏APP启动时显示的{{}} vue组件在编译好之前会显示{{msg}},在官网上找到这个
- [FMX] Android APP 启动黑屏优化补丁
使用说明 *************************************************** Android APP 启动黑屏优化补丁 作者: Swish, YangYxd 201 ...
- app启动调用的api
(8)在app启动时,调用一个初始化api获取必要的信息 通过这个初始化api,获取一下必要的信息,例如,最新的app版本.当发现本地app的版本已经低于最新的app版本,可提示用户更新.当然了,这个 ...
- 添加App启动页面
记录下自己在设置app启动页面时遇到的问题. 先写下自己完整的步骤吧. iPhone Portrait iOS 8-Retina HD 5.5 (1242×2208) @3xiPhone Portra ...
- Android 一个app启动另一个app
最近,一个app启动另一个app,这个玩法挺火的嘛,有没有试过更新QQ到5.1版本,QQ的健康里面就可以添加其他app,实现从QQ跳转到其他app应用.这个挺好玩的,一下子带来了多少流量啊. 一.先来 ...
随机推荐
- DP接口中AUX
背景技术: DP接口(DisplayPort)是一种图像显示接口,它不仅可以支持全高清显示分辨率(1920×1080),还能支持4k分辨率(3840×2160),以及最新的8k分辨率(7680×432 ...
- Linux入门所必备的Linux命令和C语言基础
文件和目录(底部有视频资料) cd /home 进入 '/ home' 目录' cd - 返回上一级目录 cd -/- 返回上两级目录 cd 进入个人的主目录 cd ~user1 进入个人的主目录 c ...
- Spring中自定义Schema扩展机制
一.前言 Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean. 它允许使用者编写自定义的 XML bean 解析器,并将解析器本身以及最终定义的 Bean 集成到 S ...
- VirtualBox Share Folder
转载:https://www.cnblogs.com/Dennis-mi/articles/5896586.html 使用virtualbox最方便的host-guest交换文件方案莫过于共享文件夹功 ...
- zabbix 监控redis 挂掉自动重启 并发送企业微信
1.创建redis监控项[配置]-[主机]-[监控项]-创建监控项,监控6379端口(注意关闭防火墙或者开启防火墙端口6379) redis配置文件设置允许任何地址监听: 添加监控项 2.创建redi ...
- MySQL、Oracle批量插入SQL的通用写法
举个例子: 现在要批量新增User对象到数据库USER表中 public class User{ //姓名 private String name; //年龄 private Integer age; ...
- 菜鸡的Java笔记 - java 枚举
枚举 枚举属于加强版的多例设计模式 多例设计模式与枚举 多例设计模式的本质在于构造方法的私有化.而后在类的内部产生若干个实例化对象,随后利用一个 st ...
- Python介绍和安装
python介绍和安装 目录 python介绍和安装 1. Python简介 2. 解释器 2.1 Python解释器的种类 2.2 Python解释器版本 3. Windows下安装Python 3 ...
- 使用VSCode编写,发布cnblogs
WriteCnBlog插件作者写的教程: https://www.cnblogs.com/caipeiyu/p/11774968.html
- Java安全之基于Tomcat的Filter型内存马
Java安全之基于Tomcat的Filter型内存马 写在前面 现在来说,内存马已经是一种很常见的攻击手法了,基本红队项目中对于入口点都是选择打入内存马.而对于内存马的支持也是五花八门,甚至各大公司都 ...