优化有很多种途径,总的来说就是通过修改程序结构提升软件在特定条件(用户的使用条件)下的效率的行为都叫优化。在此先以个人软件经验(和一部分道听途说)来回答一下问题。
优化工作
1. 确定顶级表现:
也就是说首先要确定优化前后所要保持一致的部分。这也是最后测试时验证的标准。
2. 确定使用条件
确定此优化行为所针对的使用场景。这个场景的描述是多种多样的,目的是找出尽可能多的可优化点。可以包括用户集中的软件平台,操作系统,硬件型号,可以包括游戏进行时的资源分配情况,产生的游戏体验影响等等许多内容。
3. 设计优化行为
从使用条件中找出“适合优化”的点,设计对应的优化方案。
4. 覆写程序逻辑
按照设计重新编写程序的部分内容。
5. 测试表现
根据顶级表现要求测试优化后的版本是否保持一致,同时测试优化后的版本在特定环境下是否达到了优化的目的。
如何优化?
世上没有免费的午餐,优化也是一样。当某一方面的执行效率提升的时候,势必会影响其他方面的性能。最常见的影响是降低程序的可读性、可移植性等。
换句话说,优化就是要牺牲掉一部分优势,去提升另一部分。因此根据使用场景的不同,优化方式甚至会互相完全相反。
常见的优化理念有:
空间换时间:牺牲存储资源(内存、硬盘),提升计算效率(CPU、GPU)。主要方式是尽量多地缓存可能需要的显示资源,避免在需要时临时演算。
应用此理念产生的技术有:
法线贴图:在低模(面数较低的模型)上通过添加高度属性和计算光线来产生模拟光照的高度效果的贴图,能用低模模拟出高模(面数较高的模型)的效果。由于3D模型渲染效率与面数关系很大,此举能提升整体的计算效率。
天空球(远景图):通过将整个远景渲染为一张静态图片并包围游戏视角的方式处理游戏中需要的远景,提升计算效率。
CG动画:通过预先渲染并输出视频的方式播放,对玩家的计算性能要求大大降低。
时间换空间:牺牲计算资源(CPU、GPU),提升存储资源(内存、硬盘)。主要方式是尽量以程序方式描述显示过程,避免将其存储在存储介质中。
应用此理念产生的技术有:
矢量图:Flas***当年为了适应较低的网速和网页播放的环境,在Flash工具中绘制的图形默认采用矢量图方式存储。矢量图是一系列描述图形的代码,因此其存储空间往往要大大小于位图。得益于此项技术,Flash生成的二维矢量动画可以以轻巧的体积放上网页,并让用户可以轻松加载观看。在相同内容下的矢量动画体积不到无压缩视频文件体积的千分之一,但是Flas***复杂的舞台内容会严重影响播放效率甚至造成卡顿,而视频不同的画面内容对播放几乎不会产生任何影响。
即时演算动画:与矢量图的思想类似,将游戏中的动画存储为一系列的指令,使用游戏内的模型、镜头语言来演算。同样可以消耗计算资源,减少存储占用。
特定平台优化:避免调用框架API,尽量使用特定平台和硬件的底层API(或使用高效率语言如C自行实现底层API)实现程序效果。由于底层API在不同的平台中存在差异,此举牺牲可移植性,提高执行效率。
跨平台优化:与上条相反,避免调用底层API,尽量使用框架API,由于跨平台框架自行实现了底层的多平台逻辑,此举牺牲执行效率,提高可移植性。
国际化(代名*):为文本预留出丰富的排版、调整结构接口,以便于切换不同编码的语言。消耗额外的执行效率和存储资源,提高可移植性。
本地化(代名*):仅为特定语言进行设计,降低可移植性,提高执行效率和存储资源。
注*:由于本地化与国际化本身与所描述的内容与此处有所差异,此处用这个名词代称这种优化的方式。
以上,不正之处欢迎指出讨论。