图形引擎实战:端游引擎改造实践

编辑器交互性需求

在一款端游使用了长达十余年的引擎中,其拥有一套完善且稳定的架构。其中包括编辑器功能:各类资源管理模块、场景编辑区、资源编辑面板、消息窗口、开关列表等。编辑器作为美术同学的生产工具,其使用起来趁手与否十分重要。跟编辑器的交互性有关的项目需求也会比较多。

一类需求为功能性需求,例如地形刷搜索功能。在编辑器中,为各类资源维护了一个树形结构用于资源的管理和展示,在前端界面中的直观展示便是一个多级列表;由于进行了多个游戏版本的更迭,目前资源数量众多,因此各类资源能有一个字符串匹配的搜索功能很有必要。除此之外,资源搜索功能还需要根据资源组的特性来进行特化。如粒子与特效资源列表中,资源的种类很多且列表为动态——资源的修改和重排频率较高,因此根据需要增加了过滤器和分层次的搜索;而地面刷资源种类单一且为静态,因此只需要在特定的层级中进行搜索即可。

另一类需求为非功能性需求,例如效率的提升、操作方式优化等。在编辑器的前端框架中,各个资源的编辑面板并不像Unity一样集成在一起,而是以弹窗的形式进行处理。而角色的编辑面板由于涉及到众多技能资源,因此在每次打开时需要对这些skills进行加载,导致打开异常缓慢;因此对actor面板进行预加载和单例化处理,这样就可以只加载一次实例,多次关闭打开的速度就能显著提升。

渲染相关

  • dx9 frame debug工具

在引擎开发中,一个趁手的帧调试工具是十分重要的,它能帮助开发人员更快的找出渲染中的bug,定位相关文件。

但由于DirectX9.0较为古老,从发布至今已经十余年。导致目前市面上大多工具都不支持dx9的调试,例如引擎开发人员/TA常用的RenderDoc、PIX和Nsight Graphics等工具,对dx11以上、vulkan都有很好的支持,但对dx9来说就无能为力了。

由英伟达开发的Nsight Graphics工具的vs内置版本,即Nsight Visual Studio Edition的v5.4版本能够很好的支持dx9的调试。这个调试工具可以在英伟达官网免费下载。

在安装完毕后,重新启动vs(vs版本至少要在2010以上),就能在菜单栏发现Nsight选项

但此时还不能立即使用,在能够正确调试之前还需要进行一些前置工作

第一步:配置安全连接

安装工具时会同步安装一个Nsight Monitor,NVIDIA Nsight工作在主机上,而Monitor工作在目标机器上,为了能够让两者互相通信,需要设置匹配的安全连接:

1.在主机上打开vs工具栏中的Nsight,在下拉菜单中选择Options,选择General通用项,在“Security”的启用安全连接旁选择“True”,然后确定

在目标计算机上,首先启动Nsight监视器Nsight Monitor。然后在任务栏中找到,右键选择Options,同样的将启用安全连接设置为“True”保存即可。

在可信计算机选项旁,可设置始终允许连接到监视器的计算机主机名称,可以输入dns查找名称或ip地址。如果监视器和NVIDIA Nsight在同一台机器上,就不需要再进行额外设置了。

第二部:样例路径

设置样例路径,默认为

C:\Program Files (x86)\NVIDIA Corporation\Nsight Visual Studio Edition 5.4\Host\Samples

在此之后,就可以进行调试了。

接着,右键要启动调试的应用,然后选择Launch with Nsight HUD 5.4,就可以连接成功,在游戏上显示一层hud,其中包括了一些简要的渲染信息。按下Ctrl+Z可以弹出操作菜单,就能够截取当前帧,然后显示渲染的Event序列,但要注意的是Event≠DC。接着可以保存当前帧,在NVIDIA Nsight/Captures中查看捕获:

找到对应的vs版本,打开项目并编译后,就能在Nsight菜单中开始调试。

开启调试后就能够显示更加详细的渲染信息:

Disassembly可查看Shader代码,Samplers查看Texture信息(默认不显示alpha,可以双击后在Resouces界面开启Alpha通道显示),下面的Constants可根据slot对应shader汇编码猜测一些具体参数。

除了截帧调试外,Nsight还可以进行断点CUDA调试。此状态下可以查看线程块和线程信息,以及CUDA信息。

  • 粒子溶解效果

在unity中,借助shaderlab来实现一种新的效果是相对比较容易的,因为unity已经帮我们将底层进行了封装,一些渲染命令以及渲染前的操作都不必再进行。但在该端游引擎中,由于引擎的特化性质,并没有封装一个公共层用于后续开发。这就意味前面的那些操作都需要亲历亲为。

1.数据类型定义

首先需要将要增添的渲染对象定义出来,其属于粒子系统,因此仍归于ParticleSystemManager管理。继承相关接口和定义后,只需要为其材质类别中增添一种新的溶解材质即可。

2.材质支持

根据引擎自身的材质系统,创建一种新的材质时需要编写相应的.material文件。对于模板材质来说,接着需要继承hlsl,重载其中的参数以及指定ps/vs函数。这就需要首先编写好shader,然后由下至上逐层写出对应粒子文件所需要的材质。

3.文件系统支持

一种新的粒子就需要一个新的文件来对其进行数据存储。除了粒子基本的数据:名称、类型、发射器、生命周期、发射频率、数量、缩放等之外,还需要定义溶解相关数据。之后,在引擎的资源管理系统中添加支持,在导入此资源文件时对新的标签进行处理,对其中的数据进行解释,以便在前端中进行显示和修改、在文件系统中进行保存。

4.管线支持

想要为引擎增加一种新的效果时,除了在引擎中添加类型识别以及定义材质和着色器外,还需要在管线中添加支持。对于溶解效果来说,需要一系列timer数据来添加基于时间的控制效果,定义相关数据结构后根据time thread以及粒子的生命周期计算出想要的数据对象,然后在initParticle对象阶段加载dissolve材质进行特殊处理,将数据传入材质中进行shader的参数重载。

完成以上步骤,就可以实现基本的粒子溶解效果了。之后想要实现更高级的溶解控制,如定向溶解、循环溶解、多层溶解时,只需要添加相应的shader算法、对应的数据接口,然后再前端结构中添加对应的组件以便加以控制即可。

对于任一复杂系统来说,添加一项功能的复杂性往往不在功能本身,而是在这项功能的加入与原有系统的契合度,以及对原系统稳定性的影响。例如在这次功能的开发中,功能实现后出现了许多来自于其他关联系统的崩溃现象,有些来自于遗留问题,有些来自于不可预知的耦合,还有些则来自于代码规范性;最终导致对于问题的排查修复过程所花费的时间成本高于功能开发。但是解决这些问题带来的对系统整体的认知以及能力的增长是十分有意义的。

实用工具

该引擎除引擎系统本身外还包含了一些外部工具包。最近的一项更新中,包括了对于mesh、材质合并工具的修改。

这个工具运行时,可以导入指定文件夹中的material和mesh文件。将不同的材质放入一个容器中,在新导入材质时与容器中的内容进行比对查重,以保证筛选掉重复的材质定义;接着可以检查mesh文件中的submesh,对相同材质的submesh进行合并处理。

这个工具在以往的版本中会调用引擎底层系统中的函数以对材质进行序列化检查。这个过程会将载入好的material数据对象重新序列化为字符串,因此检查过程中只需要进行字符串比对即可。

但随着需求的增加,当前引擎版本增添了许多以往没有的材质效果。导致对于新材质,在序列化过程中会忽略其中的参数。

为了不影响原有系统的稳定性,在更新中加入了一个新的序列化算法,跳过了将material文件转为数据对象再序列化的过程;而是直接将material文件中的数据根据标签进行提取,然后直接检测。这样相较之前就可以更全面得进行数据比对,从而区分出参数不同的材质。

欢迎加入我们!

感兴趣的同学可以投递简历至:CYouEngine@cyou-inc.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搜狐畅游引擎部

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值