如何学习大型项目的源码?

article/2025/11/8 5:36:36

最近有朋友突然问我一个问题 “你怎么把UE4引擎代码看的那么深入的?”

看到问题后我还愣了一下,因为这是第一次有人给我打了个”深入UE4”的标签。其实我接触虚幻引擎满打满算也就两年,确实谈不上深入。只是靠着平时的学习习惯积累,写了一些相关的技术文章。

但这个事却让我突然意识到最容易被我忽略的学习习惯很可能是有一定价值和意义的。我只想着分享我对引擎学习的心得总结,却从没有想过分享我的学习方法,或许后者更为重要。

每一个人做事都有自己的风格与习惯。当你发现身边一个人很优秀的时候,你去看一下他的24小时是怎么度过的,然后再对比一下你的24小时,答案就很明了了。同理,如果你觉得学习源码很困难,不妨请教一下那些比较牛的”过来人”,看一下别人学习源码模块的流程。当然具体来说,影响一个事物的维度,细节,前提条件都很多,别人的方法照搬过来可能是行不通的,比如说别人能一天雷打不动地学10个小时,这个放到有些人身上几乎不可能。这些道理大家都明白,我也不过多阐述。

回归主题,既然标题是“如何学习大型项目的源码”,所以下面我把自己学习虚幻引擎源码(C++)的思路和过程给分享给大家。

虚幻引擎源码大概有几百万行(没有确切统计过,可以参考下面的纯代码文件夹截图),最早可以追溯到1998年Epic自主研发的3D游戏——虚幻。对于一个提供了如此完善功能的游戏引擎,可以想象到他的代码是相当复杂的。所以,在学习的一开始你要明确,你的目的不应该是从头到尾地读遍他所有的源码,而是确定好学习目标后,抽丝剥茧地且有条理的整理出某一个具体模块的内容。

这里写图片描述

这里先给出简化版的总结,然后我会针对每条做进一步的阐述。

准备工作:建议准备大块且连续的时间(细碎的时间容易中断类关系的梳理),一个比较方便查找的IDE或工具(VS,Notepad++等),类图工具(staruml,Edraw等)

学习步骤(简化版):

  • 1.决定要学习的模块,查找官方文档、相关的总结文章,整理出大概的学习内容与目标
  • 2.运行程序,观察表现
  • 3.运行源码,断点调试,从头跟一边源码的执行流程,注意函数堆栈
  • 4.画类图、流程图,先把遇到的重要类记录下来,表明各个类的关系
  • 5.记录问题,把不理解的类或者内容以问题的方式记录下来
  • 6.写文章、笔记,尝试逐个解决之前遗留的问题

2-6可能需要持续的重复进行


学习步骤(详细版):

  1. 查找官方文档、相关的总结文章
    比如说我想研究网络模块,首先去官方文档、论坛、wiki里面过一遍网络相关的所有内容,这时候遇到不懂的问题尽可能解决,解决不了的就把问题记下来,先去官方文档看我觉得是非常有必要的,因为这里的文章是最权威的,错误率非常低。然后,去Google、百度搜索相关的文章与帖子,同时可以加入一些技术qq群(有一些水群果断退了就行,保留一些优质的交流群),过一遍这些文章和资料。目前能看到比较好的技术网站大体上就是各个技术对应的官方网站(论坛)、StackOverflow、知乎、博客园、简书、CSDN、一些个人网站等,当然有些网站复制粘贴现象严重,需要自己筛选。建议能找到原文链接的尽量去原文里面看,因为你有可能从原创作者那里看到更多优秀的文章。

  2. 在运行程序的时候,我们需要调整各种参数来执行不同的情况,进而观察其表现效果来验证我们的猜想与结论。
    比如说,对于一个处于休眠状态的Actor属性是否能正常同步,如果客户端属性与服务器一样是否还会执行回调函数等。执行程序可以快速的得到结论,然后根据结论我们可以更快速准确的进行分析。为了提高效率,最好在一开始就设置不同的配置、GM等来在项目运行时动态改变运行内容,因为大型项目一般都是编译型语言,我们可能可能需要频繁的修改代码编译再重新运行。

  3. 调试可以说是最为关键的一步了,80%的细节需要你在调试中去理解函数什么时候执行到这里(函数断点)?每一步每一个属性值是多少?属性值什么时候发生变化(条件断点)?一个完整的执行流程是什么样的(函数堆栈)?这些问题需要你一点一点的进行跟踪调试,最后再去解决。

  4. 画图的习惯可能很多人没有,但是我个人觉得这是一个必不可少的环节,因为他可以大幅度提高你对框架理解的速度对于任何一个复杂的项目,每一个模块都会牵扯到大量的类(排除纯C项目),类的关系错综复杂,而且为了降低耦合还可能用到各种设计模式,这些都大大提高了代码的阅读难度,很有可能你看了3、4个类之后就完全搞混了他们都是干什么的。举例来说,我在看UE4属性同步模块的时候,完全被各个类之间的关系搞蒙了,所以我看到一个类就把他的类图画下来,看到相关的类就记录他们的关系,最后得到了下面这样一个简化的类图。经过梳理后,几句话我就可以概括他们之间的关系。当然,除了类图以外,还有流程图、时序图,甚至是你自己为了方便发明的“模块关系图”,这时候图的种类与规范其实没有那么重要,只要能帮助你理解就行。这里写图片描述

  5. 记录的问题有两种:别人给你的问题以及你自己给自己的问题别人给你的问题
    别人给你的问题:你在阅读的时候不可能一帆风顺,可能在第一步的时候,就已经遇到了无数的问题。这时候不要着急,按照重要程度顺序依次解决,简单的问题直接网上搜一搜,解决不了可以找身边的大神,网上的牛人解决。如果还是不行,就把问题记下来,然后继续学习,当你深入到一定程度的时候,你的问题可能就不攻自破了。
    自己给自己的问题:当你解决了别人给你的问题后,你应该已经理解了一大半了。不过,任何人写的文章都不可能覆盖到全部,你需要自己挖掘更多更深的问题,然后自己再去解答,这样你才能做到比别人了解的更多,更能体现出你自己的价值。

  6. 写文章和写笔记是有区别的,但是都很有意义
    写文章这件事相比上面的步骤我觉得不算是必须的,这个适合那些追求完美还能挤出时间的人。你写的东西是要给别人看的,所以你的目的是给别人讲清楚。我在写文章的时候会去考虑这个东西我说的真的对么,有没有把握,考虑的是否全面。在这种自我拷问下,我会尽可能的完善我的知识体系,修改文章中那些看起来不够准确的内容。如果最后能做到给读者讲清楚的话,那你是真的会了。
    写笔记相比写文章要轻松很多,我只是把我总结的内容,学习的收获记录下来,不需要考虑太多的东西。虽然没有写文章那么追求完美,但是这个过程中我们可能也会多了很多思考,在之后的学习过程中快速的回忆起自己学习的经验。

备注:第一次执行这个过程是相当漫长和艰难的,如果和我一样一开始知识储备不够,那么几乎每走一步都需要大量的学习和查资料。不过只要坚持下去,你最后会发现自己的收获非常大,阅读其他模块的源码也变得容易很多。
上面只是我学习源码的一个方法,可能并不适合所有人,也还有很多地方可以进一步完善。

最后,我再强调一点,如果只是为了使用好一个工具,你不需要彻彻底底的理解所有内容,因为你的时间是有限的。如果你真的是抱着学习的态度去研究源码细节,那请做好花费大量时间的准备并坚持下去。

有哪些更好的方法或者建议,欢迎留言评论。

更多内容欢迎关注同名微信公众号: 游戏开发那些事


http://chatgpt.dhexx.cn/article/hrSFG7bl.shtml

相关文章

java开发资源分享(视频,源码,项目)

经过几年的学习,自己收集了很多的java的学习资料,今天把这些分享给大家,有需要欢迎大家来下载,希望对大家有用,一起学习,共同进步 资料主要包括: java,oracle,mysql,js,jquery,linu…

26Java毕设项目合集(附源码)

最新最全的JAVA项目合集来啦,看完这26套毕设不再发愁 最近UP整理了一些Java项目,从初级练手项目到企业级电商项目,全部配备源码及笔记,如果你能全部吃透,直接成神,各个大厂都为你打开大门! 大…

二十套Java项目源码

资源目录: 1、BBS论坛系统(jsp+sql) 2、ERP管理系统(jsp+servlet) 3、OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR) 4、博客系统(struts+hibernate+spring) 5、车辆管理系统(struts+hibernate+spring+oracle) 6、家庭理财系统(java+applet) 7、教材订购系统…

推荐10个适合练手、课程设计、毕业设计的java项目源码,无任何下载门槛

java自出道以来,一直很受欢迎,这里推荐一些,适合用来练手、大学生课程设计、大学生毕业设计的java项目源码,无任何下载门槛,项目相关的源码、说明文档、教学视频,已经配齐,无任何下载门槛限制。…

分享111个Java源码,总有一款适合您

Java源码 分享111个Java源码,总有一款适合您 源码下载链接:https://pan.baidu.com/s/1fycjYHA7y6r-IH8H7v5XKA?pwdag8l 提取码:ag8l 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...&#xff…

分享66个Java源码,总有一款适合您

Java源码 分享66个Java源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载后可以看到。 源码下载链接:https://pan.baidu.com/s/1wnPO7GfR_cVmDb2qx-4vEw?pwdlrsu …

ZYNQ7000 FSBL加载启动代码详解

参考资料: https://blog.csdn.net/zhaoxinfan/article/details/54958641 https://blog.csdn.net/asmartkiller/article/details/84072643 https://blog.csdn.net/qq_40155300/article/details/89001808 SDK版本:2017.4 写在前面: 该文档不…

xilinx ZYNQ 7000 AXI GPIO

.0AXI GPIO 第一部分 PS 和 PL之间的通讯有一个接口称为AXI。AXI总线具体的内容这边不去深究,可以理解为一种特殊协议的通讯方式。 AXI GPIO是什么意思? PL是FPGA它可以做成任何你想要的东西,做一个GPIO外设当然是可以的。 如上图所示&…

Xilinx ZYNQ 7000 HDMI

High-Definition Multimedia Interface (HDMI) 参考xilinx application note XAPP460 HDMI来自High-Definition Multimedia Interface 高分辨率多媒体接口,多媒体一般包含图像和声音。 Transition Minimized Differential Signaling (TMDS) 是HDMI的物理层。 TMDS…

ZYNQ7000 Uboot编译

使用的板子是闲鱼淘的ebaz4205,petalinux编译工程弄了几天都无法下载linux源码,索性按照官网教程U-boot自己一步步搭建编译环境 uboot版本xlnx_rebase_v2020.01备份的gitee链接https://gitee.com/lign17314/u-boot-xlnx.git交叉编译链gcc-linaro-7.5.0-…

linux系统移植 基于zynq7000平台

目录 1. 准备工作1.1. 新建工作目录1.2. 安装必备库 2. zynq 平台交叉编译器的安装2.1 解压编译环境2.2 在 zynq 目录下编写激活脚本,并激活2.3 测试编译器版本 3. Uboot 编译及制作3.1 Uboot 编译和配置:3.2 生成 boot.bin 4. Linux 内核配置及移植4.1 …

Zynq7000 USB2.0协议解析及USB控制器详解

USB 2.0规范及控制器 文章目录 USB 2.0规范及控制器USB2.0Univerasl Serial BusUSBHost USB总线接口标准总线信号USB拓扑结构数据流模型数据编解码和位填充USB逻辑部件 USB时间基准USB 描述符USB设备USB设备供电方式USB设备分层USB设备插入检测机制USB设备状态USB总线枚举 USB传…

zynq7000开发流程

1 开发工具 1.1 独立开发环境 PL—>Vivado PS(ARM)-->SDK(Xilinx)或者第三方ARM开发工具 1.2 集成开发环境 SDSoC 1.3 总结 独立开发环境大概分为四个步骤: &#xf…

ZYNQ7000 SPI LCD与Petalinux

前言 ZYNQ内部集成两个ARM Cortex A9核心,Xilinx也推出了Petalinux工具,与Vidado搭配可以方便地完成Linux的uboot、kernel、rootfs部署。 开发板上集成了HDMI,但是需要在FPGA中实现逻辑,但是实现之后占用了7010快一半的资源&…

ZYNQ7000 (二十)等精度频率计的原理分析和实例实现

等精度频率计的原理分析和实例实现 这一视频主要来分析实现等精度频率计。通过分析硬件实现原理,编写 PL的逻辑实现部分,以及对应 PS的 C语言操作,操作挂在 PS寻址空间的寄存器, 达到控制等精度频率计逻辑,读取计数结果…

ZYNQ7000-MIO与EMIO详解

摘要 本文参考芯片手册详细介绍了ZYNQ7000芯片的信号、接口与引脚,结合芯片封装说明了引脚的类别与分布,并说明了MIO与EMIO的区别。 关键词:ZYNQ;信号;引脚;MIO;EMIO;Bank 前言 了解…

ZYNQ7000 SDK开发使用

Zynq开发平台工具 ZYNQSDK开发使用 Zynq开发平台工具导入硬件平台配置BSP包创建和配置创建应用程序下载固件和调试应用程序创建FSBL工程建立内存测试工程启动模式spi flash及sd卡的测试 参考文档:zynq_sw\Lab_instructions\Lab01 - Explore Zynq Hardware Platform …

Zynq7000 OPENAMP 实验

前言 Zynq7000 openamp实验,最近想做一个多cpu异构系统,后面会用zynqmp去做,先拿zynq7000试一下 首先说明,openamp是开源异构多处理通信框架。现在cpu不再像以前单个cpu,而是越来越复杂,比如TI的TDA4芯片…

ZYNQ7000固化流程

ZYNQ7000固化流程 生成BOOT.bin文件 (1)在SDK开发环境下,将FSBL.elf文件,FPGA.bit文件和FW.elf文件按次序添加并打包成BOOT.bin文件 2. BOOT.bin文件固化 (1)在xilinx SDK环境中通过JTAG进行固化&#x…

zynq7000 资源介绍

zynq 7000 资源介绍 整体框架PS端资源PS端资源 整体框架 Zynq7000系列是基于APSOC的可拓展处理平台,它的本质特征是将一个双核ARM Cortex-A9处理器和一个可编程的FPGA芯片集成到一个片上系统中。在进行Zynq7000的详细说明前,本节首先对架构的高层模型进…