public static int Match(int num) { return num switch { > 5 => 0, < 5 => 2, 5 => 3 }; }
编辑器会根据情况生成最优的if else或则是switch
可以对dll或则是assetbundle进行压缩,减少大小
public class CompressUtil { public static byte[] Compress(byte[] data) { using (var memoryStream = new MemoryStream()) { using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress)) { gzipStream.Write(data, 0, data.Length); } return memoryStream.ToArray(); } } public static byte[] UnCompress(byte[] data) { using (var memoryStream = new MemoryStream(data)) { using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Decompress)) { using (var output = new MemoryStream()) { gzipStream.CopyTo(output); return output.ToArray(); } } } } }
常用的字符串生成后缓存起来,不然一直操作字符串需要频繁分配内存,临时变量还会生成很多垃圾。
使用“不安全”的native,就是类似的c++的指针方式来处理string。
struct是值类型,传递的时候是通过字节对齐规则循环多次复制内存的。
struct是值类型,分配的内存是在栈上的,数据存储是连续,并且栈的回收非常快速和简单,只需要将尾指针置0就可以了,这样不会产生内存碎片,又不需要内存垃圾回收。
装箱和拆箱会造成内存分配和复制内容,会造成很多垃圾。
自定义类来封装值类型,通过对象池管理。
通过泛型参数传递替代object参数通用传递。
浮点数的计算为 F=(-1^s)×(1.M)×(2^e),所以会出现精度问题
数值比较不相等,要使用近似比较
数值计算不确定
不同设备的计算结果不同
解决办法
使用整数代替浮点数,例如精度为3的使用×1000的整数
实现定点数,例如使用两个int,一个为整数部分,一个为小数部分
使用字符串表示,可以无限的精度,计算消耗大
内部实现为数组的方式,使用hash的方式映射键值到指定数组。数组保存的是链表的头指针。
内部数组不够也是有扩容操作,扩容为质数。
查找hash冲突时会遍历指定链表,对比key值。
添加键值对是插入为头指针的。
不指定容量的情况下,默认为4,Add和Insert不够的时候会成倍扩容,不断增加会产生垃圾。
RemoveAt、InsertAt等接口会对数组进行O(n)的移动操作。
Contains、Find为遍历数组O(n)操作。
ToArray会复制一份数组,会引起内存分配。
使用foreach会生成Enumerator对象,产生垃圾。
Sort用的是Array的Sort,内部为快速排序。
线程不安全的,好用但效率不高。
bool HasChinessString(string str) { char[] c = str.ToCharArray(); for (int i = 0; i < str.Length; i++) { if ((int)c[i] > 127) return true; } return false; }
Debug.LogError(sizeof(float) == sizeof(uint)); //true Debug.Log(float.MaxValue > uint.MaxValue); //true Debug.Log("float Max:" + float.MaxValue); //3.402823E+38 Debug.Log("uint Max:" + uint.MaxValue); //4294967295
上面代码中,可以看出float和uint的字节数是相同的,但是float能表示的最大值是比uint打的。通过了解,得知float的表示方式是 1 + 8 + 23的形式,1位表示符号,8位表示指数部分,23位表示有效数值部分,其实是24位,所以能表示精确的最大范围就是2^24=16777216。所以当需要大精度计算数值时,可以使用decimal顶点数,它的存储空间是16*8位。