9 min read

知识总结

知识点

  • IO和资源管理
  • 网络知识
  • UI框架
  • 渲染调度
  • 反作弊
  • 鲁棒和可开放的系统设计功底
  • 动画和物理系统
  • 音频系统
  • 性能调优
  • 包体压缩
  • 输入设备响应
  • C#语法
  • 面向对象
  • Lua脚本语言

问题

  1. Unity中碰撞器(Collider)和触发器(Trigger)的区别?
  2. 物体发生碰撞的必要条件?
  3. CharacterController和Rigidbody的区别?
  4. 物体发生碰撞时,有几个阶段,分别对应的函数?
  5. 物体发生碰撞时,几种施加压力的方式,描述出来?
  6. Unity3d提供了几种光源,分别是什么?
  7. 物理更新一般在哪个系统函数里?
  8. 简述一下Prefab的用处?

问题2

  1. 什么是协同程序?
  2. Unity3D中的碰撞器和触发器的区别?
  3. 物体发生碰撞的必要条件?
  4. 简述四元数Quaternion的作用,四元数对欧拉角的优点?
  5. OnEnable、Awake、Start运行时的发生顺序?哪些可能在同一个对象周期中反复的发生?
  6. 如何安全的在不同工程间安全地迁移asset数据?三种方法
  7. MeshRender中material和sharedmaterial的区别?
  8. Unity提供了几种光源,分别是什么?
  9. 移动相机动作在哪个函数里,为什么在这个函数里?

包体积大小优化

游戏的安装包体大小对于游戏开发而言非常重要,因为发布后这些包都会上传到渠道或商店让用户下载,包体越小用户下载的时间就越少,如果一个包体过大,可能导致好不容易推广的app,由于下载很久而直接被用户取消。包体大小优化技巧这里总结一下:

  1. 图片能用jpg的尽量使用jpg, 用压缩率更大的算法。
  2. Jpg, png图片在满足游戏清晰度精度的情况下可以通过调节参数,压缩文件体积。
  3. 声音文件可以通过降低码率,采样率,多声道变单声道等方式降低体积大小。改变声音压缩算法,如.wav变成ogg来减少声音文件体积。
  4. 字体文件,可以通过去掉不用的字模来减少字库的体积。
  5. 3D模型文件体积, 可以通过减少模型的面数等来进行优化,通过细节增强技术减少模型面数达到同样的效果。
  6. 没有用的资源不要打包到包体里面,使用Resources, StreammingAssets时这些资源无论如何都会被打包进去,所以在这些文件夹中一些没有用的资源要移除或删除。
  7. 减少代码的体积,把不用的一些代码不编译打包进去。
  8. 可以把包体的全部或部分资源部署到服务器上,这样可以减少包体的体积大小。

内存大小/内存性能优化

  • 内存大小与数据量是成直接关系的,平常写代码的时候,尽量的要用好内存,少用内存。
  • 游戏开发中资源所在的内存占比是比较大的,资源所在的内存包括了模型顶点数据,模型纹理数据,UI纹理数据,声音数据,预制体数据,ab包数据等。这些和上面的文件体积不同,比如 1920x1080的jpg与png, 不论是哪个文件加载到显存的大小都为 1920x1080 * 每个像素的字节数(4字节)。所以我们要减低运行时的内存就是要即使的将不用的资源从内存中释放掉。有些资源的内存格式显卡时支持要锁的,比如Android支持ETC, IOS支持纹理压缩格式PVRTC
  • 写代码的时候尽量少产生垃圾对象,避免性能问题与内存碎片。比如字符串拼接,尽量用字符串的格式化来替代字符串加法。 因为你很难说清楚string a = “hello” + b + “hello” + 4;这个过程中到底又多少个string对象产生出来。在update里面尽量不要写那些每帧都会去new 的代码,避免产生内存碎片。同时我们为了性能,把同时大量重复使用的对象做成对象节点池缓存起来,杜绝反复创建避免内存碎片

渲染相关的优化技巧

  • 通过3D细节增强的技术(法线贴图,高度贴图)来降低模型精度,让低模+细节增强来实现高模效果
  • 尽量以少的模型面数来制作效果好的模型
  • 做好场景的物体管理(四叉树场景管理),把那些不用绘制的物体隐藏起来,节约绘制成本
  • 基于反画家算法从后向前渲染,尽量减少透明物体,尽量把背景的达吾提分成多个小物体,做遮挡剔除的时候会更好
  • 可以考虑使用静态光照来做场景烘焙,代替实时光照
  • 可以考虑使用贴图来做物体的阴影,代替实时阴影
  • 如果要用实时光照,尽可能的用一种光源
  • 如果要用实时光照,又不会只有一种光源,尽可能的使用延时渲染或其他自定义的渲染管线(轻量级渲染)来代替向前渲染,因为向前渲染每个光源都要绘制一次,性能影响很大
  • Shader相关的优化,空间换时间,多光源光照计算优化与阴影计算优化等
  • 绘制同一批物体的时候,尽量用同一个shader,减少shander的切换,shader切换又叫SetPassCall,非常耗性能,同时把常用的Shader加载到内存常驻
  • 尽量把一些物体合并到一个材质里面,比如玩家手里的枪,可能有很多支,但是我们把所有枪的纹理合并到一个纹理里面,就可以使用一个材质来渲染任意枪的类型,这样可以合并一些枪的drawcall。比如可以把地图里面的物体贴图合并到一个忒图里面用一个材质
  • 可以考虑使用 静态合批,动态合批,GPU Instancing合批来节约DrawCall。UGUI可以通过做图集来节约DrawCall
  • 通过预先采样将顶点保存起来优化动画播放组件

物理引擎相关优化技巧

  • 尽可能的减少的刚体数目,刚体的数目决定了物理引擎的计算成本
  • 尽可能的使用性能高的物理形状捧起,避免复杂的物理形状碰撞器。球型碰撞器的性能就要大于刚体碰撞器。
  • 调整一些物理参数,减少物体的迭代次数来提升物理引擎的性能。
  • 更换性能更好的物理引擎,或者更换某个方面更好的物理引擎。