一直很好奇Moons studios究竟是如何在远程合作的状态下保持高度的生产力并完成如此优秀的游戏的,他们甚至在近期完成了近乎不可能的任务:让Ori在Switch上在对画面质量不怎么做出妥协的情况下让游戏稳定60fps,真的好想一窥他们的Workflow是怎么搭建的。

Switch与Xbox One的画面比较,不仅差异十分的小,还稳定维持在了60fps

终于Digital Foundary回应了我的期待!他们在前几天发布了个视频,就是关于Moons Studios在针对Switch上面的开发优化上做了哪些努力,并多少分享了他们的Workflow!于是兴奋的我反复看了视频数遍后草草记录下了重点。

游戏引擎采用的是自定义的Unity游戏引擎,并取名Moonity,是个完全围绕Ori游戏类型和渲染方式特别定制工作流及渲染管线的自定义引擎。

他们完全采用了Painter Algorithm的方案(由后往前绘制),结合Early-z pre pass规避Overdraw,并根据结果渲染成6张layers的RT,再与3D角色的RT layer blend在一起(不过由于层级的深度排序几乎是固定的,似乎做了些离线操作减少了early-z的gpu压力,至今没搞明白具体做了什么)。除了角色层以外,每个RT代表的layers都可以单独设置分辨率,不仅可以做出景深(Depth of field)的效果,还能降低GPU的负担。

所有的场景都是由6层场景layers加上3d角色的layer,一共7层构成的,每一层都会渲染成一张独立的RT

蓝色的部分是early-z的结果,目的大概是在生成不同layer的RenderTexture的时候可以直接cull掉重叠的像素

除了角色层以外,所有的layers都可以单独控制分辨率,从而形成DoF的效果,并提高了渲染效率

由于玩家在进行操作精度高且快节奏的游戏时,视角基本只会集中在角色身上,因此游戏就能通过视觉焦点的位置去切不同频率(Frequency)的贴图资源。大体操纵方法是:视觉焦点的周遭选高频率的贴图,其他地方就能替换成低频率压缩(Low Frequency Compressions)的贴图从从而减少显存的负担。

距离角色近,也就是视觉焦点的附近选择高频率的贴图,反之选择低频率压缩后的贴图

他们还进一步在每个场景设置了上百个摄像机的位置节点,来预计算并储存每个场景物件对该镜头位置的贡献度,这样在游戏中就能动态隐藏对镜头贡献不足的物体了。

对该镜头节点贡献度不足阈值的物体会被动态隐藏

接下来我们聊聊对Ori画面质量提升最大的自定义光照,其中分为了静态光照及动态光照,先从相对简单的静态光照开始。

静态光照是手动画上去的,美术可以直接在Unity中将光照画在一个低频率独立的GI Layer上面,并且可以依据情况在游戏中切换成低分辨率的版本。

美术可以直接在引擎内绘制静态光照信息

而动态光照就比较Charming了,大体使用了两个方法。首先美术会绘制角色6个不同面的受光信息(前后上下左右),并把其烘焙到rgb里(应该会是个atlas),根据光的位置与距离去进行插值,这也不算什么新技术了,不过最终呈现的效果还是很赞的。

美术绘制了不同方向的光照信息
根据光源的位置去进行插值

而光照的着色则是借鉴于Doom 2016中的Particle Lighting的技巧,Moons studio称之为Tile light calling,大体是将不同深度及优先级的光照信息写入一张Tile Atlas,再生成对应的Tile indices来索引和混合光照的颜色。相比于Xbox通过Compute Buffer计算并存储Indices的方案,Switch则采用了一张低分辨率的2D贴图来记录indices,结果上来说对画质并没有造成多大的损伤。

光照信息的画面,可以隐约看到不同通道的光照范围是如何混合的

可能是团队借鉴的技术,截取自Doom 2016的分享。id software发现由于画面中各别的粒子效果对画面的贡献程度是不同的,想到了根据距离及重要度等信息将个别生成的光照信息输出成Atlas,并在绘制完粒子特效后重新叠加光照效果的方法,从而实现了QQ号码交易高效优质的渲染效果,并且其渲染质量与屏幕分辨率无关

有趣的是,所有的layers都是做的前向渲染,只有3d的角色layer采用的是延迟渲染。按照原视频的说法,没有统一使用延迟渲染的主要原因是延迟渲染会丢失真实的深度信息,在逐Fragment计算Tile light calling时可能造成潜在的artifact。虽然没有详细说明,不过由于延迟渲染中,位置信息会存储在Fragment阶段后所产生的MRT中的32位Float位置贴图里,是有信息丢失的可能。

只有3D角色是延迟光照

游戏中的Soft Physics是直接在Unity中绘制的,省去了从其他DCC软件频繁导出的烦恼,并且整个过程是Undestructive的

在Unity中直接制作Soft Physics

God rays则采用了对多个帧做Stochastic Sampling + Blur,Stochastic Sampling是一种结合Poisson Disc(均匀采样) + 抖动的随机采样方法,从最终的画面效果来说也是可圈可点的。

优秀的2D God Rays将画面的氛围档次进一步提高了

Ori的发光拖影其实就是一堆从顶点拖拽出的发光片,这里借鉴了Keijiro大神的vertex based skinner方案,具体可以看https://github.com/keijiro/Skinner

拖影是一堆从顶点拖拽出的发光片
借鉴了Keijiro大神的Skinner

无处不在的拖影效果

Profiling 就更好玩了,他们首先定制了完整的In-Game Profiler工具,并且可以记录足够长时间的侦测结果,以客观地量化当前的优化进度。

可自由拖动的In-Game Profiler
记录多日的Profiling,从图中可见游戏效率随着日子推移逐渐趋近于稳定

接下来,他们还制作了可以记录每个场景当玩家处于不同位置的渲染时间,并分别记录了各别场景的渲染峰值。由于Switch上的目标帧数是60fps,所以当渲染峰值高于15ms的时候,就会在场景上标记出来,这对开发人员侦测渲染效率的帮助是不言而喻的。

可以将每个场景及路径渲染峰值记录下来的Profiler

绿色表示的是玩家经过的路径,除了记录了QA Test的信息外,他们还搞了个快速跑关的测试工具来重复并快速地检测问题点。

飞起来吧Ori!给我查找问题去!

为了方便对比XBox和PC平台的画面效果,他们顺手拍下了各别平台针对该峰值区域的截图,并根据日期排序,以方便横向对比优化前后及不同版本之间各平台的显示差异。

选择显示平台及日期的操作界面
切换不同平台对比显示效果

最后的最后,来聊聊Ori的场景无缝衔接解决方案吧。首先游戏会缓存相邻场景间相关信息,以便于在游戏中实时计算玩家与相邻场景的距离,并预测玩家即将到达和远离的场景来动态读取或释放游戏场景。

计算玩家位置并预测需要预读取或撤销的场景

由于Ori是个快节奏高难度的动作游戏,为了保证死亡能够快速重启,Ori的每个Checkpoint也会预缓存周遭区域的资源,并在达到下个Checkpoint以前始终保存在内存里,也就造成了能够记录关卡信息的内存就更少了,所以游戏开始时候就需要做一些预缓存来小心处理资源读取可能存在的问题,不过这也就造成了开始游戏的读取时间会特别的长。结果上来说的确保证了游戏的顺畅性及场景无缝衔接的体验,所以这种妥协肯定是值得的。

团队正在通过放大摄影机的可视范围及可视化Safe Zone来观察资源的加载情况

经常觉得周遭的开发者朋友们都在用苦瘪的方式来开发游戏,近期一直在寻找着能愉快地开发游戏并方便自动化地检测问题的workflow,Moons Studios的远程合作方案的确给我带来了很多的启发,真心希望哪天我也能在家里使用如此畅快淋漓的workflow来远程开发我热爱的游戏呐!

《奥日与精灵意志》是如何完成近乎不可能的Switch移植任务的?相关推荐

  1. 【奥日与萤火意志】华丽与优雅的精灵之舞

    在遥远的尼泊尔山中,一个新生命在其森林中诞生,纳鲁,古门和奥日接纳了她,并为她取名为"库",而她在长大的路上渴望飞翔,可惜"库"的翅膀没有羽翼,而朋友们便为她找 ...

  2. html5养树游戏源码,奥日小屋:寻找精灵之树

    大家好我是Receiver,又到了一年一度的夏促时间啦,不知道如何剁手的盒友可以考虑入坑<奥日与黑暗森林>哟,作为一款15年的游戏放在现在来看仍然有惊艳的画风,音乐与游戏性,夏促期间五折史 ...

  3. 赛尔号7月17日服务器维护,赛尔号7月17日更新精灵大爆料

    赛尔号2015年7月17日更新精灵大爆料!游戏中更新了近期会出现的精灵内容,让我们来一起看下在后续会出现哪些新精灵吧!!部分精灵会在下周7月17日与大家见面哦!下面就来看下赛尔号7月17日更新精灵爆料 ...

  4. 通达OA-今日学习 精灵报错提示初始化失败

    群里有人碰到这样的问题,就是打开精灵就出现报错:应用程序正常初始化失败.出现了无法正常应用的情况. 群友回复方法为,安装以下两个文件:

  5. unity 关闭自己脚本_太可了!这些领域可以把Unity玩的那么好,带你开启新世界...

    projects 作品 本期编辑:刺子 审核:OF君 Unity3D凭借 操作简单.易学. 灵活等优势,风靡全球. 从官网最新公布的数据来看, 其已占世界范围内45%的市场份额, 占据全球首位. 如今 ...

  6. 画质与性能双重加持,Unity超越游戏的“炫技”

    从细致入微的纹理.虚实难辨的光影质感,再到两个完全由视觉特效创造的角色波士顿(Boston)和摩根(Morgan)身上,无不让人感受到亦真亦幻的奇幻视觉冲击.如果不看出品方,这部高画质的视频可能会让B ...

  7. 【MySQL全文检索教程2】中文语义分词检索,配置ngram解析器ngram_token_size,innodb_ft_min_token_size,innodb_ft_min_token_size

    MySQL全文索引:中文语义分词检索(相似度匹配) 原文链接:https://blog.csdn.net/qq_39702981/article/details/125141024 通常情况下,全文检 ...

  8. 未来三大主机谁将占领游戏的主战场

    2018年已接近尾声,在2018年里游戏行业发生了不少变化,而无论游戏行业如何改变,三大主机平台依旧占领游戏的战场,那么在新的一年中,到底谁能占据主战场呢?下面跟着游戏音乐小编一起看看. 2019年就 ...

  9. ps手持_大胆地只手持

    ps手持 I picked up my turquoise Switch Lite back in April after scouring the internet for several days ...

最新文章

  1. gitignore完整使用方法
  2. No field mFactorySet in class问题解决(上)
  3. 第二篇 python基础知识总结:数据、运算符
  4. 如何注释python中html,Python在HTML中提取带注释的代码,python,html,被
  5. java的连接 初始化_java类从加载、连接到初始化过程详解
  6. 解决微信小程序Video 某些属性设置不起作用问题
  7. 桌面云之深信服VDC管理
  8. 图片右侧加文字html完整代码,怎么用css在图片右下方添加文字
  9. Network: unavailable
  10. 【jzoj 5336】Timi / 提米树(DP)
  11. Lizard 的第一篇博客
  12. 【微信技术-微信小程序】------- 渐进式骨架屏(加载流)(第二篇)
  13. 微信公众号支付从前端到后台(小白教程)
  14. 爬虫学习笔记,从基础到部署。
  15. 微信{errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}
  16. leaflet、cesium加载百度地图,加载自定义样式百度地图
  17. 习题3-1至习题3-5
  18. 部分赛车游戏对方向盘支持程度记录
  19. Android Studio开发之蓝牙通信
  20. 倍福---database访问mysql数据库

热门文章

  1. 最小路径覆盖详解 超级详细(附带例题 Stock Charts(给了题目))
  2. 风控实战:生物探针技术
  3. beetlsql官方文档
  4. 漫谈大数据时代的个人信息安全(二)——“逢脸造戏”
  5. “知识付费”三大法律问题如何处理
  6. 交换机与路由器技术-10-交换机密码恢复
  7. 猴子偷桃c语言编程软件,c语言经典算法——猴子偷桃问题
  8. string indices must be integers错误原因
  9. 神经网络入门一:实现一个单输入神经元(适合小白)
  10. 基于Python使用OpenCV进行车牌检测