服务共青 服务市民   新闻投稿 手机版! 注册! 登录
 
 
 
  忘记密码
 
 
 
 

大型游戏的优化问题

广义上来说,只要使得游戏比之前更好,就可以称呼为优化。比如有时会说,优化一下游戏玩法,就指使得游戏更好玩。具体到程序上,优化绝大多数时候是指使得游戏在保证画面的情况下,运行起来更流畅,不会卡顿。这里的优化,更多指运行效率的优化。优化一定需要先测试,不能乱猜。一个游戏由很多模块组成,而模块由函数组成。凭感觉乱猜很难猜中哪一个模块,哪一个函数会慢。开发的时候,有一个剖析(profile)工具,用这个工具去分析运行的程序,可以得到哪些模块,哪些函数调用最频繁,总耗时最多。程序通常会有局部性,单个函数占的总时间可能达到20%,30%,甚至更高。这样的部分,就称为性能热点。通过工具分析,就可以找出热点,用更高效的方式去重新实现,消除掉热点。重新再测试,找出另一个热点。这样循环几轮之后,游戏的运行速度就会大大加快。除了性能,真正开发的时候还需要测试内存使用,GPU使用等等。优化的关键,就是找出热点,消除热点。为了消除热点用更高效的模块,去替换原来的模块。去掉不必要的行为。假设定位到某个函数过慢,它为了搜索一些数据,用了线性查找,每次由头扫描到尾。就可以将数据先排序,再进行二分搜索。这样可以达到相同功能,但就会快很多。比如定位到sin(x),cos(x)过慢。在误差允许的情况下,可以先预先列出0,90度的sin(x)和cos(x)的表格。直接从表格中得到结果,而不每次都来算结果。再比如,定位到某个int转字符串的函数过慢。最开始实现是直接使用系统提供的通用函数,但因为知道这个整数一定是正数,并且在某个范围,就可以重新实现自己的快速函数。更进一步的,就是去掉不必要的行为。比如某些时候,将角度转成弧度保存起来,使用时候又将弧度转成角度,这样的行为就是多余的。你可能会觉得不会有人这样笨,但系统一大,确实有人这样做的。另外一些多余的,就是明明不用这样多层,可以直接些,但有时就是写的绕来绕去,引入太多无用的多余层,也可以直接去掉。再比如,做个判断,将在屏幕外面的物体过滤掉,直接不渲染。另外游戏资源上,也可以优化。比如游戏图片,色彩并非很多,这样使用32位色彩的话,就比较浪费,而修改成16位色彩,基本看不出区分,但是可以将内存,GPU减少一半。比如某些模型,假如在远处,看起来比较小的,也可以将节点消减一倍。还有针对与具体机器的优化,比如我知道游戏运行在某个机器上面。就利用某些机器指令来直接算矩阵乘法,可以大大加快速度。还有语言级别的优化,比如某个调用很频繁的模块,计算量比较大,就可以由脚本语言修改成使用C/C++语言实现。设计实现上简单,直接,模块化的,基本本身就运行很快。再消除热点,就由跑车的速度,变成火箭的速度。而复杂,绕来绕去,很多东西牵连在一起,就算再优化,也只是从蜗牛的速度变成乌龟的速度。而简单,直接,模块化的,优化起来会更容易。比如某个组件,我测试到某个函数是热点,但那个函数是1000行的,这样就很难修改成高效。另外假如某个json解析库,比较慢,想替换掉另一个库。但如果那种json的数据结构不是模块化,而是散布在游戏代码各处,这样替换起来就很难了。设计的不同,可以造成数量级的效率不同。有些游戏难以优化,很可能是它的基础设计已经错了,太复杂了。之后再在错的基础上做优化,只会越来越难。而同一设计,不同的人来实现,也往往有几倍的速度差别。

上一篇:当代年轻人为了赚钱每晚加班熬夜付出健康是否值得
下一篇:大学里喜欢一个人独来独往好吗
友情链接
 
时代网简介 |
广告服务 |
诚聘英才 |
保护隐私权 |
免责条款 |
法律顾问 | 网站地图
 
   
copyright 2006-2010 共青时代网 版权所有
   
   
赣ICP备06002174号 网络文化经营许可证号360400000336 网安备案号:WZ36040000142
     
   
经营性网站
备案信息
中国
互联网协会
网络110
报警服务
不良信息
举报中心