dnf手游版游玩感悟

news2024/11/25 13:09:41

      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 100

        GrabPass
        {
            "_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手游,以后把这个功能美化优化一下。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C\C++内存管理(未完结)

文章目录 一.C\C内存分布二.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free三.C内存管理方式3.1.new/delete操作内置类型3.2.new和delete操作自定义类型 四.operator new与operator delete函数&#xff08;重要点进行讲解&#xff09;4.1. operator new与oper…

Spring Security 应用详解

一、 集成SpringBoot 1.1 Spring Boot 介绍 Spring Boot 是一套 Spring 的快速开发框架&#xff0c;基于 Spring 4.0 设计&#xff0c;使用 Spring Boot 开发可以避免一些繁琐的工程 搭建和配置&#xff0c;同时它集成了大量的常用框架&#xff0c;快速导入依赖包&#xff0…

【SpringCloud学习笔记】Docker(中篇)

Docker 1. 自定义镜像 前面我们都是使用docker pull拉取仓库中现成的镜像&#xff0c;但是如果我们想要将一个Java应用程序构建成镜像然后部署应该怎么做呢&#xff1f;这个时候我们就需要自定义镜像了 **镜像&#xff1a;**本质上就是一堆文件的集合&#xff0c;包含了应用程…

Nettyの前置理论篇

本篇主要介绍NIO中的三大组件&#xff1a;Channel、Buffer、Selector的理论知识 1、NIO基本概念 NIO&#xff08;non-blocking io 或 new io&#xff09;区别于传统IO&#xff0c;是一种面向缓冲区的非阻塞IO操作&#xff0c;在传统IO中&#xff0c;数据是以字节或字符为单位从…

DevExpress Installed

一、What’s Installed 统一安装程序将DevExpress控件和库注册到Visual Studio中&#xff0c;并安装DevExpress实用工具、演示应用程序和IDE插件。 Visual Studio工具箱中的DevExpress控件 Visual Studio中的DevExpress菜单 Demo Applications 演示应用程序 Launch the Demo…

【栈】895. 最大频率栈

本文涉及知识点 栈 LeetCode895. 最大频率栈 设计一个类似堆栈的数据结构&#xff0c;将元素推入堆栈&#xff0c;并从堆栈中弹出出现频率最高的元素。 实现 FreqStack 类: FreqStack() 构造一个空的堆栈。 void push(int val) 将一个整数 val 压入栈顶。 int pop() 删除并返…

每天壁纸不重样~下载必应每日图片

下载必应每日图片 必应不知道你用过没有你下载过必应的图片没有你又没搜索过桌面图片你是不是安装过桌面图片软件你是不是为找一个好看的图片下载过很多桌面软件 必应每日图片 必应每天都会有一张不同的风景图片&#xff0c;画质清晰&#xff0c;而且不收费可以下载使用 但…

解决Win10系统ping不通、无法远程的问题

1、概述 某天要使用微软的远程桌面程序mstsc.exe远程到旁边的一台测试电脑上,结果远程不了,ping都ping不通,于是详细研究了这个问题。在此大概地记录一下该问题排查的过程,以供参考。 2、ping不通 使用mstsc.exe远程到测试电脑,远程不了,没有反应。于是手动ping一…

IDEA创建Mybatis项目

IDEA创建Mybatis项目 第一步&#xff1a;创建库表 -- 创建数据库 create database mybatis_db;-- 使用数据库 use mybatis_db;-- 创建user表 CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL,email VARC…

【WP|9】深入解析WordPress [add_shortcode]函数

add_shortcode 是 WordPress 中一个非常强大的函数&#xff0c;用于创建自定义的短代码&#xff08;shortcodes&#xff09;。短代码是一种简洁的方式&#xff0c;允许用户在内容中插入动态的、可重用的功能。通过 add_shortcode&#xff0c;开发者可以定义自己的短代码&#x…

里卡提方程(Riccati Equation)例子

里卡提方程(Riccati Equation) 里卡提方程(Riccati Equation)在人形机器人控制中有重要的应用,特别是在最优控制和估计问题中。里卡提方程主要用于求解线性二次型调节器(LQR, Linear Quadratic Regulator)和卡尔曼滤波器(Kalman Filter)。这些方法有助于提高机器人控…

物联网开发tcp协议之——netty拆包问题

1.前言 tcp协议是物联网开发中比较常见的一种通信协议&#xff0c;而netty则是一tcp通信协议中一个比较优秀的框架。tcp协议是一种长连接的协议&#xff0c;是流式传输的&#xff0c;开发过程中最长遇见的问题就是拆包粘包问题。我目前对接过的物联网系列有智能家居设备&#…

8.2 Go 导入与导出

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【清华大学】《自然语言处理》(刘知远)课程笔记 ——NLP Basics

自然语言处理基础&#xff08;Natural Language Processing Basics, NLP Basics&#xff09; 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言…

雷电模拟器中控实现,直通源码

目录 前言 开发 需求 初始环境 UI搭建 功能实现 前言 本篇为易语言雷电模拟器中控项目实现操作&#xff0c;一般用于&#xff1a;脚本开发多线程模拟操作等起始模板框架&#xff0c;使用易语言原因为其前后端一体化&#xff0c;对于脚本开发而言更为方便。 开发 需求 以…

Python爬虫入门与登录验证自动化思路

1、pytyon爬虫 1.1、爬虫简介 Python爬虫是使用Python编写的程序&#xff0c;可以自动访问网页并提取其中的信息。爬虫可以模拟浏览器的行为&#xff0c;自动点击链接、填写表单、进行登录等操作&#xff0c;从而获取网页中的数据。 使用Python编写爬虫的好处是&#xff0c;…

[数据集][目标检测]足球场足球运动员身份识别足球裁判员数据集VOC+YOLO格式312张4类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;312 标注数量(xml文件个数)&#xff1a;312 标注数量(txt文件个数)&#xff1a;312 标注类别…

LeetCode | 1624.两个相同字符之间的最长子字符串

这道题拿到手想法就是去双重遍历暴力解&#xff0c;对于每个字符&#xff0c;从后往前遍历字符串&#xff0c;找到从后往前一直到本次遍历的这个字符串这段子串中和这个字符串相同的字符位置&#xff0c;然后得到子字符串的长度&#xff0c;和ans存储的值做一个比较&#xff0c…

umap降维,c++用法纪实

全是血泪&#xff0c;可惜对于大量数据&#xff0c;速度还是太慢。 一、代码 // ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream>#include "knncolle/knncolle.hpp" #include "Umap.…

MSPM0l1306——配置滴答定时器

我们配置好了滴答定时器之后&#xff0c;还要手动编写滴答定时器的中断服务函数&#xff0c;因为我们开启的滴答定时器的中断&#xff0c;当滴答定时器的计数值从我们设置的值减到0时&#xff0c;就会触发一次中断&#xff0c;触发中断就会执行中断服务函数。各个中断的中断服务…