Unity 渲染原理(七)表面着色器与Shader Graph
在内置渲染管线中,表面着色器是编写与光照交互的着色器的一种简化方式。
编写与光照交互的着色器非常复杂。有不同的光源类型,不同的阴影选项,不同的渲染路径(前向和延迟渲染);着色器应该以某种方式应对所有这些复杂性。
表面着色器是一种代码生成方法,与使用低级顶点/像素着色器程序相比,可以更轻松地编写光照着色器。
在内置渲染管线中,表面着色器是编写与光照交互的着色器的一种简化方式。
编写与光照交互的着色器非常复杂。有不同的光源类型,不同的阴影选项,不同的渲染路径(前向和延迟渲染);着色器应该以某种方式应对所有这些复杂性。
表面着色器是一种代码生成方法,与使用低级顶点/像素着色器程序相比,可以更轻松地编写光照着色器。
在Unity中,我们使用HLSL的语法来写Shader Program,不过一开始Unity采用的是CG语法,因此会使用 Unity 某些关键字的名称 (CGPROGRAM) 和文件扩展名 (.cginc)。虽然Unity 不再使用 Cg,但这些名称仍在使用。
上一篇博客了解了一些Unity Shader的概念,继续看一下如何编写一个Shader。
前面介绍了渲染流水线的基本内容,接下来就其中的我们可以编程的部分进行介绍,开始之前我们需要先介绍一些基础概念,对其中的一些属性进行简单说明。
在看了计算机组成原理中的存储系统一章后,结合操作系统中的内存管理和文件管理,对整个计算机的存储管理有了新的理解,这里就一起杂糅着总结一下。
首先抛出几个我的总体看完以后的新的理解:
最近在研究Unity性能优化相关的内容,接触了几个Unity官方自己的工具,这里总结一下它们的使用方式以及如何结合着使用。
我主要用到了以下几个工具:
首先总体上讲一下这三者之间的关系:Profiler是Unity Editor中自带的性能分析工具,不需要额外下载,能对CPU,GPU,内存,Render,物理,网络等等的性能数据进行搜集。而UPR则是利用了Profiler的数据进行了进一步的专业分析和统计,Memory Profiler是针对Profiler的内存数据进行了专门的分析,在运行期间可以进行内存的快照收集。
我们在将Unity打包成il2cpp+release模式的apk的之后,内部的代码是会被打包成so文件的,这个东西其实是linux的动态链接库的格式,对应的就是windows的dll或者Mac的dylib之类的东西。在android这边也可以叫做符号表,因为它内部会保存虚拟内存地址与汇编代码的的对应关系。
这样打包以后,会降低我们的包体积,而且有助于我们的代码保护不被抄袭,但是同时也会导致我们开发者看不懂报错信息,因为这些报错信息都是些虚拟内存地址,而不是函数的名字,那么对于线上发生的报错信息,我们怎么去阅读呢?
最近发现Unity项目在运行过程中消耗了很多的内存,而且会出现的很频繁的GC导致游戏的CPU过热。于是去阅读了一下官方的最佳实践文档,了解了一些Unity的内存管理的知识,稍微总结一下。
随着使用的逐渐增多,慢慢受不了在对这些概念的模糊的情况下使用了,所以找了些官方文档来学习一下C#中的这些概念,主要是为了区分委托(Delegate),事件(Event)。
其实我个人在读文档之前一直是对这些概念很模糊的,甚至一度被网上的各种博客绕晕了,甚至把Action,Func和委托都混淆了。
终于在我去读了官方的文档之后,我才对这些概念有了一些认知。
首先抛出最重要的结论,委托和事件都是为了提供后处理函数的方式,事件其实也是基于委托的多播的,而每次使用委托都要定义一个新的委托类型不方便,所以又提供了两种强类型的委托,就是Action和Func。
最近看了些关于Unity体积优化的方案的文章以及Unity官方文档,总结了一下