用Unity优化是怎么做的能做啥

《游戏AI程序设计实战》作者

Unity游戏開发性能优化是怎么做的篇

可以写一个基类继承自MonoBehaviour然后所有的UI脚本继承自该基类,保证游戏中尽量较少的脚本继承自MonoBehaviour所有的Update执行的时候,都使用基类从MonoBehaviour继承下来的Update函数不要各自继承使用。总之一句话继承自MonoBehaviour的脚本数量越少越好,最好就一份

UI脚本上面的变量尽量通過序列化方式赋值,不要用GetComponent或者Fnd函数可以编写编辑器函数设置,在游戏运行中不要动态获取

Camera一般有两个,UI相机和场景相机都需要缓存起来使用不要代码中动态获取。

不要在代码中使用反射

不要在foreach里面做删除操作,因为迭代器会失效导致错误。List使用for删除的时候从尾部删除。

为了避免频繁的创建和删除要使用ObjectPool对象池。

Text组建赋值的时候如果是那种经常修改的Text需要用两个Text组件来代替。一个用于静态顯示一个用于动态显示。动静分离

UI面板里面有动态刷新Text的和不需要实时更新的组件,两者要放在不同的canvans下面动静分离。

将一个值类型的变量赋值给一个引用类型的变量的时候会产生装箱操作常见的是给Text赋值的时候,传入Lv一个int值,需要使用Lv.tostring()转换而不是使用“”+Lv操莋。

协程里面经常用到yield return new WaitForSeconds(1f);我们可以在外部使用一个变量来记录下来不要每次都new一个出来。平时使用的List也是自己要写一个ListPool来缓存使用


  
  • 0x00 前言 刚开始写这篇文章的时候选叻一个很土的题目。《Unity3D优化是怎么做的全解析》。因为这是一篇临时起意才...

  • 今天有个同学在问我报什么专业,与他交流后他说了┅句话:出去学习就是不一样啊!这句话让我思考了许久,思考了我的大...

  • 参与“Unity性能优化是怎么做的”征文活动

    工欲其善事必先利其器。

    在使用好Unity之前必须得对它有足够的了解。

    关于Unity的简介在这里就不再阐述了以免有填充字数的嫌疑,既然主题是关于Unity 的性能优化是怎么做的就得先从Unity的应用方向了解。

    一提到游戏引擎首先就会让人联想到大名鼎鼎的虚幻系列引擎(Unreal Engine):

    业外人事谈到Unity,总会习惯性的与虚幻引擎相比觉得与之相比,Unity总给人一种淳朴的乡土气息“不够专业”、“狗肉上不了酒席”這种带有嘲讽意味的标签纷纷贴了上来,可这些人却不知道虚幻引擎已经诞生出多少大作的同时,Unity才刚刚出生

    与繁杂的虚幻引擎相比,Unity要更容易使用一些

    在如今人人一部手机的时代,Unity在移动端的领域要更为出色

    放眼国内,Android手机被Unity占领大半诞生出了著名的王者荣耀:

    王者荣耀是一款moba类竞技手游,玩家操控一名角色与队友一起与对方玩家展开公平竞争

    既然要做到多人同屏对战,自然是要注重游戏的性能优化是怎么做的

    平时卡顿没什么,玩家也不会在意但游戏进行正激烈的时候产生了卡顿,对游戏的影响是巨大的甚至有可能会殺死这个游戏。

    先前看过一篇来自腾讯资深后台开发工程师chunhe文章链接:

    文中使用到了大段文字介绍腾讯对于Unity手游的优化是怎么做的技巧,腾讯公司内部甚至还专门成立了一个“TDR评审”部门来专一负责游戏的优化是怎么做的问题

    由此可见,就连腾讯这种的知名游戏大厂都格外关注的性能优化是怎么做的在小型公司或是工作室中定然不能忽视。

    因为Unity入手简单的原因很多细枝末节并没有被开发者注意到,等到游戏开发完成再进行游戏优化是怎么做的宛如给游戏大换血,还不如重做游戏来的快

    Unity的优化是怎么做的方案在网上又大把大把的敎学,但我想根据在我身上发生的真实案例来阐述一下

    今年七月份的时候,曾独立开发过一款基于UnityPC端游戏期间就涉及到了很多有关遊戏优化是怎么做的的问题。

    之前玩过使命召唤、战地、守望先锋等这些FPS游戏兴趣使然,也想搞一款自己的游戏出来

    考虑到之后会发咘在移动平台上,因此对游戏的性能还要有一定的要求

    因为在同一游戏场景内的敌人数量和友军数量需要达到一定的规模,才能模拟出戰场的效果再加上自负心理妄图实现纯原创游戏,所以一个程序员便玩起了建模打造出了一个盒子精的人物形象。

    如图可见这是玩镓在游戏中的样子,以不同的颜色来区分玩家的阵营

    是不是有点像是“我的世界”中马赛克小人的造型?当然了这个也是可以后期贴仩贴图作为换肤系统来使用的,整体模型框架就是这样

    除了人物之外,游戏场景中的载具和环境也都是由简单的片面图形构建出来一輛坦克不足500面,就算性能再差劲的手机也可以运行的起来

    同样的,每个游戏都是要有卖点的可能你的美术特别出色,亦或是游戏性特別新鲜再或者是数值策划特别平衡,总而言之没有卖点的游戏就注定会是个残缺品。

    在我设想的这款游戏中我便想到了一个“地形破坏”的设想。

    在战争中难免会产生爆炸枪击。回顾已有的战争游戏纵然是动视的《使命召唤》系列、EA的《荣誉勋章》系列,还是同樣师出同门来自EA的《战地》系列他们都不能产生地形破坏效果。

    甚至是建筑物被破坏的时候也是按照既定的动画替换成破坏过的样子的模型

    在游戏中,玩家对抗坦克的方式只能使用反坦克炮或者是炸药摧毁坦克如果能产生地形破坏的效果,玩家可能会设想炸毁地面,制造出坦克不能逾越的鸿沟又或者炸毁桥梁让坦克跌入水中?又可能是倾倒房屋围困住坦克

    这些都是有可能发生的。

    模型网格的切割使用到了SBP技术基于二叉树算法的一种网格遍历切割算法,不是几天功夫就能掌握的为了追求速度了原创,便采用了投机取巧的办法这在小的手游公司中很常见,俗称为“演”

    按照我设想的原理,整块地形受到攻击崩塌成大块泥土大块泥土受到攻击崩成小块泥土,小块泥土再受到攻击则会蹦碎成土砾

    按照这个想法,简单的模型替换就实现了而且效果还不错。

    像模像样的爆炸土块飞溅,效果還算可以但占用性能居多,CPU占用率飙升多个点位同时爆炸,就连I5CPU都有些顶不住更不要提移动平台的那点算力。

    框选后发现无用嘚废物方块数量过多。

    为了达到这种效果也只有这种办法较为简便,只能从崩坏效果上入手减小爆炸半径,优化是怎么做的爆炸土块揚起效果

    最后得到了这样的结果:

    六个坑洞产生的立方体数量还没有之前一个产生的多,虽然这也是一种笨方法但对性能的影响已经降低了不少。

    六个坑洞产生的最大Batches值仅为34如果在游戏中需要连续如甬道类坑洞,方块数量会更少

    解决了这一难点后,原以为在性能问題上就不用在耗费心思了可在进行NPCAI设定时才发现自己的想法有点天真。

    Unity中的Update函数每帧执行一次游戏运行的越流畅,代码运行的次数吔就越多

    为了能让AI执行更有效率,我把AI的逻辑算法写在了Update中运行起来帧率骤降,最高才能刚刚达到30帧这还是在PC上运行的结果,估计放在移动端根本运行不起来

    思索后发觉有的代码并不需要多次执行,就比如AI攻击目标的寻获在短时间内,没有外力作用不管是人类還是AI都应该是持续不断的攻击一个目标,直到该目标死亡

    AI的根本性质其实也就是模仿人类,AI是人类写出来的为了完成既定工作被发明絀来的,考虑到这点我把AI大量删改,封装成方法每隔固定的频率调用或是特殊事件调用。

    除此之外都会依照默认事件执行大大节省叻效率。

    最后在关于Unity自带的寻路系统中也有一些使用的技巧可以使得游戏运行效率更快。

    比如是给寻路物体附加新的目标点再不需要妀变的时候不要多次赋予相同的值,对于底层代码的调用也是一种负担

    以上就是参照个人项目对Unity性能优化是怎么做的的见解,仅供参考如有疏漏之处,还望斧正

    我要回帖

    更多关于 优化是怎么做的 的文章

     

    随机推荐