提高编译效率:Unity Builds

简介: 最近,我发现了一个方法来减少在C/C++项目的编译时间,就是所谓的Unity Builds(UB)。这项技术非常简单, 通过减少磁盘访问的数量而减少了编译时间。
最近,我发现了一个方法来减少在C/C++项目的编译时间,就是所谓的Unity Builds(UB)。这项技术非常简单, 通过减少磁盘访问的数量而减少了编译时间。

在编译过程中include的文件会被多次访问, 每一个编译单元(Translation Unit,指的是编译出一个object文件的过程)都会访问到。除非你用一个固态磁盘,不然一般的硬盘一定会拖慢编译过程。

在示例的项目中,有两个假的编译单元,t1.cpp和t2.cpp,都包含相同的头文件ub/b.h, 而它自己又引用了ub/a.h。为了方便验证,在MSVC中打开showIncludes (译注:在项目属性里C/C++->Advanced->Show Includes), 你将看到一个类似这样的输出(*译注,如果没有看到,试试清一下工程再编译。):

Compiling...
t2.cpp
Note: including file: b.h
Note: including file:  a.h
t1.cpp
Note: including file: b.h
Note: including file:  a.h

可以看到,每个编译单元都打开了相同的头文件。UB的目的就是减少这些费时费力的事(比如. 引用的文件), 具体的做法就是将多个translation unit由一个单一的translation unit来代替。


新增一个文件ub.cpp, 内容如下:

#include <t1.cpp>
#include <t2.cpp>


从项目里去掉t1.cpp和t2.cpp, 然后编译。 这次的输出类似如下这样:

Compiling...
ub.cpp
Note: including file: t1.cpp
Note: including file:  b.h
Note: including file:   a.h
Note: including file: t2.cpp

同样也是4个引用的文件。有没有性能提升呢? 结果是肯定的,第一次遇到b.h会同时引发对a.h的解析,可是第二次遇到b.h时就不需要再解析了。
对于一些有着很深的引用层次和大量编译单元的项目来说,Unity Builds的做法绝对会节省大量的编译时间。


/*译注,作者下面介绍了为CMake编写的自动脚本,此处略去。具体的应用还是要看各个编译器的做法。*/


性能提升
下面这个图显示出了Unity Builds对于编译时间的贡献。所用的项目都是由公司开发的一些库和单元测试项目。
      

实践要点

持续集成
相对于The Magic of Unity Builds中观点, 因为一点修改会导致整个unity unit的重新编译,所以最好不要用于平时的开发工作。倒是可以考虑在CI服务器上执行,这样可以节省大量的时间来跑自动化测试。

单元切分
在一个unity unit包含太多的文件,可能会引起内存不足的问题。即便你的内存够大,最好也不要都放在一起。


代码质量

引入Unity Builds会隐藏一些编码问题,比如重复的代码。因为是将一些translation unit放到一起,就很容易导致重复定义的问题。

原文地址: Reducing Compilation Time: Unity Builds

转载请注明出处: http://blog.csdn.net/horkychen
链接:
  * Unity Builds CMake Demo Project
  * The Evils of Unity Builds
   * 浅谈怎样加快C++代码的编译速度


目录
相关文章
|
JSON 编译器 API
[✔️]lua-cjson 编译,在unity中使用cjson
[✔️]lua-cjson 编译,在unity中使用cjson
253 0
|
开发工具 Android开发 图形学
Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms(转载)
原文:http://www.jianshu.com/p/fe4c334ee9fe 现象 在用 Unity 编译 Android 平台的应用时,遇到 Unable to list target platforms 的问题。
2010 0
|
2月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
135 6
|
1月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
68 4
|
2月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
80 5
|
1月前
|
前端开发 图形学 开发者
【独家揭秘】那些让你的游戏瞬间鲜活起来的Unity UI动画技巧:从零开始打造动态按钮,提升玩家交互体验的绝招大公开!
【9月更文挑战第1天】在游戏开发领域,Unity 是最受欢迎的游戏引擎之一,其强大的跨平台发布能力和丰富的功能集让开发者能够迅速打造出高质量的游戏。优秀的 UI 设计对于游戏至关重要,尤其是在手游市场,出色的 UI 能给玩家留下深刻的第一印象。Unity 的 UGUI 系统提供了一整套解决方案,包括 Canvas、Image 和 Button 等组件,支持添加各种动画效果。
107 3
|
1月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
128 3
|
2月前
|
图形学 开发者 存储
超越基础教程:深度拆解Unity地形编辑器的每一个隐藏角落,让你的游戏世界既浩瀚无垠又细节满满——从新手到高手的全面技巧升级秘籍
【8月更文挑战第31天】Unity地形编辑器是游戏开发中的重要工具,可快速创建复杂多变的游戏环境。本文通过比较不同地形编辑技术,详细介绍如何利用其功能构建广阔且精细的游戏世界,并提供具体示例代码,展示从基础地形绘制到植被与纹理添加的全过程。通过学习这些技巧,开发者能显著提升游戏画面质量和玩家体验。
94 3