unity渲染流水线
有人将渲染流水线分为三个阶段(应用阶段,几何阶段,光栅化阶段),这只是概念上的阶段,每个阶段也可以分为几个子流水线系统。
应用阶段得主要任务
1.把数据从硬盘加载到显存中,因为显卡访问显存得速度快,并且有限显卡并不支持访问系统内存,这些存入得数据就是(网格数据和纹理数据),网格数据包括顶点得位置信息,顶点颜色,顶点法向量。当数据存入显存后,硬盘中得数据可以移除了。
2.设置渲染状态,就是定义了场景中得网格是怎样被渲染得,例如,使用哪一个顶点着色器/片元着色器,光照属性或者材质等,如果没有设置渲染状态,那所有的网格都用默认渲染状态。
准备好上述任务之后,cpu发送一个命令告诉GPU:我已经准备好了,开始渲染,这个命令就是DrawCall
3.调用DrawCall,一个drawCall会指向一个需要被渲染得图元列表,且不包含任何得材质信息。
几何阶段(GPU流水线)
1.顶点着色器,准备好的顶点数据会传入顶点着色器,每次传入一个顶点,都会调用一次顶点着色器,顶点之间都是相互独立得,在着色器内,主要执行,顶点得坐标变换,计算顶点颜色等,一般会将计算完得数据传入光栅化阶段(片元着色器),进行插值操作。
2.投影,一般有正交投影和透视投影
4.剪裁,完全在视图外得顶点不会被传入下一个阶段,而是会被剪裁成为新的图元,舍弃外部得顶点,生成新的顶点,传入光栅化阶段。
5.屏幕映射,将顶点坐标信息转化为屏幕坐标系,传入下一阶段。
光栅化阶段(GPU流水线)
1.三角形遍历,根据传入得图元信息,插值遍历获取覆盖得像素信息,每一个像素,和传入得其他图元信息(光照信息,法向量等)和并为一个片元,并传入片元着色器。
2.片元着色器,对上一步进行得插值操作,进行对片元得输出颜色操作。
3.模板测试,首先从模板缓冲区中取出对应得模板值,和参考得模板值进行对比(这个可以自定义比较函数),如果不符合就舍弃。
4.深度测试,将该片元的深度和深度缓冲区中对应得深度值进行对比(该比较过程也是可配置的),如果不符合就舍弃。
5.混合(α测试),将该片元得颜色信息和颜色缓冲区中对应的颜色信息进行混合。
双缓冲策略
将正在进行光栅化的图像放在后置缓冲区中,光栅化结束后,与前置缓冲区(屏幕上映射的图像)进行替换,保证看到的图像是连续的。
热更新完整流程
//todo
c#栈和堆得数据存储
AssetBundle资源管理
HTTP协议
请求体格式,请求方式,地址,版本号
get和post 都可提交内容,get提交内容放在请求头中,明示内容不加密,post提交内容放在请求体中,会进行加密。
返回体信息,会返回状态信息。
http传输过程:
1.找到url地址。
2.建立TCP连接(三次握手)
3.处理http请求。
4.返回html文件,并解析html文件
5.关闭TCP连接(四次握手)
TCP协议
Mask和canvas优化
UGUI自带得遮罩 缺点,会中断合批,因为mask得模板测试会产生一个新的shader,所以一个mask会产生俩个drawCall。所以需要尽量不要使用unity自带得mask,可以使用网上得一些,比如用顶点合并去解决遮罩问题。
canvas,如果你有一个特别复杂得ui,当里面每一个元素修改时,canvas都会重新刷新一遍,其实有很多元素ui都不需要刷新,这里面的原理是,当有一个ui移动或者修改时,这个ui上级得canvas会被标记为脏,引擎就会刷新这个canvas。
1.将canvas拆分,可以按照模块功能去拆分,拆分成大的几块,每个模块都挂在canvas组件
2.再将canvas细分,按照静态和动态得去拆分,静态得一个canvas组件,动态得一个canvas组件(动态得可细分,经常修改的 和不怎么经常修改的。)
这样修改结束后,就不会整个刷新,只是局部刷新。
unity数据加密方式
消息发送机制
工厂设计模式
协程和线程
先讲讲线程,多线程得原理是抢占式得,抢占式就是比如有俩个线程,这个时候执行这个线程得这几帧,下一个时候就执行那个线程得这几帧,并不规律,而且由系统调度,自己并不能控制什么时候调用,其实并不是真正得并行执行,而是一种交替式得运行方式。
协程得执行方式全部由程序员自己控制,挂起式得执行方式,当协程执行了第一次,会将这个状态进行保存,当程序员再下一次 ,又执行了这个协程,将上次得状态取出,进行下一次操作。