目录
UNITY
C#
Imgae比RawImage更消耗性能
Image只能使用Sprite属性的图片,但是RawImage什么样的都可以使用
Image适合放一些有操作的图片,裁剪平铺旋转什么的,针对Image Type属性
RawImage就放单独展示的图片就可以,性能会比Image好很多
Resources属于内部加载,打包出来后是文件是不存在的,不利于更新
Resources会使打包出来程序变大
一般内存占用不大、全局使用且变化不大的物体可以用Resources加载
相应的,AssetBundle属于外部加载,方便热更新,打包出来程序也会小很多
扩展:为什么AssetBundle会资源少?
刚开始我竟然搞不懂,,查了半天才想起来外部加载啊,,,可以从外部调取啊,就不用放程序里了啊!!!当然就小了
在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程。Unity的协程是在每帧结束之后去检测yield的条件是否满足。
1.用来延时
2.用来异步加载等待
3.加载WWW
1.控制物体旋转(四元数和向量相乘表示这个向量按照这个四元数进行旋转之后得到的新的向量)
2.解决欧拉角万向锁的问题(不懂万向锁的可以去看下这个篇文章:https://blog.csdn.net/fengya1/article/details/50721768)
3.四元数可以方便快捷的进行插值运算
渲染流水线流程:
1.应用阶段(由CPU负责,输出是渲染所需要的几何信息,即渲染图元)
2.几何阶段(由GPU负责,处理渲染图元,这阶段中最重要的就是把顶点坐标变换屏幕空间中,交给光栅器处理
这阶段输出的是屏幕空间中二维顶点坐标、每个顶点对应的深度值、着色等相关信息)
3.光栅化阶段(由GPU,负责这一阶段会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出最终的图像)
细节过程
https://zhuanlan.zhihu.com/p/97498781
叉乘:
几何意义:得到一个与这两个向量都垂直的向量,这个向量的模是以两个向量为边的平行四边形的面积
在同一平面内, 结果 > 0 表示 B在A的逆时针方向, 结果 <0 表示B在A的顺式针方向, 结果 = 0表示B与A同向
应用:计算两个向量方向的
点乘:
几何意义:可以用来表征或计算两个向量之间的夹角,以及在b向量在a向量方向上的投影
两个向量的点乘所得到的是两个向量的余弦值,也就是-1 到1之间,0表示垂直,-1表示相反,1表示相同方向。
应用:计算两个向量方向的夹角
场景优化
1.遮挡剔除(Occlusion Culling) 不显示被遮挡住的物体
2.LOD 根据相机距离远近显示不同精细程度的模型
3.大场景可以调节相机可视距离
4.小物体可以适当隐藏掉
5.使用光照贴图 避免动态实时的进行光照计算,提高效率
UI优化
1.将同一画面图片放到同一图集中
2.图片和文字尽量不要交叉,会产生多余drawcall(相同材质和纹理的UI元素是可以合并的)
3.UI层级尽量不要重叠太多
4.取消勾选不必要的射线检测RaycastTarget
5.将动态的UI元素和静态的UI元素放在不同的Canvas中,减少canvas网格重构频率
GC优化
1.字符串使用StringBuilder而不是string,stringBuilder在创建时会自动获取一个容量存储并逐渐扩充,string每一次改变都会创建一个新的对象。
2.访问物体tag的时候尽量使用Gameobject.CompareTag(),因为访问物体的tag属性会在堆上额外的分配空间
3.使用对象池缓存大量创建的物体
4.用for代替foreach,foreach每次迭代产生24字节垃圾内存
对于AddComponent添加的脚本,其Awake,Start,OnEnable是在Add的当前帧被调用的,其中Awake,OnEnable与AddComponent处于同一调用链上,Start会在当前帧稍晚一些的时候被调用,Update则是根据Add调用时机决定何时调用:如果Add是在当前帧的Update前调用,那么新脚本的Update也会在当前帧被调用,否则会被延迟到下一帧调用。
这个每次问我的时候我都很慌,AB包打包不就是
在编辑器中写打包代码,
然后设置物体包名,
打包出来,
然后外部加载这几步?
但是每次都是面试官问我没了??
我查了查也没查到别的啊。。求路过的大佬指点下o(╥﹏╥)o
1.按业务功能的预制,寻找依赖,收集所有预制引用的图片,
2.如果有多个预制使用了同一张图片,我们就把它扔到common文件夹
3.让图集尽量紧凑,没有太多空白,尽量让图集处于2的n次方大小
1.Resources
2.AssetBundle
3.AssetDatabase
数组: 数组在C#中是最早出现的。它在内存中是连续的存储的,所以索引速度很快,而且赋值与修改元素也很简单。可以利用偏移地址访问元素,时间复杂度为O(1);删除时间复杂度为O(n),数组没有添加数据选项。
List:基于数组,时间复杂度相同,插入为O(n);不过在数据少量的时候跟数组差不多,数据庞大的时候效率会低于数组。
字典:内部用了Hashtable作为存储结构
如果我们试图找到一个不存在的键,它将返回 / 抛出异常。
它比哈希表更快,因为没有装箱和拆箱,尤其是值类型。
仅公共静态成员是线程安全的。
字典是一种通用类型,这意味着我们可以将其与任何数据类型一起使用(创建时,必须同时指定键和值的数据类型)。
Dictionay 是 Hashtable 的类型安全实现, Keys
和Values
是强类型的。
Dictionary遍历输出的顺序,就是加入的顺序
哈希表:
如果我们尝试查找不存在的键,则返回 null。
它比字典慢,因为它需要装箱和拆箱。
哈希表中的所有成员都是线程安全的,
哈希表不是通用类型,
Hashtable 是松散类型的数据结构,我们可以添加任何类型的键和值。
HashTable是经过优化的,访问下标的对象先散列过,所以内部是无序散列的
1.值类型存取快,引用类型存取慢。
2.值类型表示的是数据,引用类型表示的是指向存储在内存堆中的数据的指针和引用。
3.值类型继承自System.ValueType,引用类型继承自System.Object。
4.值类型根据声明位置不同堆和栈中都有可能存储,引用类型分配在堆中。
序列化是通过将对象转换为字节流,从而存储对象或将对象传输到内存,数据库或文件的过程。主要用途是保存对象的状态,包括对象的数据,以便能够在需要是重建对象。反向过程称为 反序列化。