对于这个问题,Unity中循环中使用new Vector3会产生GC(垃圾回收)。原因是每次循环都会创建一个新的Vector3对象,这些对象会在每次循环结束后被标记为垃圾,然后由垃圾回收机制负责清理。这样频繁的创建和销毁对象会导致垃圾回收频繁触发,进而影响游戏的性能。为了避免频繁的GC,可以考虑使用对象池技术来重用V...
(2)使用纹理图集 (3)如果使用了纹理图集和共享材质,使用Renderer.sharedMaterial代替Renderer.material。sharedMaterial效率更高,无论如何操作材质的属性,内存中只占用一份;而material每次更换属性是unity会new一份新的material作用于它,直到Application.LoadLevel()或者Resources.UnloadUnusedAssets()的时候才会释放内存。所以mat...
Vector3等这种struct 结构体要传给lua,会new一块userdata,拷贝一份数据出来,产生GC,优化方法可以是参数改成传三个float。 自定义结构体改成class,就变成引用,不产生GC。 枚举类型传的时候也会产生GC,可以用整形来传,再做转换。 字符串,bytes,Unity和Lua互传就会产生GC,尽量避免。 Action (方法) 作为参数,会拷贝。
Vector3 v3 = new Vector3(0,0,0); 与 Vector3 v3 =Vector3.zero;使用Vector3.zero更好,因为减少了一次new的过程。Vector3.zero全局只有一个。 14、计算向量距离 需求: if (Vector3.Distance(v1, v2) < showDistance) { } 以上需求如果只是判断两个向量距离小于。实际上可以减少求平方根的计算。 首先...
gc是代码层面上的,分为lua的gc和c#的gc lua:注意table的使用,例如为了减少lua和c#的交互,会在lua层上用table来实现Vector3,这时如果在update中进行Vector3运算就会大量地分配Vector3 c#:注意装箱操作,还有方法的返回,例如如果方法返回的是一个数组,那么说明执行这个方法时会分配内存产生一个新的数组,从而产生gc ...
3.2 C# new一个Vector3,将x,y,z赋值到Vector3; 与xLua的table替代方式非常类似。 四. xLua与toLua对Vector3的优化的区别 1. 效率性能的比较,toLua高 2. xLua与toLua都不产生gc 3. xLua在创建Vector3的userdata方式和Vector3的方法调用,都需要跟Unity C#交互;而toLua在这两方面是纯Lua端执行,无需跟Unity C#...
cube.transform.localScale =newVector3(2 + i, 2 + i, 2 + i); } } 九、draw call的数量 我们看到draw call的数量上升到了101次,而saved by batching的数量也下降到了399。各位看官可以看到,仅仅是一个简单的cube的创建,如果scale不同,竟然也不会去做批处理优化。这仅仅是 动态批处理机制的一种约束,...
cube.transform.localScale = new Vector3(2 + i, 2 + i, 2 + i); } } 复制代码 draw call的数量: 我们看到draw call的数量上升到了101次,而saved by batching的数量也下降到了399。各位看官可以看到,仅仅是一个简单的cube的创建,如果scale不同,竟然也不会去做批处理优化。这仅仅是 动态批处理机制的...
(3)使用内建数组如使用Vector3.zero而不是new Vector(0,0,0); (4)可以Break掉的循环直接退出,减少不必要的循环; (5)将可以缓存的数据尽可能的缓存起来,避免重复计算和重复分配内存(比如不要重复实例化同一个对象,可以事先建好对象池) (6)FixedUpdate等频繁调用的方法可以扩大间隔,可以使用协程、InvokeRepeating...
去掉vector3的GCOptimize后的push.png 三. toLua对Vector3的优化 toLua用lua重新实现了Vector3,包含所有方法;文件地址:tolua-master\Assets\ToLua\Lua\UnityEngine\Vector3.lua 3.1 toLua创建Vector3 Vector3.New(x,y,z) toLua并没有跟Unity C#交互.