Unity Day2
1.Unity 中当一个细小高速物体撞击另一个较大物体时会出现什么情况?如何避免?
答案:
- 我们可以尽量用射线检测来替代细小物体的物理系统碰撞因为传统的 FPS 游戏都是通过射线检测加模拟计算来判断伤害的
- 修改 Rigidbody 刚体中的 Interpolate(插值)和 CollisionDetection(碰撞检测)两个参数,来提高碰撞检测的准确性
2.请简述一下 Prefab(预制体) 的本质是什么?
答案: Prefab 的本质就是一个配置文件其中记录了一个 GameObject 对象上挂载的脚本信息并且记录了脚本信息中的可配置的属性信息
3.Unity 是否支持写成多线程程序? 如果支持的话需要注意什么?
答案: 支持 注意:
- 只能从主线程访问 Unity 相关组件、对象以及 UnityEngine 命名空间中的绝大部分内容
- 如果多线程中要和 Unity 主线程同时修改一些数据可以通过 lock 关键词加锁
4.请简述一下对象池,在游戏开发中我们什么时候会用到它?
答案:
- 对象池的主要作用是 避免大量创建对象再释放对象时造成的内存消耗,可以有效降低 GC 发生的频率。我们把不用的对象放入对象池中而不是让它直接变为垃圾,下次需要用到对象时再从对象池中获取,我们通过占用内存来避免更多的内存消耗和 GC 的发生
- 在游戏中频繁创建对象、实例化对象的地方,都可以用到对象池。 比如前端开发中,游戏中的子弹、伤害字体、特效等等 比如后端开发中线程池等等
5.什么是 DrawCall? Drawcall 为什么会影响游戏运行效率? 如何减少 DrawCall?
答案:
- 什么是 DrawCall?
- 每次 CPU 准备渲染相关数据并通知 GPU 的过程称为一次 DrawCall
- Drawcal 为什么会影响游戏运行效率?
- 如果 DrawCall 次数较高,意味着 CPU 会花费更多的时间准备染数据,这会进行更多的计算,进而影响游戏的这行效率
- 如何减少 DrawCall?
- 2D 和 UI 层面:
- 打图集,并且注意面板中不同图集图片的层级不要穿插
- 3D 模型层面:
- 利用动态批处理和静态批处理,尽量不使用实时光照和实时阴影
- 2D 和 UI 层面: