在5月10日到12日期间,有幸在上海国际会议中心参加了Unite Shanghai 2019大会。为期三天的Unite大会为大家带来了分享、交流和学习的平台,让开发者获取到最新的Unity技术知识和使用技巧。
因为没有参加10日的Training day,我就总结一下11日和12日的内容
这里大部分是本人的感想和一些笔记的记录,如果有问题,请大家见谅
11日的技术专场几乎都是外国大佬,本人英语不是很好,使用了同声翻译,但说实话同声翻译的并不是很好,外加上我看的内容并不是那么硬核,所以重点比较少。
简单来说就是介绍了《异教徒》中的一些技术,主要集中于Timeline和摄像机后处理Volume
这方面的介绍也很简单,如果有兴趣可以看Unity官方的视频:https://www.bilibili.com/video/av41365817
我就不多赘述了
又放了一遍《异教徒》,这次主要集中在了后处理方面,比第一场要详细一些
演讲者演示了他自己做的一个项目,从游戏过场动画的角度为大家演示了Timeline的使用方式
日式英语,我哭了,简单介绍了NPR(非真实渲染),效果还是很不错的(虽然我觉得还是去年米哈游的技术更加让我感到惊艳),但是日式英语真的劝退。
如果想要了解UTS2可以去Github上下载该项目:https://github.com/unity3d-jp/UnityChanToonShaderVer2_Project
当然大家也可以了解去年由米哈游带来的NPR。
没有学到任何内容(等了40分钟,终于看到了1分钟的紫式部宝具动画),简单来说就是介绍了他们公司的
音频研发团队、技术、团队的构成和技术如何更新,但是音频这方面我真的无能为力。
大意就是如题所示,介绍了Vivox的成熟技术,以及目前的广泛引用。
没有学到任何内容,介绍了HDRP和PBR之间的关系,对比介绍了光照的内容(事实上我看不出来有什么区别)。
最想了解的一项内容,但是讲的真的很差,并没有介绍SRP(可编程渲染管线),而是介绍了LWRP(轻量级渲染管线)和HDRP(高清渲染管线),然后就是ShaderGraph。
重点介绍了LWRP+ShaderGraph这个组合,然后在LWRP中自定义Render Passes,因为使用SRP重新构建渲染管线比较困难。
我没看,回去了…
这一天就都是中文了,不需要翻译,我在技术专场1听了一整天,大部分内容都是干货,甚至有些干的连点水分都没有,当然也有一些比较水的内容。
因为吃早饭去晚了,只听到了后面的一部分,因此没有技术性的内容,我只总结一下观点:
首先就是Unity目前推出的全新高性能多线程式数据导向型技术堆栈也就是DOTS(Data-Oriented Technology Stack),使用这个技术可以充分利用多核处理器,无需进行繁重的编程工作。
DOTS主要包含以下三个功能:
来自商汤科技的AI、AR的开发技术,主要是技术展示,内容比较少。
有关Timeline的内容看情况我会再写一点东西。
这里的应用案例和上面的使用方法不太一样,这里主要介绍了Timeline的结构。Timeline的底层是PlayableAPI,是一套树形结构,允许用户通过脚本来定义行为(非线性编辑工具),可以自定义Track。
Track就是一组序列化的数据作用在时间轴上的操作集(记不太清了,大概是)。
Track主要有三部分
public class MyTrack : TrackAsset
{
}
而Timeline主要分为两类:
这里还演示了一个Demo,主要是用Timeline实现了一个Dialogue系统,可以根据用户的输入做到非线性播放。还要注意:1.可以利用嵌套Timeline防止Timeline停止导致的BGM停止;2.可以在Timeline中嵌套AI;3.可以利用条件Timeline时间来控制AI的行为。(都还没验证)
未来我可能会介绍一个Timeline的使用,接着挖个坑。
这一次讲解的就比上一次讲解SRP要细的多了。
首先LWRP是基于SRP的,而SRP的底层部分被封装了起来,然后上层使用C#。LWRP和HDRP都是基于SRP的,并且都是开源的,可以去Github上下载:https://github.com/Unity-Technologies/ScriptableRenderPipeline
LWRP支持全平台,而HDRP仅支持高端平台。
如果要使用LWRP那么首先需要CoreRP和LWRP,可以通过Package Manager获得,之前所说的Volume可以用来做后处理。
LWRP中提供了很多功能,这些都可以自己查看案例,或者自己实际操作。
由于这部分的内容比较复杂,我以后有空会再具体介绍,再挖个坑。
没什么实质性内容,主要讲的就是Unity+VR。
究极硬核,超级干货,其实我都没法转述,我都想再听一遍,这里我也只能做到尽量总结。
什么是Unity序列化系统?
使用Unity的序列化系统来从硬盘或内存上保存和读取数据,比如说Instantiation(),再比如说打包之后的level0、sharedAssets0等文件,都是序列化之后的文件,而序列化的底层是C++,然后在C#中使用。简单来说就是将字段转换成文本,在这中间就需要一个transfer<>函数来帮助实例化的操作,而这个实例化的规则是由自己来规定的,以此做到文本的转换。
那么Unity中的各种Assets就是序列化后的产物,主要分为三种:
以下,我只是记录我的笔记,没什么逻辑,如果觉得看不懂就别看了
- Assets Pipeline 用于分配GUID,创建.meta文件,序列化之后保存
- Native Assets原生资源,可以保存为二进制格式
- Scene:主要由Setting和Object及其子项构成
- GUID:128bits/分配给Assets/保存在meta中
- FileID:分配诶给Object/保存在序列化文件中
- 通过GUID查找Asset文件;通过FileID查找MeshRenderer
- —!u!4 &456897987 其中4是ClassID即Transform,后面的一串是它的FileID
- Imported Assets是非原生资源,例如:Script,Shader,Model,Texture…根据setting和目标平台进行资源处理和序列化
- metadata序列化文件,文件名就是它的GUID,通过GUID的前两位hex进行分组,也就是共256个分组文件夹,metadata默认为二进制
- shader assets会根据不同的部分(关键字)进行序列化(序列化过程是多线程压缩数据),反序列化过程中会解压数据,从工作线程回到主线程,因此会出现尖峰,Unity Profiler不是原生查看shader的。优化建议:不要先看keyword,因为有的时候subshader多,pass多,会产生C++部分的对象。
- script assets是文本文件,会判断是否需要编译,从C#到IL,Tick->DirtyScript->c++激发->修改文本
- model 通过
Mesh Compression/Vertex Compression/Optimize Mesh Data来优化model的数据,Vertex Compression通过通道(pos,uv,vertex)会影响压缩的序列化信息;Mesh Compression比较迷,我也没怎么听得懂,反正不好用(貌似是通过舍去浮点数信息);OptimizeMeshData会关闭掉一些channel来压缩数据
总之这一章节真的很硬核,如果需要了解的人还是等官方视频或者看看别人的研究,我这里就是记录我了解到的信息。
显卡推销(大概)RTX系列,拥有新架构(Turing SM),实时光线追踪(RT Cores),加速AI计算(Tensor Cores)。
简单来说就是:发射光线=》递归找三角面=》交点处理(判断,计算,是否继续…)=》着色(是否有交点,如果没有交点就采用天空盒,有交点是采用最近的交点/忽视该交点并继续发射光线)
那么首先来说这个检测三角面的原理,主要是利用了BVH(Bounding Volumn Hierarchy)遍历,简单来说就是从大的包围盒一层层的到小的包围盒最后到三角面(可能可以参考八叉树的技术,大概吧),而这个递归找三角面的过程就是在Turing SM中利用RT Core来完成。
目前,在DirectX中有光线追中的接口,而问题就是会出现噪点(我认为是光线的数量太少导致的),利用RTX DENOISER SDK(Reflection/Shadow/AO)可以解决这个问题。
着色器表(Shader Table)包含了一次光线追踪中可能用到的所有资源,每条记录可包含加速结构中的节点指向着色器表中的对应记录
可参考:https://github.com/Unity-Technologies/Unity-Experimental-DXR
在说明HDRP之前,首先先要了解两种渲染管线:Forward Render和Deferred Shading
无论是Mono还是IL2Cpp,用的都是Boehm GC,这是一种保守式、标记-清除算法。
而目前GC的问题在于性能尖刺,目前的回收原理大致如下:
而标记的工程,也就是耗时最大的过程,使用的是深度优先的算法(非递归),使用堆栈辅助标记。
从mark stack中标记,扫描内存段,保守式的指针识别(因此可能会额外扫描内存块,也有可能出现误判),会有内存泄漏的可能(没有泄漏是因为有优化)
而Stop the World就是尖刺的罪魁祸首,有以下方法来解决:
分帧、多线程、并发式、分带式(也就是增量式GC,并且比较好)
简单来说就是改造了标记的过程:
但是要注意避免在垃圾回收时产生大量垃圾导致回收失败,而且新增的引用也会导致危险(当其父项被标记清除时),而且工作量上升了,只是分摊了工作量。
对于内存是否被标记过是使用VDB(Virtual Dirty Bit),以内存页为单位:
不想总结,累了(12号的内容太硬核了,感觉自己还有很多要学)