Done is better than perfect

0%

本文档详细梳理了UE5的渲染流水线,从游戏线程(Game Thread)到渲染线程(Render Thread)再到RHI执行的全过程。每个模块首先说明设计目的和功能目标,然后介绍相关实现细节,并列出关键源码类、函数和文件。

游戏线程:渲染对象的组织

目标: 在游戏线程上管理和维护所有可渲染的物体(Primitive),并为它们创建在渲染线程上使用的代理(Scene Proxy)。游戏线程负责组件状态管理、场景注册以及将必要的数据拷贝到渲染线程可访问的线程安全结构中。

在UE中,任何可渲染物体都是继承自 UPrimitiveComponent 的组件,比如 UStaticMeshComponent、USkinnedMeshComponent、UInstancedStaticMeshComponent 等。这些组件在被激活(Register)后,会调用其 CreateSceneProxy() 方法创建一个对应的渲染线程代理。该代理的基类为 FPrimitiveSceneProxy,它是游戏线程组件在渲染线程中的“镜像”表示。例如,UStaticMeshComponent::CreateSceneProxy() 返回一个 FStaticMeshSceneProxy(StaticMeshSceneProxy.h/cpp)实例;USkinnedMeshComponent::CreateSceneProxy() 返回 FSkeletalMeshSceneProxy。每个代理会将组件的几何数据、变换、材质相关信息等缓存在自身字段中,以便渲染线程使用。

创建好的场景代理并不会立即进行渲染,而是被包装在FPrimitiveSceneInfo对象中,该对象封装了组件和其代理的状态,并由全局 FScene(Scene.cpp)管理。FScene内部通常维护了一个加速结构(如八叉树)以进行视锥裁剪和碰撞检测。所有激活的可渲染组件在注册时会调用 FScene::AddPrimitive()(位于 Scene.cpp),从而将对应的 FPrimitiveSceneInfo 加入场景。这样,渲染线程在后续帧中就能访问到这些代理和相关数据。简而言之,游戏线程负责定义游戏世界的几何和材质状态,通过 FPrimitiveSceneProxy 和 FScene/FPrimitiveSceneInfo 将其安全地传递给渲染线程。

关键类与文件: UPrimitiveComponent及其派生类(UStaticMeshComponent、USkinnedMeshComponent 等);它们的 CreateSceneProxy() 实现位于 StaticMeshRender.cpp、SkinnedMeshComponent.cpp 等文件中(见文档)。在渲染模块内,FPrimitiveSceneProxy(及其子类如 FStaticMeshSceneProxy、FSkeletalMeshSceneProxy,对应头文件 StaticMeshSceneProxy.h、SkeletalMeshSceneProxy.h)、FPrimitiveSceneInfo(位于渲染模块,源码在 SceneRendering.cpp 或相关文件)和 FScene(Scene.h/cpp)等是核心结构。

阅读全文 »

GPU 硬件架构与渲染管线概述

GPU 是并行计算密集型硬件,在移动SoC中负责加速图形渲染。其硬件模块包括:

  • 算术逻辑单元(ALU)统一着色器单元(执行顶点/片元着色器)
  • 光栅化单元(将图元转换为像素/片元)
  • 纹理采样单元(纹理映射与滤波)
  • 像素合成单元(ROP/Output Merger),将像素结果写入帧缓冲,进行混合、深度测试等操作
  • Z/Stencil测试单元,执行早期深度剔除、模板测试等以减少不必要的计算
  • 缓存层次结构(如顶点缓存、纹理缓存、片元缓存、片元缓存(Tile Cache)、L1/L2 Cache等,用于减少主内存访问延迟)
  • 指令调度器/任务调度器, 管理线程分派与波前(wavefront/thread group)调度
阅读全文 »

UE5启动流程与结构解析

一、引擎启动流程详解

1.1 启动入口与平台特化

在 Windows 平台上,Unreal Engine 5 的执行始于标准 GUI 程序入口 WinMain。该入口函数首先调用平台特化的 LaunchWindowsStartup(位于 LaunchWindows.cpp),随后进入通用的跨平台启动函数 GuardedMain(定义于 Launch.cpp)。其调用链条如下:

1
WinMain → LaunchWindowsStartup → GuardedMainWrapper → GuardedMain → EnginePreInit → FEngineLoop::PreInit → FEngineLoop::PreInitPreStartupScreen
阅读全文 »

前言

Mathjax是一种支持在所有浏览器上显示数学公式的Javascript引擎,它支持绝大部分的Tex/LaTex语法,并且有三种输出HTML/CSS, SVG(矢量图)和MathML(Firefox支持的数公式标记语言)。本文主要介绍如何在将Mathjax整合进入Hexo中,在整合之前先介绍一下Tex/LaTex。

阅读全文 »

什么是国债

国债(Government Bonds)是指国家发行的债券,由政府作为借款人向社会筹集资金,并承诺在未来某个时间偿还本金并支付利息。由于国债由国家信用担保,因此一般被认为是最安全的债券。

国债的基本特点

  1. 发行主体:政府
  • 由财政部或中央银行代表政府发行。
  • 在中国,国债由财政部发行,在银行间市场和交易所市场流通。
  1. 风险极低,接近“无风险”
  • 由于政府有税收和货币政策支持,违约风险极低。
  • 通常被视为无风险利率(Risk-Free Rate)的基准。
  1. 收益相对较低
  • 安全性高,收益率低于企业债、高收益债等。
  • 但对于长期稳健投资者来说,国债是重要资产。
  1. 用途:政府融资、调控市场
  • 主要用于填补财政赤字、基础设施建设、调节市场流动性。
    阅读全文 »


第一部分:经济学基础

一、导论:经济学十大原理(Principles of Economics)

曼昆提出的十大原理构成经济学分析的基本框架:

  1. 人们面临权衡取舍(Trade-offs)
  2. 机会成本是决策的真实成本(Opportunity Cost)
  3. 理性人进行边际分析(Marginal Analysis)
  4. 激励会影响行为(Incentives)
  5. 贸易可以使所有人受益
  6. 市场通常能够有效配置资源
  7. 政府在某些情况下可以改善市场结果
  8. 一国生活水平取决于其生产率
  9. 货币发行过多会导致通货膨胀
  10. 通货膨胀与失业之间存在短期权衡

理论整合与延伸

上述原理可统一为:

个体在资源约束下,通过边际比较(MB vs MC),在激励约束中进行理性选择,并通过价格机制在市场中实现协调。

进一步理解:

  • 权衡 → 资源稀缺的直接体现
  • 机会成本 → 决策的隐含成本(时间、替代收益)
  • 激励 → 政策与制度设计的核心抓手
  • 边际分析 → 所有优化问题的通用方法

阅读全文 »

设计需求

  1. 解决大量(1000个)HUD创建,更新的性能问题

    • 创建1000个的开销控制在3ms
    • 更新1000个的开销控制在2ms
  2. 有多种HUD的排序策略

    • 组来排序,组间可以通过指定顺序,世界坐标z,x排序,自定义排序函数
    • 组内排序,组内可以通过指定顺序,世界坐标z,x排序,自定义排序函数
  3. 支持三种控件Image, RawImage, Text

  4. 需要支持动态图集

  5. SDF文本渲染,支持加粗,描边和投影

  6. 支持布局器

阅读全文 »

本文将通《世界金融史》了解金融的发展,金融是如何驱动世界运转,以及相关的理财产品。

世界金融简史

世界金融的发展经历了多个重要阶段,每个阶段都标志着金融体系的重大变革和进步:

  1. 古代金融的萌芽(公元前3000年 - 公元5世纪)
  • 标志:货币的出现和早期借贷行为。
  • 发展:最早的金融活动可以追溯到古代美索不达米亚和埃及,当时人们使用谷物、牲畜等作为交换媒介。随着金属货币的出现(如中国的铜钱、希腊的银币),金融活动逐渐规范化。古代罗马和希腊还出现了早期的银行和借贷行为。
  1. 中世纪金融的兴起(5世纪 - 15世纪)
  • 标志:汇票和早期银行的诞生。
  • 发展:中世纪欧洲的贸易繁荣催生了金融工具的创新,如汇票(Bill of Exchange)的出现,解决了长途贸易中的支付问题。意大利的佛罗伦萨、威尼斯等城市成为金融中心,诞生了最早的银行(如美第奇银行)。
  1. 近代金融体系的形成(16世纪 - 18世纪)
  • 标志:股票市场和中央银行的建立。
  • 发展:随着大航海时代的到来,全球贸易扩张,金融需求激增。1602年,荷兰东印度公司成立了世界上第一家股票交易所——阿姆斯特丹证券交易所。1694年,英格兰银行成立,标志着现代中央银行的诞生。
  1. 工业革命与金融全球化(19世纪 - 20世纪初)
  • 标志:工业资本与金融资本的结合。
  • 发展:工业革命推动了生产力的飞跃,金融资本成为工业化的重要支撑。伦敦成为全球金融中心,金本位制被广泛采用,国际资本流动加速。同时,投资银行和保险公司等新型金融机构兴起。
    阅读全文 »

闪存优化

闪存用于存储游戏数据和资源,包括游戏数据、纹理、音频等。闪存的读写速度比内存慢得多,因此在游戏中,我们需要尽可能地减少闪存的读写次数,以提高游戏的性能。

闪存结构和文件操作流程

性能优化-基础 中,介绍了相关的基础知识,为了文章的完整性,简单回顾一下。

阅读全文 »

组成原理

在计算机科学中,组成原理通常指的是计算机系统的基本组成部分,比如主板 (Motherboard)、中央处理器(CPU)、存储器(内存)、输入/输出设备等,并且涉及到它们之间的连接和交互。本节主要介绍一下PC和手机的组成部件,以及它们的作用。

PC

主板 (Motherboard)

主板 (Motherboard)主要由BIOS、总线、扩展插槽、芯片组和I/O端口等组成。

主板图
阅读全文 »