《游戏引擎架构》学习笔记(二)

第二章 专业工具


《游戏引擎架构》的第二章主要介绍了游戏开发所需的一些工具。
列出本章的内容结构:

 
 

· 版本控制

· 为何使用版本控制

· 提供中央版本库

· 保留每个源文件的所有更改记录

· 提供为某些版本加上标签的机制,供以后提取已加标签的版本

· 容许代码从主生产线上建立分支

· 制作示范程序,补丁

· 常见版本控制系统

· SCCS,RCS,CVS,Subversion,Git,Perforce,NxN Alienbrain,ClearCase

· Subversion和TortoiseSVN

· 免费,适合小型个人和教育项目

· 文件版本、更新和提交

· 可在服务器里维护中央版本库

· 程序员在计算机取得副本,修改,提交

· 多人签出,分支及合并

· 多人签出

· 用户编辑某个文件时,其他人可修改文件

· 同一文件的多组改动,版本控制系统必须合并这些改动

· 2人同时修改同一函数时:三路合并

· 删除

· 并非完全消失,简单标记为“已删除”

· 微软Visual Studio

· 源文件、头文件及翻译单元

· 编译器翻译C++源文件至机器码

· 技术上源文件称为翻译单元

· C++编译器并不知悉头文件

· C++预处理器预先把每个#include语句替换为相对应头文件内容,然后再把翻译单元送交编译器

· 程序库、可执行文件及动态链接库

· 编译翻译单元后,输出的机器码储存在对象文件(.obj)(UNIX系统是.o)中

· 对象文件的机器码是:

· 可重定位的:未定义代码的内存地址

· 未链接的:未解决外部函数参考及翻译单元外定义的全局数据

· 对象文件可以集合成程序库(.lib)

· 链接器把对象文件和程序库链接成可执行文件

· 链接器的工作包括:

· 计算全部机器码的最终相对地址,即当程序执行时机器码在内存中的分布

· 确保正确解析每个翻译单元(对象文件)的所有外部函数参考和全局数据

· 动态链接库(.dll)

· 静态链接库和可执行文件的混合体

· 行为像库,包含函数,供不同可执行文件调用

· 操作系统能独立载入dll,dll可包含启动及终止代码

· 使用dll的可执行文件含有未完全连接的机器代码

· 存于dll的函数和数据参考维持未链接状态

· 运行可执行文件时,操作系统需解析所有未链接函数

· 系统找出合适的dll文件,若该dll文件不在内存中则要载入,之后修正一些内存地址

· 项目及解决方案

· Visual Studio,项目(project)是源文件的集合

· 编译项目会产生库,可执行文件或dll

· 生成配置

· 生成配置是解决方案内个别项目的预处理器、编译器和链接器的选项集合

· 程序员可设置任意数量的生产配置,在配置中设定不同的预处理器、编译器和链接器选项

· 常用生成选项:

· 预处理器设置

· 定义预处理宏 #include,#define

· 条件编译:“了解”目前是生成调试或发布模式

· 基于编译环境和目标平台加入“魔法”预处理宏

· 编译器设置

· 是否包含调试信息

· 是否展开内联函数

· 优化选项

· 链接器设置

· 控制输出文件类型(可执行文件,DLL)

· 指定链接的外部库到可执行文件,指定程序库的搜索路径

· 控制堆栈大小,程序载入内存时的首选基址,平台等

· 典型生成配置:

· 常见配置

· 调试(Debug):用作开发用途,非常慢,关上所有优化,禁用所有函数内联,包含完整的测试信息

· 发布(Release):做最终软件出版之用,接近最终产品的运行速度,仍保留调试信息,开启断言

· 制作(Production):为生成最终发行给消费者的游戏版本而设,最快最精干的生成模型,除去所有调试信息,关上所有断言,完全启动优化

· 当游戏的工具和游戏本身共用代码库时,加入“工具”配置,用以为工具条件编译共用代码,工具通常也分调试和发布版本

· 混合生成版本

· 混合生成版本是指其配置中,大部分翻译单元时发布模式,只有一小部分翻译单元为调试模式

· 基于文本的生成工具make

· 用户能以翻译单元为单位把某些翻译单元设置为调试模式

· 定义make变量$HYBIRD_SOURCES

· 编译所有翻译单元的调试及发布两个版本,将对象文件按版本输出到两个文件夹

· 设定最终链接规则,链接 $HYBIRD_SOURCES列举的对象文件调试版本及其他对象的发布版本

· Visual Studio

· 生成配置以项目为单位而不是以翻译单元为单位

· 若源代码已经组织成库,就可以在解决方案层面上设立“混合”生成配置

· 可挑选所需项目,为每个项目(库)选择采用调试还是发布版本

· 生成配置和可测试性

· 一些bug仍有可能只出现在某个配置中而不出现在其他配置中

· 每个配置都必须彻底测试

· 保持最少数量的生成配置,最有利于测试

· 项目配置教程

· 设定个别的生成配置或“所有配置”

· 常规属性页

· 输出目录:最终产品的目录

· 编译器/链接器最终输出可执行文件,库和DLL

· 中间目录:中间文件生成时输出的目录

· 应和最终产品放在不同目录

· 宏功能:宏名字用括号包围并前置美元符$便可使用

·  $(TargetFilename) 表示项目生成的最终可执行文件,库或DLL文件名

· 调试属性页

· C/C++属性页

· 常规/附加的包含目录

· 读取#include时搜寻的目录,最好使用相对路径

· 常规/调试信息格式

· 控制是否产生信息格式;调试及发布配置都包含调试信息

· 预处理器/预处理器定义

· 链接器属性页

· 常规/输出文件

· 设置最终产品的文件名,所在目录

· 常规/附加库目录

· 链接时读取库或对象文件,就会搜寻此属性列出的目录

· 输入/附加依赖项

· 列出需要和可执行文件或DLL链接的外部库

· 创建新的.vcproj文件

· 使用向导

· 复制现有项目

· 项目创建的可执行文件,库或DLL的文件名是明确地在.vcproj里指定的

· 可使用文本编辑器修改.vcproj文件

· 调试代码

· 断点,单步执行代码,调用堆栈,监视窗口,数据断点,调试断点

· 剖析工具

· 量度代码运行的时间,找出需要优化的代码

· 统计式剖析器:通过采样计算函数占整体执行时间的近似百分比,对性能影响小

· 测控式剖析器:提供最精确最详尽的计时数据,不能实时运行程序

· 内存泄漏和损坏检测工具

· 其他工具

 


    作者在本章介绍的工具包括版本控制系统,微软Visual Studio,剖析工具等等。

    版本控制系统是提供给整个开发团队所使用的工具,团队开发成员可以使用版本控制系统与其他成员进行更加有效的协作。版本库管理的资源主要是源代码,也可以是文本和一些资产文件。所有团队成员共用一个版本库,每一个成员进行开发时只需从版本库里获取需要编辑的资源(称为签出),工作完成后将成品再提交到版本库中(称为签入)即可。而签入不会直接覆盖源文件而是生成一个新的历史版本,这样就使得在新的版本包含错误的时候能轻易回溯并还原改动。对于版本控制系统的作用,还需要在实际的项目开发过程中慢慢体会。


    微软Visual Studio是一个功能强大的集成化开发环境(也是本章介绍的主要内容),包含文本编辑器,编译器,链接器还有调试器。用户在文本编辑器中编写源代码后,编译器和链接器就可以将代码转换成可执行程序。从源代码到可执行程序的转换过程是这样的:首先对于每一个翻译单元(C++文件),C++预处理器读取预处理器指令,进行头文件展开和宏替换等工作,然后把该翻译单元送交编译器,编译器编译翻译单元并将输出的机器码储存在对象文件(.obj)中。对象文件可以集合成程序库(.lib)。然后,链接器把对象文件和程序库链接成可执行文件(也可以生成动态链接库(.lib))。在这个过程中,链接器的工作是确定可执行文件机器码在内存的分布,以及解析每个翻译单元的外部函数参考和全局数据。此外,用户可以通过选项控制C++预处理器、编译器、链接器的工作,这些选项可以保存为生成配置。项目一般为我们生成两个不同的生成配置:“调试(Debug)”用于开发;“发布(Release)”用于发行。
    个人感觉,微软的Visual Studio是一个功能非常复杂的工具,虽然已经使用Visual Studio也有两三年了,但还有很多功能其实都不熟悉,而且也不了解其内部的一些工作原理,但本章关于Visual Studio的内容则是一个恰到好处的补充:例如,阅读本章后,我大概了解了源代码编译的整个流程,知道了各种各样的配置选项和调试功能;又如, 项目的生成配置保存为.vcproj文件,所以如果需要在多个项目设置相同的配置选项的时候,直接将设置好配置选项的项目的.vcproj文件复制到其他项目即可。(貌似VS里面有为所有项目设置默认配置的功能?不清楚。。)
    
    还有其他的一些工具,如剖析工具、内存泄漏和损坏检测工具等,应该是为软件测试所用,也是在实际的项目中慢慢了解吧。。

猜你喜欢

转载自blog.csdn.net/qq_35077043/article/details/80119290