目录
🟥 Unity点乘与叉乘
🟧 Unity中两个Vector3变量相减代表什么意义
表示一个指向另外一个的向量.
a点与b点相减,理解为以b为始点,a为终点的向量,方向由b指向a。
以空间坐标轴来计算相对位置
比如 点A(1,5,1) 点B(4,6,3)
那么从点A移动到点B需要增加位移矢量(3,1,2)
同理从B到A则需要减去位移矢量(3,1,2)
🟨 向量
1、零向量
零向量是非常特殊的一个向量,它是唯一一个大小为0的向量,也是唯一一个没有方向的向量。
2D零向量表示为(0,0),3D零向量表示为(0,0,0)。
在Unity中,用Vector3.zero来表示3D零向量。
2、负向量
每个向量都有一个负向量,满足条件:一个向量和它的负向量相加等于零向量。
向量变负,将得到一个和原向量大小相等,方向相反的向量。
(2,-3,3)的负向量为(-2,3,-3)。即将向量的每个分量都变负。
3、向量的长度
向量的长度即向量的大小或者向量的模。
向量的大小就是向量各分量平方和的平方根。
对2D向量而言,可以构造一个以该向量为斜边,以x,y分量的绝对值为直角边的直角三角形。可以根据勾股定理得到斜边的长度,即向量的长度。
在Unity中,可以通过Vector3.magnitude计算向量的长度。Vector3.sqrMagnitude则返回向量长度的平方。
Vector3.Distance(A,B)可以计算2个点A,B之间的距离,即返回向量AB或向量BA的长度。等同于(B-A).magnitude或(A-B).magnitude。
4、向量与标量的乘法/除法
向量与标量的乘法,即将向量的每个分量分别与标量相乘。
3D向量与标量相乘:3(1,2,3) = (3,6,9)
向量与非零标量的除法,即乘以该标量的倒数。
3D向量与标量相除:1/3(3,6,9)=(1,2,3)
Unity中使用运算符*来计算与标量的乘法,用运算符/来计算与标量的除法。
单位向量也叫做标准化向量,就是大小为1的向量。
在只关心向量方向,不关心向量大小时,可以使用单位向量,例如求一个面的法线向量时。
对任意的非零向量,我们都可以计算出它的单位向量,即将其归一化(normalization)。
向量的归一化:求得向量的长度后,用向量除以它的长度。
在Unity中,可以使用Vector3.Normalize来归一化向量。使用Vector3.normalized来获得归一化后的单位向量。
只有在两个向量的维度相同时,才可以相加或相减。
向量的加法和减法,即将向量的各个分量相加或相减。
(1,3)+(2,5) = (1+2,3+5) = (3,8)
(1,3)-(2,5) = (1-2,3-5) = (-1,-2)
向量的加法满足交换律:a+b = b+a
向量的减法则不满足交换律:a-b = -(b-a)
向量的加法可以理解成平移向量。
向量的减法则可以理解为平移负向量。
Unity中,使用运算符+来计算向量的加法。使用运算符-来计算向量的减法。
7、向量的点积
向量与向量的乘法有两种不同的形式,第一种是向量的点积,也叫做向量的内积。
表示为a·b,点不可以省略。
计算时,向量的点积就是对应分量乘积的和,结果为一个标量。
点积的计算公式为a·b=(ax,ay)·(bx,by)=axbx+ayby
(0,2)·(3,3) = 0×3+2×3 = 0+6 = 6
向量的点积满足交换律,即a·b = b·a
向量的点积还可以用来求得一个向量在另一个向量上的投影。
在Unity中,向量的点积可以通过Vector3.Dot来计算。
可以使用Vector3.Angle来获得两个向量之间的夹角的大小。结果在0度到180度之间。
8、向量的叉积
两个向量相乘的第二种方式为向量的叉积,也叫做向量的外积。
表示为a×b,同样,×也不可以省略。
叉积的结果仍是一个向量。
叉积仅可应用于3D向量。
叉积的计算公式为:
a×b=(ax,ay,az)×(bx,by,bz)=(aybz-azby,azbx-axbz,axby-aybx)
(1,2,3)×(-2,-2,3)=(6-(-6),(-6)-3,(-2)+4)=(12,-9,2)
叉积得到的向量垂直于原来的两个向量。
a×b的长度等于向量的大小与向量夹角的sin值的积,也是以a和b为两边的平行四边形的面积的大小。
我们可以通过向量的叉积来得到一个平面的法向量。
还可以通过向量的叉积得到的结果向量的方向来判断向量b是在向量a的顺时针方向还是逆时针方向。
在Unity中,向量的叉积可以通过Vector3.Cross来计算。
🟩 UI渲染模式
🟦 Unity 内存泄漏
🟪 Unity 队列
队列介绍:传送门
队列应用:传送门
🟫 Socket 长链接
⬛ Unity与Android交互
🟥 AssetsBundle
🟧 Unity 优化
1️⃣ 渲染优化
什么是渲染
CPU如何优化
- 减少要渲染对象的个数:删掉、裁剪平面、遮挡剔除
- 减少要渲染对象的次数:光照、阴影
- 合并要渲染的材质数据:动静态批处理、纹理图集(把大量的小纹理合并为一张大的纹理图的技术SpriteAtlas)
GPU如何优化
- 纹理压缩
- Mipmap
- LOD
2️⃣ CPU性能
渲染、全局光照
物理、FixedUpdate(减少物理计算次数)、少MeshCollider
脚本:缓存(find...)、冗余代码、对象池、CPU峰值、频繁使用的变量建议声明其为全局变量
减少GC:内建数组、内建数组(公用的对象)
UI、
垂直同步
3️⃣ 内存优化
GC优化
尽可能的减少堆内存的分配:
- 同一容器(如Generic提供的泛型数据结构)配合如
clear()
这样的清空函数重复使用,避免产生多次仅仅使用一次的引用类型。 - 对于内容一定的字符串使用
StringBuilder
代替String
- Unity内置函数的调用相关CompareTag
- 协程不使用
yield return
匿名对象 - 使用值类型类型的数组代替结构体
合适的实际手动调用GC
- 压缩自带类库;
- 将暂时不用的以后还需要使用的物体隐藏起来而不是直接Destroy掉;
- 释放AssetBundle占用的资源;
- 降低模型的片面数,降低模型的骨骼数量,降低贴图的大小;
- 使用光照贴图,使用多层次细节(LOD),使用着色器(Shader),使用预设(Prefab)。
- 代码中少产生临时变量
4️⃣ I/O优化
大家还有什么问题,欢迎在下方留言!
如果你有 技术的问题 或 项目开发
都可以加下方联系方式
和我聊一聊你的故事🧡