一、什么是渲染管道?
答:是指显示器为了显示出图像而经过的一系列的必要操作。渲染管道中的很多步骤,都要将几何物体从一个坐标系变换到另一个坐标系中去。
主要步骤如下:
本地坐标系 -- 经过世界变换矩阵 --> 世界坐标系 -- 经过视图变换矩阵 --> 视图坐标系 -- 经过投影变换矩阵 --> 投影坐标系 -- 经过视口变换矩阵 --> 视口坐标系
二、如何优化内存?
答:优化内存的方式有很多种
比如:
1.压缩自带类库;
2.将暂时不用的,以后还需要使用的物体隐藏起来,而不是Destroy掉;
3.释放AssetBundle占用的资源;
4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
5.使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
三、动态加载资源的方式,以及区别。
答:
1.通过Resources.Load()模块:调用它的load函数,可以直接load并返回某个类型的Object,前提是需要把这个资源放在Resource命名的文件夹下,Unity不管有没有场景引用,都会将其全部打包到安装包中。
2.通过bundle的形式:即将资源打包成 asset bundle 放在服务器或本地磁盘,然后使用www模块get下来,之后从这个bundle中load某个Object。
3.通过AssetDatabase.loadasset:这种方式只在editor范围内有效,游戏运行时没有这个函数,他通常是在开发中调用。
区别:
Resoueces的方式需要把所有资源全部打入安装包,这对游戏的发布和版本升级(patch)是不利的,所以Unity不太推荐使用它,而都用bundle的方式代替,把资源打成几个小的bundle,用哪个就load哪个,
这样有利于分包发布和版本升级。但是在开发过程中,不可能每更新一个资源就打一次bundle,所以在editor环境下可以使用AssetDatabase来模拟,这通常需要我们封装一个dynamic resource的loader模块,
在不同的环境下做不同的实现。
四、什么是协同程序?
答:在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程。Unity的协程是在每帧结束之后去检测yield的条件是否满足。
五、Unity中的碰撞器和触发器的区别。
答:
1.碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性。
2.当 Is Trigger = fasle 时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果。可以调用OnCollisionEnter、OnCollisionExit 函数;
3.当 Is Trigger = true 时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter、OnTriggerExit 函数。
4.如果既要检测到物体的接触,又不想让碰撞检测影响物体移动,或者要检测一个物体是否经过空间中的你某个区域,这时就可以用到触发器。