Unity面试题——Unity性能优化

342 阅读6分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

168. lod 是什么,优缺点是什么

LOD 技术即 Levels of Detail 的简称,意为多细节层次。LOD 技术指根据物体模型的节点在显示环境中所 处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。

优点:可根据距离动态地选择渲染不同细节的模型

缺点:加重美工的负担,要准备不同细节的同一模型,同样的会稍微增加游戏的容量。

169. MipMap 是什么?作用?

在三维计算机图形的贴图渲染中有一个常用的技术被称为 Mipmapping。为了加快渲染速度和减少图像 锯齿,贴图被处理成由一系列被预先计算和优化过的图片组成的文件,这样的贴图被称为 MIP map 或者 mipmap。

170. 当游戏中需要频繁创建一个物体对象时,我们需要怎么做来节省内存。

做一个 pool,游戏开始时预先实例化足够的数量,然后用的时候取不用的时候收回

171. 如何优化内存?

有很多种方式,例如

1.压缩自带类库;

2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接 Destroy 掉;

3.释放 AssetBundle 占用的资源;

4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;

5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。

172. 动态加载资源的方式?和区别

1.通过 Resources 模块,调用它的 load 函数:可以直接 load 并返回某个类型的 Object,前提是要把这 个资源放在 Resource 命名的文件夹下,Unity 不关有没有场景引用,都会将其全部打入到安装包中。 Resources.Load();

2.通过 bundle 的形式: 即将资源打成 asset bundle 放在服务器或本地磁盘, 然后使用 WWW 模块 get 下来, 然后从这个 bundle 中 load 某个 object。

3.通过 AssetDatabase.loadasset :这种方式只在 editor 范围内有效,游戏运行时没有这个函数, 它通常 是在开发中调试用的 【AssetDatabase 资源数据库】

区别:Resources 的方式需要把所有资源全部打入安装包,这对游戏的分包发布(微端)和版本升级(patch)是不利的,所以 unity 推荐的方式是不用它, 都用 bundle 的方式替代, 把资源达成几个小 的 bundle, 用哪个就 load 哪个,这样还能分包发布和 patch,但是在开发过程中,不可能没更新一个 资源就打一次 bundle, 所以 editor 环境下可以使用 AssetDatabase 来模拟,这通常需要我们封装一个 dynamic resource 的 loader 模块,在不同的环境下做不同实现。

动态资源的存放

有时我需要存放一些自己的文件在磁盘上,例如我想把几个 bundle 放在初始的安装里, unity 有一个 streaming asset 的概念,用于提供存储接口的访问。我们需要在编辑器建立一个 StreamingAssets 名字 的文件夹,把需要我们放在客户磁盘上的动态文件放在这个文件夹下面,这样安装后,这些文件会放在用户磁盘的指定位置,这个位置可以通过 Application.streamingAssetsPath 来得到。

173. 请简述一下对象池原理,什么情况下使用?

对象池背后的理念其实是非常简单的。我们将对象存储在一个池子中,当需要时在再次使用,而不是 每次都实例化一个新的对象。池的最重要的特性,也就是对象池设计模式的本质是允许我们获取一个“新的”对象而不管它真的是一个新的对象还是循环使用的对象。 对象池通常用于在那些需要经常创建又销毁的对象比如我们场景中的小怪,经常需要创建和销毁,我 们就可以在小怪销毁的时候,不真正的销毁而是,而是把它放入对象池中等到下一次我们需要创建小怪的时候,再从对象池中取出来。

174. 使用 mipmap 有什么好处?什么情况下使用?

Mipmap 纹理技术是目前解决纹理分辨率与视点距离关系的最有效途径,它会先将图片压缩成很多逐渐 缩小的图片,例如一张 6464 的图片,会产生 6464,3232,1616,88,44,22,11 的 7 张图片,当屏幕上需 要绘制像素点为 2020 时,程序只是利用 3232 和 1616 这两张图片来计算出即将显示为 2020 大小 的一个图片,这比单独利用 32*32 的那张原始片计算出来的图片效果要好得多,速度也更快。

175. Unity 内存优化?

GC 垃圾回收

176. 你认为 unity 在开发过程中哪些地方比较容易造成内存泄漏和内存泄漏 问题?如何避免?

脚本做载入不删除处理时,往往脚本中还有一些不用的变量,容易导致内容泄漏

177. 使用 NGUI 开发滚动视图,当滚动列表达到几百条的时候,如何才能保 证界面的滚动流畅运行

  1. 每个滚动条目都是同一个预设体的实例

2.做缓存,只要实例化视野范围内滚动条目,往上超出视野部分,自动填补到视野的下面

178. 如何解决过多创建和删除对象带来的卡顿问题

对象池,把不用对象缓存到一个对象列表中

179. Unity 资源加载的有几种方式,简述 asset bundie

  1. 直接在脚本中 public 一个对象,然后在监视器面板进行赋值

  2. 直接在程序中进行 find 查找

  3. Resource.load

  4. 把资源打成 Assetbudle,然后用的时候 load 进来 assetbundle 就是对资源的打包处理,同时这种资源格式便于从互联网上下载

180. 背包系统中只有 20 个格子,现在有总共有 100 个物体,除了显示在 视野中的 20 个外,对其他的处理方法?(注:将其他隐藏起来不可行,对象池得有具体的说明)

  1. 每个滚动条目都是同一个预设体的实例

  2. 做缓存,只要实例化视野范围内滚动条目,往上超出视野部分,自动填补到视野的下面