Unite2019

今年的Unite大会在上海, 跟17年一样在上海国际会议中心举行。时间也一样是五月的10、11、12,又一次跟母亲节重合,出差没法陪家人过节,实在惭愧。今年还是4个会场,内容满满,不停赶场实在是累,不过收获也很多,很值得。项目组今年从过完年开始一直在加班,五月抽空3天去参加会议后回来也一直加班,到现在才有空整理这次大会的内容,在此简单梳理记录一下。

《Unity 科幻巨作《异教徒》影视级技术大起底》

每年的第一场都是类似炫技的主题,今年第一场也一样。主题是Unity最新的实时渲染短片《异教徒》的技术讲解。通过这个CG短片可以感受到Unity最新的HDRP已经做得功能很强大了。皮肤、毛发、眼睛,角色专属灯光等都有非常多的细节可供调整。例如皮肤的斑点,胡渣的细节,瞳孔的底图,反射光等等。除此之外在短片中有一个类似时空穿越的效果是通过环境光切片过度来达到的,也非常炫酷,并且给我们提供了一个做效果的思路。而最新的后处理系统加入了模拟真实相机的参数,例如iso,快门时间,曝光度等等,可以让我们从另外一个维度来调我们希望的效果。

《用刚体控制角色移动的实践》

这一场分享主要讲解的是结合Unity物理引擎控制角色移动的一种思路。首先分析了目前比较常用的三种方式:1. NavMeshAgent;2. Character Controller;3. 动画位移驱动的利与弊。还提到了一个细节,在运用动画控制位移的方法中,如果update与fixupdate同时操作对象的position,而多个fixupdate穿插在两个update中时,直接操作Transform的position会不正确,应该使用RigidBody的position。最后提出了一些利用物理引擎来驱动角色移动的思路,例如利用RigidBody.velocity判断是否浮空,跳跃上升时关闭useGravity,大型角色肢体做成isKinematic从而影响小角色不不被影响,通过设置不同角度的斜面的摩擦系数从而达到不同地形是否可攀登等。不过这一套控制移动方式还是依赖物理引擎来驱动的。我们项目组目前的移动逻辑是建立在Unity的物理引擎上,但只使用了物理引擎的检测判断而不依赖其来驱动物体的,所有的移动逻辑自己实现的,并且以面向数据的形式进行了封装。之所以这样做是因为我们游戏采用帧同步模式来做实时战斗模块,Unity的物理引擎模块底层已经根据DOTS进行了重构,如果依赖引擎来驱动的话是无法保证多个客户端的一致性的。再有就是一些特殊移动规则例如漂浮,正弦曲线移动,类抛物线移动等还是要自己实现或者利用动画驱动。与其自己的代码与引擎代码混杂驱动还不如全部自己实现掌握。

《新一代后期处理栈:Post Processing v3》

与第一场类似的,还是以《异教徒》短片为例子,讲解了最新的PPS v3的功能以及各个参数如何使用,能达到什么样的效果。除了前面说到的物理镜头参数等,还有散射,屏幕扭曲等效果也是很炫酷。网上相关资料很多,就不在此重复了。

Continue reading

UWA 2019

今年4月份参加了侑虎科技举办的UWA 2019大会。相对比Unite大会,UWA大会只有一个会场,不用跑来跑去,而且讲解的点都集中在优化上,更容易落实到细节,内容很实在,对于开发中的项目有很大的帮助。从过完年回来项目组一直赶版本,之前抽空去参加大会也没时间整理,趁着现在测试稳定阶段,稍微空闲一点,整理了UWA2019大会的内容,在这里简单记录一下。

Continue reading

服务器调度频率问题

最近在做帧同步的PVP时遇到一个问题。在当初设计的帧同步方案中,服务器是以恒定每秒30帧的速率向客户端广播当前的双方的操作信息的。客户端也是按照每秒30帧的速率来处理这些信息,从而推进游戏逻辑的。这个方案双方速率一致是很重要的,如果服务器快了,客户端就要快进,如果服务器慢了,客户端就要等待。服务器方面我们是通过设置一个定时器来驱动这一部分逻辑的,这个定时器的间隔就是1000 / 30 ms,取值33或者34在个人电脑(Win7)环境下,都是能正常1秒能执行30次的。但部署到服务器环境(WinServer2012)下,定时器间隔无论设置33ms还是34ms,最终1秒都只能触发21次左右,如果把值设得更小,例如30,就会变成1秒执行32次,但无论设什么值都无法准确的1秒执行30次。

一开始在外网虚拟的服务器下发现这个问题,以为是虚拟机导致的,后面换到自己的物理服务器上(WinServer2008) 还是有这个问题,就开始考虑是不是服务器底层调度有问题,但后来通过一些测试发现是系统的问题。

Continue reading

随机数生成算法 —— 线性同余法

最近在做帧同步的实时对战,要自己接管随机数的产生,所以看了一下随机数生成的相关算法。因为游戏会跑在不同平台(iOS/Android)及不同硬件上,所以使用的算法有以下的要求:1. 不能依赖系统;2. 不能依赖硬件;3. 计算中不能使用浮点数(不同平台不同硬件有可能结果不同)。再结合效率方面的考虑,最终选择采用了线性同余算法,并在基础上做了一定的加强。这篇博客主要记录关于这个线性同余算法产生随机数的一些思考。

首先要搞清楚随机数的定义,真正的随机数都不是计算出来的,这里我们说的随机数其实都是伪随机数,随机数伪随机数的定义,具体的论证等资料可以自行查阅。产生伪随机数的算法有很多种,线性同余算法基于整数的加、乘和求模,算法简单但是具有较强的规律性与周期性。怎么在这个基础上尽量降低规律性与周期性,使得在更广范围内覆盖更多可能就是我们的目标。

首先要了解的是线性同余函数公式,最终结果受乘数λ,加数C和模数M决定。M通常我们会使用一个较大的素数,而λ,C的选取在很大程度上会影响生成的随机数的质量。我们尝试使用不同的λ与C去生成一系列的随机数并观察他们。为了直观感受一些列的随机数是否足够随机,我们用这些数字作为X,Y填充一张1024 * 512的位图,观察图上的点的位置,可以得知这一系列随机数在1024 * 512范围内随机分布的情况。 Continue reading

Unite2018

去年的Unite大会在上海,同时有3个会场在进行分享,分别是国内技术专场、国外技术专场、同行分享专场。而今年的Unite大会在北京进行,今年技术专场同时有4个会场在进行,而且没有再按照分类划分。同样是两天的分享会,第一天主要是国外的技术人员分享,第二天主要是国内的技术人员和国内的开发团队分享。今年公司加上我有3个人参加,基本跟手游相关的都有涉及到,而我主要挑渲染与手游相关的分享参加,回来后大家也各自整理了相关的资料做了公司内部的分享。在此整理一下Unite2018我接触到的技术分享。

《从AAA游戏到实时渲染的动画电影》

以前的影视动画制作主要使用PathTracing技术来做渲染,画面比较真实,但耗时非常长,平均三十个小时渲染一帧。现在随着实时渲染技术的提升,越来越多的动画制作团队采用实时渲染技术来做影视动画。现阶段技术难点主要在于:材质、光源、灯光及抗锯齿。分享者是Unity全球技术艺术总监江毅冰,她分享了她自己在制作动画《WindUp》时采用的一些方案,讲解了如何处理上述4个难点,用实时渲染做出高质量的CG动画。

《Unity中的机器学习》

Unity2018自带了一套机器学习框架——MLAgent,它实际上是对GoogleTensorFlow的一个封装。运用MLAgent可以直接在Unity平台下开发机器学习相关的内容,包括训练,测试等等。MLAgent主要分为代理(Agent)、大脑(Brain)、学院(Academy)三部分。训练的方式有两种:Reinforcement Learning通过奖励学习,在不停的迭代中趋向“最优”;Imitation Learning通过模仿学习,与人实时交互,最终趋向于“拟人”。 Continue reading