【腾讯开发者大会】天刀手游开发历程(笔记)

前言

最近腾讯游戏学院发布了一些游戏行业内大佬们的分享视频,观看这些视频,我们可以了解到行业内最新的一些技术知识等,以便提升自己的水平。之前也看到天刀手游是基于Unity制作的,同时自己也作为一名天刀游戏的玩家,碰见看见有关天刀手游的技术分享,因此必然要学习学习,了解大佬们的核心先进技术。

链接:https://www.bilibili.com/video/BV1EZ4y137db?p=6

本文目前基本仅仅只是对视频的内容的抄录,因为视频大部分提到的知识都没有接触过(唉!),无法跟进一步的拓展来说。以后有时间一定好好研究一番,同时若后续项目需要,也可以以此作为一个研究方向的参考。

 

手游研发的三要素

画质,帧率,功耗(pc可以不考虑),三者协调。例如当我们的帧率达到一个预估值后,我们可以再努力提升画质。当画质提升后,必然会造成帧率的下降以及功耗的提升,因此我们需要再优化帧率以及功耗。通过这种方式来达到三者平衡以及不断的拔高。

 

利用各种技术栈来优化

在游戏开发中,我们往往需要各种优化来提升性能,这点是非常非常重要的。视频中的大部分内容介绍的也就是如果通过各种技术栈,来获得更好的优化效果。

天刀手游主要用到了如下几个技术点来进行优化:

  • 对多线程渲染引擎,进行优化,把大部分可以并行的工作,比如动画、布料,放到其他的线程去运行。
  • 使用ISPC,来自动生成NeonSIMD的代码,这部分代码可以更好地提升CPU的执行效率。
  • 在GPU和CPU的遮挡剔除中,使用不同粒度的遮挡剔除算法,首先启用了Vulkan API,通过它来对GPU的内存进行更好的粒度上的管理。
  • 实现了GPU Driven的渲染管线,用compute来辅助优化各项其他的渲染技术。
  • 在画面上使用了PBR的材质,使用了真实的物理单位的lighting,获得更好的HDR的画面效果。

在开发过程中,经历了多线程的优化,发现了在做手机平台上的一个优化甜区。即手机的多核要比我们在端游时代开发的时候更早的进入了多核时代。现在很多安卓手机都是4+4的多核架构(像更早时候在主机平台上看到的,如xbox360,ps3),在这些架构下,都是以能让开发者更多的使用这些辅助的计算单元,来提升计算效率。因此有两个大方向:

  1. 尽可能剥离主线程上的计算,通过dispatch到小核上,dispatch到其他线程上,来提升它的计算效率。
  2. 把计算转入GPU Compute。

做优化时,团队要有一个非常好的基础,这个基础来源于我们在于从多线程开始,意识到整个计算体系,应该不同的去往compute方向,或者往其他线程方向去使用。通过减少主线程的开销成本,来去提升整个游戏的性能效率

 

多线程的框架改动

对Unity进行了多线程的框架改动,把渲染线程和提交线程从主线程中剥离出来。因为在手游的开发环境里,一个主线程的持续工作会带来手机芯片的功率提升,这会带来更多的发热。

 

Vulkan API

官网:https://www.khronos.org/vulkan/

相关文献:

https://geek-docs.com/vulkan/vulkan-tutorial/vulkan-tutorial-index.html

https://vkguide.dev/

https://connect.unity.com/p/zen-yao-tong-guo-unityshi-yong-vulkan-api-vulkan-gpu-da-pk?app=true

Vulkan是数字图形技术产业诞生的一个全新图形接口项目,它类似于OpenGLDirect3D,并且在某些领域上要优于这两者。Vulkan针对高性能的实时3D应用,如跨平台的各类3D游戏和交互软件,并提供更好的性能和更低的CPU占用率,而且在多核CPU协同负载运行更加优秀。

天刀手游也引入了Vulkan API,它相对于OpenGLES来说的话,有着更好的,更轻量级的调用。进过他们的测试,可以做到在提交线程上获得30%的CPU的效率提升。

同时Vulkan API是更加自由的开发方式,可以在其中进行各种各样的优化。例如对一些比较重的Vulkan API操作,像Descriptor Set的绑定Layout的绑定,都可以采用一些Cache的方式来去做。Vulkan API的灵活性可以使得开发时获得更好的解法。

 

GPU Compute

GPU Compute即Compute Shader,在它的帮助下,程序员可直接将GPU作为并行处理器加以利用,GPU将不仅具有3D渲染能力,也具有其他的运算能力。在前面的Vulkan以及后面的GPU Driven的相关文献中,都有所介绍。

视频中的解读如下:

  1. 它首先是一个现代渲染框架的一个基石,除了GPU进行光栅化处理的部分之外,compute能够完成大量的GPU的渲染流程上的操作,包括计算光照,计算材质等等。另外值得注意的是,compute的渲染语言,其实是完全能和GPU本身的硬件对应起来,例如Local Data Storage机制,例如ThreadGroup和Thread利用率的概念,这两个都能很好的在compute语言上表现出来。
  2. 使用compute能够发挥Vulkan更大的潜力,因为我们可以使用Vulkan对GPU的同步行为做出非常好的控制。而compute作为一个独立的单元,我们可以把compute的计算很好的和GPU的其他计算并行起来,例如compute可以和一个带宽优先的(像shadow pass)进行并行。另外compute是一个单独的Queue,我们可以对比vs和ps的整套pipeline来说,它是一个非常简化的单元,非常容易到处去摆放的。
  3. 采用compute的话,可以给GPU Driven和Bindless打开更广阔的优化空间。我们甚至可以使用Async compute的方式来更进一步的并行compute和GPU的单元。
  4. 对天刀手游而言,打开compute的关键突破点就是GPU Driven的地形系统。

 

GPU Driven

参考文献:https://www.raywenderlich.com/books/metal-by-tutorials/v2.0/chapters/15-gpu-driven-rendering#toc-chapter-018-anchor-001

https://zhuanlan.zhihu.com/p/37084925

天刀手游同时也引入了GPU Driven的技术,通过它可以把大部分CPU上的工作转移到GPU上去运行。不仅提升了GPU的效率,也减少了从GPU到CPU之间的各种传递的带宽。这项技术可以运用在地形上,以及草和植被上,同时在家园里也运用了这些效果。

 

何为GPU Driven Pipeline?

首先是GPU掌握实际的渲染控制,可以提供更细致的渲染力度。例如我们在做渲染剔除的时候,CPU只能控制在object level,使用Object Bounding来去做剔除。我们在GPU这个层面上,可以做到更进一步的控制,我们可以在Mesh cluster级别上,通过切分Mesh来获得更好的力度控制。

另外一个好处是,它不需要GPU和CPU之间的数据来回传递,在理想情况下,GPU Driven甚至可以使用一个drawcall来绘制完整个场景。当然了,这个需要compute shader的支持以及indirect drawing相关api的提供。在Vulkan1.0的情况下都可以拿到相关的支持。

 

行业发展

在最近几年里,GPU Driven其实是一个相对来说比较热门的研发方向。以下是历年来的一些参考文献:

  • siggraph15 <GPU-Driven Rendering Pipelines> ubisoft:主要是讲《刺客信条:大革命》的开发。
  • gdc16 <Optimizing the Graphics Pipeline With Compute> EA frostbite:EA的寒霜引擎(Frostbite Engine)也提到了GPU Driven的pipeline。
  • gdc18 <Terrain Rendering in "Far Cry 5"> ubisoft
  • gdc19 <GPU Driven Rendering and Virtual Texturing in "Trials Rising"> ubisoft

但是在手机的领域上,目前还没有一些技术能够真正在在线的产品中体现出来。

 

天刀手游中的运用

首先介绍下CPU地形常用的算法,在天刀手游上个版本里的地形算法是CPU端的Geometry Clipmap算法,它采用的裁剪剔除方式是视锥的裁剪剔除方式。对比GPU Driven来说的话,它少了depth剔除。并且它的计算LOD的方式是根据距离计算的,而GPU Driven可以根据距离和地形块的复杂度来计算。送入clipmap方式的顶点处,因为有两个pass,其中一个要通过Virtual Texture来使用,这样的话它是需要21万*2的顶点数。而GPU Driven情况下,因为获得比较好的剔除效果,它只需要8万6的顶点数。

此外,在GPU Driven情况下在iphone8p上可以获得2.9ms的时间开销,这比通过CPU的方式下,节省了近四分之一的成本。而在CPU端获得的收益更大,我们提交线程和渲染线程,每个都可以获得5ms以上的收益。

下图即是两者的对比:

 

使用流程

它主要包含GPU Driven和Virtual Texture两个算法,它们的实现有着互相的交叉。出于简化,视频只介绍一下GPU Driven相关流程上的一些算法。

  1. 首先是一个深度的mips生成,这部分算法是在compute里面实现的。
  2. 其次我们在compute里面实现GPU遮挡剔除,使用上一步制作的深度缓冲buffer。GPU的遮挡剔除主要是通过计算你送入的patche的尺寸,看它处在哪一级的深度缓冲上,然后来对比这一级深度缓冲的深度和你的深度,来决定是否被depth剔除掉。
  3. 通过这个流程我们可以获得可视的patches数目,然后根据这些可视的patches数目,仍然通过compute用来做indirect的Arguments的buffer来生成出来。
  4. 将这些准备好的indirect buffer给绘制出去。

 

Hiz Buffer(Hierarchical Z-Buffer)Occlusion Culling 优化

有一个非常重要的优化,也是在compute上可以达成的。该优化主要是利用compute里面的一个Thread shared memory的方式来做。这个优化它减少了对于CPU和GPU之间的多次的dispatch,减少了binding memory pingpong操作。它能应用的范围主要在于对你的buffer做filter,例如我们经常在渲染管线中提到的bloom,高斯模糊以及自动曝光等,这些对于区域进行filter的操作都可以获得优化。

应用

首先会做第一次的dispatch,这个dispatch会产生16*16的线程组,每组128条线程。我们这128条线程读入深度放入mips里。

第二步通过同步的方式,再把上一级的mips相邻的四个点取出来,合并选择最深的单位,写到第二级的mips里,然后以此类推,完成四级的写出。

在第二个dispatch里,用同样的方法,dispatch一个线程组,128条线程。同样的把后面的32*16的mips写入完成。

 

LOD优化

Farcry的实现里面,它主要采用的是CPU四叉树的方式来组织LOD的patches。根据距离更新四叉树上的节点,然后根据相机的距离选择这些节点,送入GPU进行indirect bufferGPU Culling

对于天刀手游来说,我们把这些patch信息先通过offline的方式bake出来,我们在每个相机发生位置变化的时候,会去更新这些bake出来的信息。根据这些信息,我们会去对改变的patch做过滤,然后生成新的indirect buffer。

应用

第一步,读到了所有的patches的属性。

第二步,根据视锥裁剪,获得视锥裁剪之后的结果。

第三步,再用HiZ产生的depth,产生一次depth裁剪。

这三步完成后,我们就可以生成Indirect Draw Arguments的buffer,将其dispatch出去。

 

GPU Driven的其他应用

除了地形以外,GPU Driven还可以应用在草地以及家园等系统中。

应用 Grass(场景的植被管理)

有经验的渲染程序可能直接会意识到这一点。草的geometry和地形的patch或者是sector的管理是一个非常类似的概念,他们都有LOD,都有不同的geometry的表现。绘制这些geometry LOD的时候,最好的方法是通过Multi Draw Instanced Indirect的方案来做。

另外一点这些草的Texture,每种草的Texture它其实对应在地形上更像是一个地形的Virtual Texture机制。我们也可以用bindless的方式去做绑定。可是在Vulkan 1.0 的平台情况下,我们这两个API,Multi Draw Instanced Indirect或者是bindless,都没办法获得更好的支持。因此在天刀手游的实现里,我们只能采用将草的每种类型完成一次GPU Driven的culling和Draw Indirect Buffer的生成。

 

应用家园渲染

在家园的玩法里头,主要是可以让玩家尽可能多的定制我们整个家园的地形,地表,墙壁,物件,地板等等。在这个层面上,我们知道,它其实是需求非常多的geometry类型。第二它的区域相对来说比较小,只有128m*128m的自定义空间,而在这种小的自定义空间的情况下,遮挡剔除必须要做的非常好的一种技术。这两点来看,GPU Driven非常非常的适合应用在家园渲染的情况下。

问题在于家园里的这些物件其实和草的类型一样,都非常依赖于Multi Draw Instanced Indirect和bindless这两种api的实现。对天刀手游来说只能退而求其次,利用地形步骤算出来的HiZ buffer做遮挡剔除,我们送入一套做遮挡剔除buffer的内容,然后通过CPU从readback的方案来获得这些buffer的遮挡剔除结果,然后在CPU端组织尽量多的instance对象。即使采用这样的方式,在家园渲染情况下,也获得了比较好的渲染效率。

 

光照的优化

修改和提升了整体的光照表达,引入了自动曝光,提升了Tone mapping(把HDR变成LDR的过程)的效果。解决了由于真实物理单位引入之后,在不同的光照环境下lighting体现的一些细节的颜色丢失的问题。并且重新对sky lighting进行了定义,使得整个场景的室外表现更加丰富和具有对比度。

 

Compute的尝试

在完成了compute的基础机制上,进行了其他的尝试。其中一条是,完成了在ASTC和PVRTC的GPU实时压缩。这个也是通过GPU compute来实现的,这个功能可以用在角色的妆容系统上。

 

妆容系统

在天刀手游中,整个角色他的妆容系统是需要完成多个Feature的绘制,如果不能很好的baking到一张贴图上,在实时渲染的情况下,它会产生更多的一些开销。在实时baking到贴图上,我们还希望它能够尽量去做压缩,来减少内存的使用。测试了一些compute compression的效果,在PSNR和效率上都能获得比较好的表现

 

尝试Virtual Texture Compression

尝试了对于Virtual Texture的压缩,前面提到地形的Virtual Texture技术,是需要更新大量的地形块数据。越多的地形块数据,才能使你更新的频率变低。

在天刀手游中,我们使用2048*2048,三张不经压缩的材质。我们通过调整贴图的尺寸,大小,数量以及压缩方式。基本上能够把大张贴图的压缩时间控制在4ms以下,可以达到使用的效果。

         

远处来看,地表材质很难观察到差异性,这种算法对比了一下它的细节表现,我们仍然可以看到压缩后是有一些Blocking的瑕疵(如下图)。这样的瑕疵在天刀手游的画面品质下是不能接受的。因此该方案被放弃。

 

尝试Cluster deferred

尝试了Cluster deferred,它主要应用于家园室内场景。该场景,它首先是一个封闭的空间,有大量的动态的物体,动态的光照效果。下图中的图片中大概有55盏灯,从左上角的一张蓝色背景图来看这个区域被多少光源照亮的情况。最多的话可能是8盏灯以上的照亮。

在这个技术方案实现之后,发现仍然解决不了几个问题

第一个问题就是deferred本身带有的问题,即它的带宽问题,需要更好的设计GBuffer搁置。也需要去应用一些API,例如subpass,或者一些更好的pass combine的操作。

第二个问题在于它材质的复杂度,一个deferred的材质和forward的材质,在整个大世界的使用,是很难做兼容融合的。这个也增大了shader的复杂度以及工作量。

这个方向对未来也许是一个比较好的技术点,但是在现有的架构下还是不够成熟,该方案也被放弃。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/68669.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【028】仿猫眼、淘票票的电影后台管理和售票系统系统(含后台管理)(含源码、数据库、运行教程)

文章目录 1.项目概要介绍2.用户运行界面截图3.后台管理员界面截图4.后端启动教程5.前端启动教程6.源码获取 1.项目概要介绍 前言&#xff1a;这是基于VueNodeMysql的模仿猫眼、淘票票的电影购票系统&#xff0c;有 附源码、数据库、运行教程 技术栈&#xff1a;Vue、element-u…

C# 使用微软自带的Speech进行语音输出

1、在VS中使用微软自带的Speech进行语音播报&#xff0c;首先需要添加引用&#xff1a; 2、具体实现逻辑代码如下&#xff1a; 转载于:https://www.cnblogs.com/hh8888-log/p/10785112.html

如何使用 Web Speech API 在浏览器中识别语音

Web Speech API有两个功能&#xff1a;语音合成&#xff08;文本到语音&#xff09;和语音识别&#xff08;语音到文本&#xff09;。在上一篇文章中&#xff0c;我解释了语音合成&#xff0c;但这次SpeechRecognition我将解释使用 API 的浏览器的语音识别和语音转录的方法。 识…

使用windows自带的语音引擎在客户端朗读一段文本

背景&#xff1a;之前公司有特殊要求&#xff0c;需要在特殊的环境下进行语音播报&#xff0c;且是物理隔离的内网状态&#xff0c;大家懂的。 环境&#xff1a;Windows 7 、IE系列 1. 先在网上看了一下前辈们的文章&#xff0c;发现还是有解决方案的&#xff0c;例如这个 使用…

占领手机,银行App的隐秘战事

作者 | 辰纹 来源 | 洞见新研社 十几年前&#xff0c;银行用各类卡片塞满我们的钱包&#xff1b;如今&#xff0c;银行用各种App塞满我们的手机。 说出来可能很多人还不相信&#xff0c;民商智慧《2019银行业电子银行场景营销分析报告》就提到&#xff0c;在2019年3月时&…

ADAS“中国战事”升级

尽管全球汽车产业面临严重的缺芯困境&#xff0c;但汽车智能化&#xff0c;尤其是辅助驾驶的新车搭载量、渗透率仍处于持续上升通道。 高工智能汽车研究院监测数据显示&#xff0c;今年1-6月国内新车&#xff08;合资自主&#xff09;搭载前向ADAS&#xff08;L0-L2&#xff0…

中国数据库产业的“高地战事”

作者 | Aholiab 出品 | CSDN(ID&#xff1a;CSDNnews&#xff09; 随着5G技术的飞速发展&#xff0c;海量数据的持续激增&#xff0c;大数据时代数据库行业也迎来了快速增长。 作为大数据存储、处理、分析的关键系统&#xff0c;基础软件核心之一&#xff0c;数据库对推动中国互…

python数据挖掘电影评分分析_豆瓣电影数据与票房数据分析

写在前面 在上次观看了比利.林恩的中场战事之后,开始进入了豆瓣的电影世界,对于一个新用户来说,特别喜欢豆瓣电影的影评,对于所看过的留下深刻印象的电影都在豆瓣上搜了一边,同一部电影,希望能看到与自己感受不同的观点,因为每一位观众都有着不一样的人生轨迹,看待事物…

百度的春晚战事

“我们对春晚一无所知。” 罗振宇曾在跨年演讲上如是说。 无论悲喜&#xff0c;反正每个中国人都为春晚辟出了一块“专属记忆”。而从2015年开始&#xff0c;中国人的春晚记忆里被点上了一颗“红痣”。那就是——总有一家顶尖互联网公司面带羞赧地走上舞台&#xff0c;给十几…

知云文献翻译打不开_英文PDF文献翻译神器-知云文献翻译

在经历了之前推荐的通天塔文献翻译网站次数使用完毕&#xff0c;冲会员才能继续使用&#xff1b;谷歌PDF翻译无法使用&#xff1b;谷歌文字翻译要自己手动删空格&#xff0c;还要受5000字符数&#xff08;注意&#xff0c;是字符数不是字数&#xff09;限制的折磨之后&#xff…

知云文献翻译打不开_只推荐这两款翻译软件!

上传文档、复制到网页等等&#xff0c;都是渣渣&#xff01;难道就没有一边看一边就自动翻译的软件&#xff1f;有&#xff01;有的&#xff01;还不止一款&#xff01;诚意推荐给你&#xff01; 截止2020年&#xff0c;因为学业需要&#xff0c;本人每天都需要阅读外文&#x…

知云文献翻译打不开_有了这几个软件,轻松读懂英文文献

科研路上&#xff0c;大家伙儿难免绕不开的结就是——阅读英文文献。 然而&#xff0c;当你问大神用的什么翻译软件时&#xff1f;大神会分分种藐视你&#xff0c;人家偶尔查个单词跟你要查整篇文章完全是两个概念&#xff0c;咱们跟大神面对的是不同的问题&#xff0c;这也是为…

文献工具 Citavi+知云翻译

1、B站一位UP主分享的Citavi知云翻译的高效管理阅读文献的方法&#xff1a; https://www.bilibili.com/video/BV1Zt4y117XX/ 其中如何在tools中显示 经实验发现&#xff0c;是需要修改自己电脑上PDF的默认打开方式的&#xff0c;这个操作也特别简单 随便找一个PDF文件&#xf…

知云文献翻译打不开_一款好用的文献英中翻译软件

“ 知云文献翻译 ” 软件是我用过的一款比较好用的文献翻译软件。操作简单&#xff0c;只需要将文献 PDF 在这个软件中打开&#xff0c;第一次登录时点击右侧“重新登录”&#xff0c;用微信扫码登录即可。左键选中 PDF 中没有看懂的单词、句子、甚至是段落&#xff0c;该软件右…

知云文献翻译跨页内容选中翻译操作

知云文献翻译阅读软件跨页内容选中翻译操作 跨页内容选中翻译。 很多PDF段落分布在两个页面&#xff0c;划选容易将中间的页眉等杂乱文字选中。6.6版本开始支持跨页内容选中翻译。 方法是&#xff1a; 先选中前面部分的文字&#xff0c;然后按住Alt键选中后面的文字部分。 …

知云文献翻译免费下载——研究生必备!

还记得之前我介绍了一个超全的文献下载网站——文献小镇&#xff0c;然后和朋友聊天的时候就想到了一个问题&#xff1a;下载下来的文献是全英文的&#xff0c;看不懂啊&#xff01; 于是我茅塞顿开&#xff0c;觉得还应该给大家介绍一个英文文献翻译的神器——知云文献翻译&a…

知云文献翻译——选中内容后不能翻译了,解决办法

划选文字&#xff0c;右侧无反应 故障描述 一般情况下使用文本工具选中左侧打开的pdf文件上的一段话或一句话或双击一个单词&#xff0c;右侧会自动跳转到二维码登陆界面或直接显示翻译结果。但某些用户选中文字后右侧没有任何反应。 排查流程 1、看看软件左上方版本号是否是…

知云文献翻译-选定内容后无法翻译

1.查看软件左上方版本号是否为最新版&#xff0c;如果不是就升级。 如果您没有上图所示的更新程序选项&#xff0c;说明是比较老的版本&#xff0c;您就自己到 https://www.yuque.com/xtranslator/zy/gga6xa 下载最新版安装版本安装。今后如果升级就直接点击"其他功能&quo…

在Endnote使用知云翻译阅读文献

下载知云翻译后&#xff0c;将pdf的打开方式改成知云文献翻译&#xff0c;右键pdf文件&#xff0c;打开属性&#xff0c;更改打开方式。 可能会遇到你在知云文献标记的pdf文件不能保存&#xff0c;即pdf是只读模式&#xff0c;可以这样设置&#xff0c;找到My EndNote Library…

外文文献看不懂——知云文献翻译神器送给你

外文文献翻译神器——知云翻译 1. 两种下载方式 1.1 下载连接&#xff1a;www.ZhiYunWenXian.cn 1.2 微信公众号&#xff1a;知云文献阅读 2. 安装方式 就按提示装就好了。 3. 界面介绍 看看界面的一些基础功能能否满足你的需要。 &#xff08;1&#xff09;主界面 &…