如何学习大型项目的源码?虚幻引擎源码学习思路分享

每一个人做事都有自己的风格与习惯。当你发现身边一个人很优秀的时候,你去看一下他的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.写文章和写笔记是有区别的,但是都很有意义

写文章这件事相比上面的步骤我觉得不算是必须的,这个适合那些追求完美还能挤出时间的人。你写的东西是要给别人看的,所以你的目的是给别人讲清楚。我在写文章的时候会去考虑这个东西我说的真的对么,有没有把握,考虑的是否全面。在这种自我拷问下,我会尽可能的完善我的知识体系,修改文章中那些看起来不够准确的内容。如果最后能做到给读者讲清楚的话,那你是真的会了。

写笔记相比写文章要轻松很多,我只是把我总结的内容,学习的收获记录下来,不需要考虑太多的东西。虽然没有写文章那么追求完美,但是这个过程中我们可能也会多了很多思考,在之后的学习过程中快速的回忆起自己学习的经验。

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

上面只是我学习源码的一个方法,可能并不适合所有人,也还有很多地方可以进一步完善。

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

原文地址:https://www.cnblogs.com/dyf214/p/12356828.html

时间: 2024-08-02 15:49:50

如何学习大型项目的源码?虚幻引擎源码学习思路分享的相关文章

怎么学习阅读大型项目的代码

第一章: 导论 ++++++++++++ 1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码. 2.要有选择地阅读代码, 同时, 还要有自己的目标. 您是想学习新的模式|编码风格|还是满足某些需求的方法. 3.要注意并重视代码中特殊的非功能性需求, 这些需求也许会导致特殊的实现风格. 4.在现有的代码上工作时, 请与作者和维护人员进行必要的协调, 以避免重复劳动或产生厌恶情绪. 5.请将从开放源码软件中得到的益处看作是一项贷款, 尽可能地寻找各种方式来回报开放源码社团. 6.多数情况下,

cocos2D-X源码讲解之从cocos2D-X学习OpenGL(1)----cocos2D-X渲染结构

 个人原创,欢迎转载,转载请注明原文地址http://blog.csdn.net/bill_man 从本篇文章开始,将分析cocos2D-X 3.0源代码,第一部分是从cocos2D-X学习OpenGL,也就是分析cocos2D-X 3.0的渲染代码,本篇首先介绍cocos2D-X 3.0的渲染结构,使用的是3.0正式版. void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) { //只有一种情况会调用到这里来,

cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

个人原创,欢迎转载,转载请注明原文地址http://blog.csdn.net/bill_man 上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处理渲染命令BatchCommand,批处理命令的处理在Render中比较简单 else if(commandType == RenderCommand::Type:: BATCH_COMMAND) { //将之前缓存的绘制 flush(); auto cmd = static_cast<BatchCommand*>

大型汽车4S综合连锁服务管理系统源码

演示地址:http://cx010123.pssdss.com/ 大型汽车4S综合连锁服务管理系统源码本系统专门服务于(汽车美容4s店源码) 完整的一套汽车美容管理服务系统源码 功能介绍:汽车美容服务终端功能强大而又简便实用,界面友好而美观,让用户更好的体验度,基于jquery技术实现页面无刷新,可广泛适用于大型以及小型汽车美容机修等公司,包含 洗车.机修.精品.装潢.机修等 功能简介:基础设置:连锁门店管理. 员工资料管理.菜单配置.车牌设置,车型车价管理,积分兑换等权限设置: 用户权限设置.

【Linux学习】 写一个简单的Makefile编译源码获取当前系统时间

打算学习一下Linux,这两天先看了一下gcc的简单用法以及makefile的写法,今天是周末,天气闷热超市,早晨突然发现住处的冰箱可以用了,于是先出去吃了点东西,然后去超市买了一坨冰棍,老冰棍居多,5毛钱一根,还有几根1.5的. 嗯 接着说gcc的事 先把源代码贴上来 //gettime.h #ifndef _GET_TIME_H_ #define _GET_TIME_H_ void PrintCurrentTime(); #endif //gettime.c #include <stdio.

hadoop学习;hdfs操作;运行抛出权限异常: Permission denied;api查看源码方法;源码不停的向里循环;抽象类通过debug查找源码

eclipse快捷键alt+shift+m将选中的代码封装成方法:alt+shift+l将选中的代码添加对应类型放回参数 当调用一个陌生方法时,进入源码不停的向里循环,当找不到return类似方法的时候,可以看到最原始的方法 package com.kane.hdfs; import java.io.InputStream; import java.net.URL; import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; import org

[转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND

原文:cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND 上一篇文章介绍了cocos2d-x的基本渲染结构,这篇顺着之前的渲染结构介绍渲染命令QUAD_COMMAND命令的部分,通过这部分的函数,学习opengl处理图片渲染的方法,首先介绍这节需要涉及到的基本概念VAO和VBO. VAO和VBO: 顶点数组对象(Vertex Array Object  即VAO)是一个包含一个或数个顶点缓冲区对象(Vertex Buffer Object, 即

[转帖]cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND

原贴: cocos2D-X源码分析之从cocos2D-X学习OpenGL(3)----BATCH_COMMAND 上一篇介绍了QUAD_COMMAND渲染命令,顺带介绍了VAO和VBO,这一篇介绍批处理渲染命令BatchCommand,批处理命令的处理在Render中比较简单 1 else if(commandType == RenderCommand::Type:: BATCH_COMMAND) 2 { 3 //将之前缓存的绘制 4 flush(); 5 auto cmd = static_c

cocos2D-X源码分析之从cocos2D-X学习OpenGL(2)----QUAD_COMMAND

个人原创,欢迎转载,转载请注明原文地址http://blog.csdn.net/bill_man 上一篇文章介绍了cocos2d-x的基本渲染结构,这篇顺着之前的渲染结构介绍渲染命令QUAD_COMMAND命令的部分,通过这部分的函数,学习opengl处理图片渲染的方法,首先介绍这节需要涉及到的基本概念VAO和VBO. VAO和VBO: 顶点数组对象(Vertex Array Object  即VAO)是一个包含一个或数个顶点缓冲区对象(Vertex Buffer Object, 即 VBO)的