如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染
7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行。本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术、新实践,如AR、区块链、安全、大数据等。

Unity大中华区技术经理成亮表示,实时渲染技术的跨平台性能让游戏体验变得更好
Unity大中华区技术经理成亮做了《解秘Unity2018最新实时渲染技术》的主题演讲,分享了2018年Unity在实时渲染方面实现的三个重要技术,包括图形相关的可编程渲染管线、基于渲染管线推出的Shader Graph、PostProcess工具以及ECS、Burstcom等性能相关技术。
成亮表示,Unity具有完整的生态环境,一直致力于解决图形、网络以及AR问题,让越来越多的开发者做出炫酷的游戏或者动画。目前,Unity已经开发了大量耳熟能详的游戏,还为电影行业、工业、医疗、汽车等领域提供了远程数据分析、数据追踪、远程调试、货币化等能力。而这其中,一个关键的技术应用就是今年推出的实时渲染相关技术。
Unity实时渲染技术具有强大的跨平台能力,主要包括图形相关的可编程渲染管线、基于渲染管线推出的工具、以及ECS、Burstcom等性能相关的技术。
成亮介绍到,随着游戏种类越来越多,传统的渲染管线已经越来越难以满足游戏功能的需求。而Unity推出的可编程的渲染管线,不仅可以让用户自定义渲染流程,而且具有非常好的扩展性,在保留了经典C++内核的前提下提供了更多的接口。可编程渲染管线提供了两套开源的模板,用户可以根据需求来实现定制化的功能:
HD(High-Definition)主要针对高端的PC平台,这一类管线提供了更加精确的模型和高级材质,在定制渲染管线时对用户更为透明,对于灯光的配置也有所增强,能够帮助用户实现非常华丽的渲染效果;
• Lightweight主要针对移动模块和XR平台,让用户在兼顾性能的同时可以适配到更多的设备。它采用的Single-Pass Forward Rendering可以支持8盏像素光在一个批次内进行渲染,而且提供了非常便利的材质升级工具。
随后,成亮还详细阐述了Unity基于渲染管线所推出的Shader Graph、Progressive Lightmapper和Post-processing v2三个工具:
• Shader Graph是一种节点图方式,能帮助用户无需编程即可创作,极大降低了编程门槛;
• 后处理站提供了丰富的效果功能,支持设置不同的区域和灵活可拓展的框架,此外也兼容最新的可渲染管线;
• 渐进烘焙可以方便用户实时看到烘焙的过程,给用户的工作流带来了非常大的便利和效率提升。今年还会推出基于GPU的渐进光照功能,效率将提升10倍以上。
在性能方面,成亮最后提到,Unity推出的一套新系统,可以帮助用户实现性能上的巨大飞跃。这一系统包括三部分:Job System,帮助用户利用GPU多核处理能力;ECS,让数据的内存排列更为紧密,提高缓存的命中率;Burst Compiler,技术优化的编译器。
以下是成亮演讲实录:
大家好!我是来自Unity的成亮。今天非常高兴有这个机会来到杭州,跟大家分享Unity在2018最新的实时渲染技术。
今天主要分享的内容有四点,首先我会对Unity做一个基本介绍,后面则会介绍今年Unity在实时渲染方面比较重要的三个技术:一是图形相关的可编程渲染管线;二是基于渲染管线推出的工具,包括Shader Graph、PostProcess;三是ECS、Burstcom等性能相关的技术。
首先介绍一下Unity。2014年Unity在丹麦哥本哈根成立,它有三个创始人,他们分别提出了三个公司理念:开发民主化、解决困难问题以及帮助开发者成功。民主化这个概念很好理解,就是降低技术的门槛,让越来越多的开发者能够做出很炫酷的游戏或者动画。相对应来说,就要求Unity公司解决比较困难的图形、网络以及AR问题。
Unity具有完整的生态,它有很强的实时渲染引擎,具备强大的跨平台能力,除此之外还提供了远程数据分析、数据追踪、远程调试、货币化等能力。截止到2017年统计数据,有200亿应用软件安装量,有30亿移动设备是用Unity软件安装的。在排名前1000名的游戏中有40%是用的Unity,新的制作游戏超过了50%,还有60%的VR和AR应用是用Unity来开发的。Unity开发了很多耳熟能详的游戏,以及在电影行业、工业、医疗、汽车等等领域,也有不少厂商用到Unity来做实时渲染的工具。
下面开始介绍实时渲染相关的技术。首先看一下图形方面,今年我们最重点推出的技术是可编程渲染管线,相比之前的管线,可编程渲染管线提供了更多渲染的接口给到开发者,你可以按照自己的需求定义你的开发。当然我们为大家准备好了两个模板:HD(High-Definition)主要针对高端的PC,这个管线提供了更加精确的模型,提供了非常高级的材质,帮助大家能够实现非常华丽的渲染效果;Lightweight主要针对于移动模块,让大家在兼顾性能的同时适配到更多的设备。

这是目前的渲染管线,它可以定制的功能很少,你可以选择Forward或者Deferred:Forward中物体接受的光照数量决定其渲染批次,当光照数量很多时就会遇到新的问题;Deferred中是在最后应用一次光照,但是Deferred有对硬件的要求,所以在某些移动平台是不支持的。 除此之外,还可以编写一些Command Buffer,也就是在渲染管线的时间点,比如上图中绿点的地方,你可以插入自己的渲染。
随着游戏种类越来越多,传统的渲染管线越来越难以满足游戏的需求。比如我们看到有非常3D的、光照非常多的游戏,也有2D的卷轴游戏,这些游戏用一条管线很难兼顾到这样的性能;又比如一个2D的游戏或者一个FPS游戏渲染的时候有很多权衡的点,2D根本不需要光照,材质也不用是基于物理的材质......等等。
所以Unity在今年推出了可编程的渲染管线,它可以让用户自定义渲染流程,比如你的剪裁或者绘制物体,这些流程都可以按照自己需要进行控制。新的渲染管线有非常好的扩展性,针对原来的渲染管线进行了有效的提升,保留了经典的C++内核,提供了更多的接口,帮助大家尽可能化地定制自己的功能。除此之外还提供了两套模板,大家可以根据需要去定制功能,而且这两套功能都是开源的,所以也是给了大家一个非常好的参考。
首先看一下Lightweight,它主要针对移动和XR平台,提供了非常方便的材质升级工具,而且对于一些不需要光照的材质完全兼容,所以升级到这套管线非常方便。它的渲染也和原来有所不同,采用了Single-Pass Forward Rendering,可以支持8盏像素光在一个批次进行渲染。我们之前做了一个Trash Dash实例,它是一个3D游戏,但实际上没有利用到光照,所以它利用我们的材质升级工具,就非常容易从原来的管线升级到了现在的管线。
下面看一下High,High功能很多,在这里就给大家做一个详细的拆解和介绍。它分成六大块功能,首先它的渲染管线有一个比较大的改变,渲染管线相对之前采用了新的模型,物理计算会更精确。它在定制渲染管线时对用户更为透明,用户只要关注设置的属性就可以了,而不用关注选择什么样的管线。它主要针对高端的PC平台,对于灯光的配置有增强,光照和阴影方面可以采用色温来控制光照的颜色。光线形状也有很多选择,还增加了新的区域光。材质比较多,提供了非常多的高级材质,供大家选择。还有基于分层的材质系统,有变形的特效。调试方面,提供了新的可以观察调试的窗口。
新的管线不用再去选择配置,用户根据自己的需求来设置渲染管线就可以了。一是增强了光照配置,能根据色温来控制颜色,支持更多的形状,包括锥形、方形或者金字塔形状,支持光线颜色的效果;二是新增了区域光类型,支持实时区域光,而且区域光形状包括了橘型、圆形等形状;三是提供了新的光照模型GGX,在传统模式下是单显色模型,粗糙表现颜色不会饱和,而且会带有发暗的现象;此外还新增了非常多的材质,包括彩虹色加透明漆材质的效果、双面透明的效果、分层的模型、体积光和光速效果、No Occlusion Probe效果等等。
除此之外,新的管线还新增了调试窗口,在这个窗口中可以看到丰富的信息,包括材质、光照等等。如下所示,这个图可以看到正在渲染的物体表面的发线,它不光可以在编辑器上面使用,还可以实时连到PC端上进行查看。

在调试窗口支持只显示某一种光照,比如只显示慢反射。还支持中间的渲染目标,比如Depht Buffer显示,左边只显示了Diffuse Lightin。

以上给我们展示的是Unity可编程渲染管线所能够呈现出的实时渲染的效果。下面我们看一下方便大家创作的工具,Shader Graph、Progressive Lightmapper和Post-processing v2。
Shader Graph是一种节点图的方式,来帮助大家无需再用编程的方式进行创作。它带来的好处是不用编码,可能减少了一些语法或者调试的痛苦,降低了大家编程的门槛。
后处理站有非常多可以选择的效果,可以设置不同的区域,还支持灵活可拓展的框架,因为这也是一个开源的功能,所以大家可以根据需要去看,一方面提供了自定义的API,大家可以自定义,另外也可以看到整个代码。另外也兼容最新的可渲染管线。
再看一下渐进光照烘焙,实时渲染场景有很多灯光是先静态烘焙上取得,尤其是像间接光照,都是烘焙上去的,因为如果实时计算肯定来不及,所以通常在做项目的时候有光照烘焙的功能。而渐进烘焙可以实时看到烘焙的过程,而且可以优先看到视图窗口显示的效果,这样给大家工作流就带来了非常大的便利和提升。除此之外,今年应该还会推出基于GPU的渐进光照功能,这样光照烘焙效率就会提升10倍以上。
今年在性能上面Unity推出了一套新的系统,可以帮助大家在性能上面有质的飞跃。最新的系统包括三个部分:一是Job System,帮助你利用GPU多核处理能力;二是ECS,能够让我们数据的内存排列更紧密,提高缓存的命中率;三是Burst Compiler,是技术优化的编译器。

如上所示,这是现在的系统。其中会引用到各种各样的组件,它就是一个引用列表。这样一来,这些引用类型没有办法控制它在内存中的排布,所以它是分散在内存中的,这样数据分散的结果是导致缓存命中率比较低。还有一个问题,如果单核的情况,一旦任务比较多,它处理的速度就会越来越慢。
Entity Component System中,我们把数据和函数分开,Render包含了数据,通过对数据进行分类处理,再派发给不同的任务进行处理。如下所示,这就是一个结合的架构图。

来看一个实际的例子,来看它具体提升了多少性能。如下图显示,传统方式下飞船包含了Movemen组件,在这种情况下,同屏渲染了18500个飞船。但是再加入变形,在飞船里面就没有了任何的应用。所有的任务都是通过函数来执行的,所以把它Job system变形化之后,性能大概可以提升到25000个,提升了三分之一的性能。

再看ECS With Job system,数据紧密化加上并行化之后,在ESC With Job system情况下,我们从最开始的18000个变成了96000个,性能提高了5倍。再加上Burst Compiler,数量达到了156000个,比最开始的做法性能提升了接近10倍。


以上就是Unity最新的关于实时渲染的技术进展,希望能够帮助到开发者能够实现更炫酷的效果,谢谢大家。
如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染的更多相关文章
- "xaml+cs"桌面客户端跨平台初体验
"Xaml+C#"桌面客户端跨平台初体验 前言 随着 .Net 5的到来,微软在 .Net 跨平台路上又开始了一个更高的起点.回顾.Net Core近几年的成果,可谓是让.Ne ...
- 3D位置语音,引领吃鸡游戏体验升级
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯游戏云 导语:在刚刚结束的首届腾讯用户开放日上,腾讯音视频实验室带着3D位置音效解决方案,向所有用户亮相,为用户提供360度立体空间的 ...
- Camel Games借助AWS在爆发式增长中提供优质游戏体验
关于Camel Games Camel Games 成立于2009年,是中国首家得到google市场官方认证的顶尖开发公司.长期以来,Camel Games始终依靠于率先的技术背景,致力于成为国际一流 ...
- 玩家福音:10款最佳Linux免费游戏
“我能在Linux平台上游戏吗?”这类疑问正困扰游戏玩家,那么答案就是“快去Linux平台吧!”.开源组织一直以来坚持不懈为Linux操作系统开发不同类型的游戏,在Linux平台下的游戏完全不亚于其他 ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]
微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的 ...
- [转][ASP.NET Core 3框架揭秘] 跨平台开发体验: Windows [上篇]
微软在千禧年推出 .NET战略,并在两年后推出第一个版本的.NET Framework和IDE(Visual Studio.NET 2002,后来改名为Visual Studio),如果你是一个资深的 ...
- Fuel4D 2.1 免费跨平台游戏引擎 现已发布
Fuel4D 2.1 免费跨平台游戏引擎 现已发布 开发环境:纯 C/C++,无JAVA.O-C. 支持 WIN32.安卓 系统. 详情见官方网站:http://www.fuel4d.com 或者进F ...
- HTC VIVE 虚拟现实眼镜VR游戏体验
HTC的VIVE入手一段时间了,体验了几个免费的VR游戏,效果还不错,分享一下. 1. VIVE主要部件 VIVE的主要部件有3个,分别是头盔,两个无线控制手柄和两个定位器. 1.1 头盔 头盔整体照 ...
- [ASP.NET Core 3框架揭秘] 跨平台开发体验: Docker
对于一个 .NET Core开发人员,你可能没有使用过Docker,但是你不可能没有听说过Docker.Docker是Github上最受欢迎的开源项目之一,它号称要成为所有云应用的基石,并把互联网升级 ...
随机推荐
- CentOS查看线程、硬盘、内存、cpu、网卡
1.查看硬盘 [mushme@investide ~]$ df -ah 2.查看内存 [mushme@investide ~]$ free -m 3.监控系统的负载 w 查看当前系统的负载,详细 ...
- [19/03/30-星期六] IO技术_四大抽象类_ 字节流( 字节输入流 InputStream 、字符输出流 OutputStream )_(含字节文件缓冲流)
一.概念及分类 InputStream(输入流)/OutputStream(输出流)是所有字节输入输出流的父类 [注]输入流和输出流的是按程序运行所在的内存的角度划分的 字节流操作的数据单元是8的字节 ...
- Elementui 导航组件和Vuejs路由结合
Elementui 导航组件和Vuejs路由结合, 达到点击导航切换路由,根据路由定位导航 一下是nav.vue代码,导航数据以json格式配置 <template> <el-men ...
- 如何用javasript对Gridview的项目进行汇总统计?
当我们在gridview显示统计信息时,都会想在gridview最后一行显示[小计]结果,但gridview的话好像比较难搞(至少我也不会呀 囧~),那么我就结合jquery写了一个解决方案,下面举个 ...
- init/loadView/viewDidLoad/initWithNibName/awakeFromNib/initWithCoder的用法
init/loadView/viewDidLoad/viewDidUnload 这么细节的东西想来大家都不在意,平时也不会去关系,但是在面试时却常常被提到,所以了解viewController的生命周 ...
- STM32F103 ucLinux开发之二(内核启动汇编代码分析)
start_kernel之前的汇编代码分析 Boot中执行下面两句话之后,进入uclinux内核. theKernel = (void (*)(int, int, unsigned int))((ui ...
- Unity3D Errors And Fix
Author Error: Shader warning in 'Custom/ShowAnimation': Not enough temporary registers, needs 9 (com ...
- iOS小知识点
1.子视图超出frame的部分不显示 view.clipsToBounds 设置为YES; UIScrollview的clipsToBounds默认就是YES 2.UIImage 有一个属性叫s ...
- 用java集合模拟登录和注册功能
package com.linkage.login; import java.util.HashMap;import java.util.Iterator;import java.util.Map;i ...
- dmesg功能介绍
dmesg 命令的使用范例 ‘dmesg’命令设备故障的诊断是非常重要的.在‘dmesg’命令的帮助下进行硬件的连接或断开连接操作时,我们可以看到硬件的检测或者断开连接的信息.‘dmesg’命令在多数 ...