Unity跨平台原理
.Net相关
只要编写的时候遵循.NET的这些规则,就能在.NET平台下通用
各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码
跨语言← 跨平台↓
Unity跨平台原理(Mono)
c#脚本→MonoC#编译器→IL中间代码→monoRunTIme虚拟机→操作系统原生代码
Unity跨平台原理(IL2CPP)
跨平台总结
各种源码→根据.NET规范编写→(虚拟机)生成CIL中间码(保存在程序集中)→转成操作系统原代码
跨语言 ↑ 跨平台 ↓
(Mono)c#脚本→MonoC#编译器→IL中间代码→monoRunTIme虚拟机→操作系统原生代码
(IL2CPP)mono直接将中间代码转原生代码。IL2CPP先将中间码转C++,再转原生码
*IL2CPP模式可能存在的问题处理
新版本有一个minimal ,比low还要小。 最大测试程度,直接选Hight打包,看抱不报错
如果报错,再创建这个Link.xml 去配置 。配置规则,用到了再来查。上面是注释下面是方法
下面是没有被裁剪,但它本身是泛型的时
c虽然没有被使用,但它被存在这个类里。所以不会被剥离
二、
我想保留IL2类中的Test方法,只要在这个静态test中使用它一次。 test本身是永远不会被调用的
一个保留泛型类,一个保留泛型方法。
C#各版本新功能和语法
命名可选参数、动态类型
原来需要按顺序传参数,现在写出参数名字,后面跟: 就可以不按规则顺序来传参数
在这种有默认值的函数,甚至可以少些一些参数(前提是你就是要用它的默认值)
线程池
引入命名空间
复习:
记得关闭。数据不互通此时停止Unity线程不会停止这时停止运行,线程才会跟着停止。与主线程数据不互通
线程池:
获取可用的线程数。获取最大的、设置可以同时开启的线程数。比如只能同时开20个 返回一个bool
最大设为20后,第21个不会被创建,它只会等,等到有空位。
最小的也可以得到、设置
比如min10,max12. 我此时有11. 这时又排进来一个12,因为还没到达最大值,就会创建一个新的线程给12用。 再排进来一个13,因为已经超过MAx,所以不会再新创建,而是排队等空余。
从线程池里取出来一个线程用来执行该方法,也就是把方法加入线程池的排队队列
此时obj是空,如果加一个参数↓ 那么obj就会是这个参数
*Task任务类
这种方法直接就运行,不需要Start
无返回值↑ 有返回值 return↓
想返回什么类型,就填什么类型。其他方法类似
解决方法,主线程中获取Result返回值时停止循环。
异步执行↑ 同步执行↓ Task t =new Task t.RunSynchronously();
Task t =new Task (Action)
t.wait() Task.WaitAny(t1,t2) Task.WaitAll(t1,t2) & |
一个&条件,一个|条件
wait和when,一个群伤一个单体这么理解就好了
通过申明一个这个对象,用它里面的标识符替换用来的bool值(默认是false)
好处是里面有更多功能给我们用延迟取消
*异步方法Async、Await
Asunc其他地方还是同步执行,只有被Await修饰的地方才是异步
你写异步方法的时候就应该习惯用Async结尾 可以带参,可以有返回值,但有限制
1/正常输出123,2/TestAsync挂起 主线程继续执行 等待2结束 3/ 2中的Task执行结束,继续执行TestAsync中的3
线程间数据不互通,就像不同方法间参数不互通一样。
网络通信中也会用到这两个关键字
静态导入、异常筛选器、Nameof
静态导入
可以不再写类名
比如这里,只有当e这个错误当中的消息包含301时,才会执行后面的逻辑
可以用来给301、302、303等不同错误做区分
nameof使用场景其实比较少,可能配合异常捕获来告诉别人是那个位置(名字)出了错误
这种情况用tostring就不合适了就可以用nameof
*_字面改进、弃元。out_
一看就知道是九亿如果有类型不同的重载就不能用不确定的匿名
本地函数、ref+临时+返回值
此时test1也变成了900 赋值变为引用
结构体同理
如果要用函数,则也需要ref关键字,return也要加
也没必要写修饰符
*元组、模式匹配
还有很多自带异常类
允许加入自定义类型 元组是值类型
具体应用↓
弃元符号
模式匹配:
可以直接判断是不是这个值 可以判空 是int 则直接赋值进i
switch也可以存,判断条件更多
匿名用的比较少。只是把v存成和o一样的类型
静态本地函数、Using、Null赋值合并、Deconstruct
相当于本地函数不能使用上层函数
首先得保证using对象有Dispose这个方法
继承这个接口重写该方法,释放逻辑自己定
这种写法,只有在其上层函数结束时才会释放该对象
a = b?? "1"; a=b,b为空则a=1 a ??= "1"; a为空则=1
解构函数:
因为一个类对象实际是引用类型,直接赋值会造成地址上的关联。而解构函数可以只取出变量值
申明一个p,且单独把其中的变量值提取出来
模式匹配增强
判断这个对象的属性是不是这个值,那个属性是不是那个值↑ 结合使用↓
你要用传统的写也可以。
配合Switch,可以判断多个条件的满足情况。加分号。 元组则不需要数据结构类
可以连变量名都省略
when关键字可以配合switch使用,要同时满足多个条件,这里抛砖引玉