当前位置: 首页 > news >正文

dnf手游版游玩感悟

      dnf手游于5月21号正式上线,作为一个dnf端游老玩家,并且偶尔上线ppk,自然下载了手游版,且玩了几天。
      不得不说dnf手游的优化做到了极好的程度。
      就玩法系统这块,因为dnf属于城镇+地下城模式,相比现在的开放世界或者半开放世界3d手游,属于比较好优化的一类。
      比如城镇模块的切换进出口,做好加载卸载就能用时间换空间,通过加载进度页面掩盖卸载当前城镇加载下个城镇的目的。城镇中的各个区域的切换就不必考虑加载卸载了,一股脑都在场景里,通过坐标的移动和渐变黑屏的切换手法完成。
      再比如地下成的进入,同样使用加载卸载和进度页面,做到和城镇的互相切换。至于地下城不同房间,也是黑屏渐变切换+坐标移动即可。
      UI界面这块,dnf手游用到了动静分离和分帧加载。因为UI的绘制调用是以Canvas为单位的。所以当UI策划和UI设计师完成UI模块的设计后,UI程序根据实际的UI界面业务功能,将一个UI模块划分为永远不动的静态元素(如各个背景)+一直在动的活动元素(如动态生成的物品),配合UI对象池的使用。特别注意,此时的UI对象池设计上要考虑分帧生成的概念,比如要生成100个装备图标,不要在一帧内生成,此时如果一帧生成一个(或可配置个数)再缓存使用,则大大降低了单帧负载压力,可以让UI界面的响应速度加快。当然已经生成生成好的复杂UI界面,在退出时也可根据UI管理器的调度策略,并不销毁,而是移动坐标到视口外,再次使用则可快速加载。
      当然分帧加载的方案在需要高响应速度的地方都可以使用。
      地下城战斗系统这块,则是我的知识盲区了,虽然我做过卡牌战斗系统,但是和dnf这种手感的格斗游戏比起来,简直小巫见大巫,我一直觉得就手感这一块,没有超越dnf的格斗游戏。
      同时dnf手游有一点让我灵光一闪,很小的一个地方,就是子UI界面弹出,背景虚化这一块,如下:
在这里插入图片描述
      我已经好长时间没怎么做UI界面了,在我印象中,做子UI界面弹出的时候,为了怕和背景UI界面产生视觉上的融合,都会给一个黑色半透明背景,如下:
在这里插入图片描述

      感觉dnf手游这种高斯模糊挺好,虽然以前都用于3D和UI视觉分离这一块,但是移植到UI与UI之间也挺不错,这里顺便实现一下:

Shader "UIWindowPKG/UIBlurUnlitShader"
{Properties{_GaussSize("Guass Size",Range(0,10)) = 1}SubShader{Tags { "RenderType"="Opaque" }LOD 100GrabPass{"_GrabTexture"}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv[9] : TEXCOORD0;float4 vertex : SV_POSITION;};int _GaussSize;sampler2D _GrabTexture;float4 _GrabTexture_TexelSize;static float gaussMatrix[9] = {0.05854983,0.09653235,0.05854983,0.09653235,0.1591549,0.09653235,0.05854983,0.09653235,0.05854983};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);float4 gpos = ComputeGrabScreenPos(o.vertex);float2 guv = float2(gpos.x/gpos.w,gpos.y/gpos.w);int c = 1;for (int x = 0; x < 3; x++){for (int y = 0; y < 3; y++){o.uv[x * 3 + y] = guv + _GrabTexture_TexelSize.xy*float2((y - c)*_GaussSize, (c - x)*_GaussSize); }}return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = fixed4(0,0,0,0);for(int k=0;k<9;k++){col += tex2D(_GrabTexture, i.uv[k])*gaussMatrix[k];}return col;}ENDCG}}
}

      原理就是GrabPass+一次高斯滤波,效果如下:

在这里插入图片描述
      我对比了一下dnf手游和一些3A游戏的做法,感觉dnf手游的实现属于效率低下且效果不好,dnf手游用了实时的_GrabPass采样,而不是像3A游戏一样用一次性的截图采样,好处是实时显示背景画面。同时dnf手游的滤波只用了一次,可能是为了性能考虑,虽然平衡了实时采样的损耗,但是效果却比较差。而3A游戏用了多次迭代滤波,对比效果则更加强烈,当然画面是“静止”的。
      继续打dnf手游,以后把这个功能美化优化一下。

相关文章:

  • Linux编程--网络层和
  • 分享几个好用的网站、软件
  • 【Elasticsearch7.11】增加身份认证
  • centos安装vscode的教程
  • C\C++内存管理(未完结)
  • [数据集][目标检测]数据集VOC格式岸边垂钓钓鱼fishing目标检测数据集-4330张
  • HubSpot集客营销的未来趋势:人工智能、数据驱动与个性化
  • java异常习题
  • 迎七一党史知识竞赛答题怎么做
  • 5月31日,每日信息差
  • 04.docker的主要组成部分
  • 程序员应该有什么职业素养?
  • “云原生安全:构建弹性且安全的云上环境的关键要素“
  • 设计模式深度解析:分布式与中心化
  • 让抖店商家内卷的“改价系统”是什么?商家如何防止内卷!
  • (三)从jvm层面了解线程的启动和停止
  • Bytom交易说明(账户管理模式)
  • css的样式优先级
  • Java精华积累:初学者都应该搞懂的问题
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Material Design
  • SegmentFault 2015 Top Rank
  • Swift 中的尾递归和蹦床
  • vagrant 添加本地 box 安装 laravel homestead
  • vue-cli3搭建项目
  • 区块链共识机制优缺点对比都是什么
  • 用 Swift 编写面向协议的视图
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 函数计算新功能-----支持C#函数
  • ​VRRP 虚拟路由冗余协议(华为)
  • #Lua:Lua调用C++生成的DLL库
  • #考研#计算机文化知识1(局域网及网络互联)
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (2020)Java后端开发----(面试题和笔试题)
  • (2024)docker-compose实战 (9)部署多项目环境(LAMP+react+vue+redis+mysql+nginx)
  • (Charles)如何抓取手机http的报文
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (八)c52学习之旅-中断实验
  • (初研) Sentence-embedding fine-tune notebook
  • (二)Optional
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (自用)仿写程序
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ./configure,make,make install的作用
  • .Net MVC + EF搭建学生管理系统
  • .NET 的程序集加载上下文
  • .NET 使用 XPath 来读写 XML 文件
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET中的Exception处理(C#)
  • @RequestBody与@RequestParam:Spring MVC中的参数接收差异解析
  • @selector(..)警告提示
  • [2]十道算法题【Java实现】