关于夏天的一切

我总觉得对你的爱很美


  • Home

  • Archives

devtoolset

Posted on 2021-02-19 | In develop

安装环境

1
yum install epel-release centos-release-scl scl-utils scl-utils-build

查看完整列表(scl为源可更改)

1
yum --disablerepo="*" --enablerepo="scl" list available

搜索 安装

1
2
3
yum --disablerepo="*" --enablerepo="scl" search ****
yum --disablerepo="*" --enablerepo="scl" install ****
yum --disablerepo="*" --enablerepo="scl" update ****
Read more »

两倍明亮的光芒只能燃烧一半的生命长度

Posted on 2020-12-17 | In develop

I’ve seen things you people wouldn’t believe.

我所见过的事物,你们人类绝对无法置信。

Attack ships on fire off the shoulder of Orion.

我目睹战船在猎户星座的端沿起火燃烧

I’ve watched c-beams glitter in the dark near the Tannhauser Gate.

我见过C射线 在唐怀瑟之门附近的黑暗中闪烁

All those … moments will be lost in time, like tears…in rain.

所有这些时刻 终将流逝在时光中

一如眼泪

消失在雨中

Time to die………

Read more »

GLM常见使用接口

Posted on 2020-10-22 | In develop

GLM常用函数解释说明

GLM默认使用右手坐标系,如果要改成默认左手坐标系,使用:

1
GLM_FORCE_LEFT_HANDED

<glm/trigonometric.hpp>
GLM_FUNC_DECL GLM_CONSTEXPR vec< L, T, Q > radians (vec< L, T, Q > const &degrees)
将角度转化为弧度。

<glm/gtx/transform.hpp>
GLM_FUNC_DECL mat< 4, 4, T, Q > rotate (T angle, vec< 3, T, Q > const &v)
使用一个用弧度(radians)表示的角度(degrees),以及一个用3个标量(scalar)表示的坐标(axis),来构建一个4X4的旋转矩阵(rotate matrix)。

<glm/gtc/matrix_transform.hpp>
GLM_FUNC_DECL mat<4, 4, T, Q> lookAt (vec<3, T, Q> const &eye, vec<3, T, Q> const &center, vec<3, T, Q> const &up)
基于默认的偏手坐标系来构建一个给定视图矩阵(view matrix)的视角(look)

GLM_FUNC_DECL mat<4, 4, T, defaultp> perspective (T fovy, T aspect, T near, T far)
为一个对称透视图截锥(symmetric perspective-view frustum)创建矩阵,基于默认的偏手坐标系和默认的近剪裁面距离、远剪裁面距离

参数说明:

fovy 相机视角宽度
aspect 长宽比率
near 近面裁剪距离
far 远面裁剪距离
如果要修改默认的近/远剪裁面,使用:

GLM_FORCE_DEPTH_ZERO_TO_ONE

下载镜像文件并烧录到tf卡

win32diskimager
把下载的镜像通过这个工具烧录到tf卡中
这里唯一要注意的是如果有多个U盘设备 要正确选择好

启动树莓派

  1. 插入tf卡 把电脑的网线插入树莓派的网线口(装好openwrt的树莓派相当于一个路由器)
  2. 插电 等待与20-30秒
  3. 正常情况下电脑会被分配一个192.168.1.X的IP地址 此时树莓派的网络地址是192.168.1.1 如果没成功检查是否存在网络IP段的冲突问题或者本级的DHCP等网络问题
  4. 默认的ssh地址是root@192.168.1.1 端口是22 没有密码

让树莓派连接外网

树莓派有一个集成的wifi和一个网络端口 默认情况下wifi的配置是ap热点并且处于关闭(系统第一次启动不插网线应该是打开状态)
因此要想让树莓派能连外网并且可以连ssh 至少有一个网卡连我们的电脑 另外一个网卡连外网路由器
这里使用的方法是先通过网线连接树莓派 然后开启wireless并且设置为sta客户端模式连外网

修改/etc/config/network 添加Wwan

1
2
config interface 'Wwan'
option proto 'dhcp'

修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'

config globals 'globals'
option ula_prefix 'fdd5:579e:a386::/48'

config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'
config interface 'Wwan'
option proto 'dhcp'

修改/etc/config/wireless
默认为AP热点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
config wifi-device 'radio0'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path 'platform/soc/3f300000.mmcnr/mmc_host/mmc1/mmc1:0001/mmc1:0001:1'
option htmode 'HT20'
option disabled '0'

config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'OpenWrt'
option encryption 'none'

修改为STA连接我们的wifi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
config wifi-device 'radio0'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path 'platform/soc/3f300000.mmcnr/mmc_host/mmc1/mmc1:0001/mmc1:0001:1'
option htmode 'HT20'
option disabled '0'

config wifi-iface 'default_radio0'
option device 'radio0'
option network 'Wwan'
option mode 'sta'
option ssid 'SUMMER'
option encryption 'psk2'
option key '1234512345'

执行/etc/init.d/network restart重启网络服务

通过路由器的管理页面此时应当发现连接上了路由器
如果这一步存在问题 可以先设置disable ‘0’在不该AP mod类型的情况下看看作为ap热点模式是否能正常搜索到
ssh登录后尝试ping一下看看是否能正常连网

让树莓派作为软路由

和上面不同 这个是用网线连接外网 ap热点保留
先用网线连接树莓派 修改wireless的disable为0 重启网络服务

需要重启树莓派
network

1
2
3
4
5
6
7
8
9
10
11

config interface 'lan'
option ifname 'wlan0'
option proto 'static'
option ipaddr '192.168.1.1'
option netmask '255.255.255.0'
option ip6assign '60'

config interface 'wan'
option ifname 'eth0'
option proto 'dhcp'

wireless

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
config wifi-device 'radio0'
option type 'mac80211'
option channel '11'
option hwmode '11g'
option path 'platform/soc/3f300000.mmcnr/mmc_host/mmc1/mmc1:0001/mmc1:0001:1'
option htmode 'HT20'
option disabled '0'

config wifi-iface 'default_radio0'
option device 'radio0'
option network 'lan'
option mode 'ap'
option ssid 'SUMMER_RPI'
option encryption 'psk2'
option key 'aaaaaaaaaa'

更新opkg

1
opkg update

此时可以通过opkg list查看所有支持的包
手动安装可以opkg install 命令
这里推荐先安装luci web管理服务

安装luci包和fdisk包

1
2
pokg install luci  
opkg install luci-theme-bootstrap

进入后台页面http://192.168.1.1/
账号root 密码空
设置主题为bootstrap

1
opkg install fdisk

安装完毕此时应该改还剩余80M空间
可以通过df -h命令查看

挂载剩余tf卡空间

通过命令fdisk -l查看当前TF卡的挂载情况
对空闲硬盘进行分区

1
fdisk /dev/mmcblk0

安装kcp

1
opkg install kcptun-client

编辑/etc/config/kcptun 进行配置
删除多余参数,修改关键option, 注意启用

1
2
3
4
5
6
7
config client
option disabled 0
option bind_address '0.0.0.0'
option local_port 12948
option server '4.2.4.73'
option server_port 18224
option mode 'fast2'

安装ss

使用luci后台或者opkg安装:

1
opkg install shadowsocks-libev-ss-local shadowsocks-libev-ss-rules shadowsocks-libev-ss-redir shadowsocks-libev-ss-tunnel shadowsocks-libev-config iptables-mod-conntrack-extra luci-app-shadowsocks-libev

shadowsocks-libev-ss-local
shadowsocks-libev-ss-rules
shadowsocks-libev-ss-redir
shadowsocks-libev-ss-tunnel
shadowsocks-libev-config
iptables-mod-conntrack-extra
luci-app-shadowsocks-libev

  1. 在luci后台的Service下面的Shadowsocks下填写remote server信息为本地kcp监听端口
  2. 在local instances下启用ss local 端口1080 (点击disable按钮)

此时启动了一个1080的ss端口连接服务器 (socks5端口)

点击Save&Apply进行保存

然后在本地电脑上使用chrome+switchyOmega新建一个socks5代理连接youtube进行测试 .

透明代理转发

启用Local Instances ss_redir.hi 启用Redir Rules并更改Local-out default为forward

可能问题
检查IP转发
cat /proc/sys/net/ipv4/ip_forward
若为0
echo ‘net.ipv4.ip_forward = 1’ >> /etc/sysctl.conf
sysctl -p

可能问题 DNS污染
需要开启resole固定
以及转发
https://wangchujiang.com/linux-command/c/iptables.html
https://gist.github.com/wen-long/8644243

wifi 5G时区问题

可能导致找不到wifi信号或者连上去后很快断开

修改/etc/config/system

1
2
3
config system
option timezone 'CST-8'
option zonename 'Asia/Shanghai'

修改/etc/config/wireless

1
option country 'CN'

中国开放的5G频道为
36, 40, 44, 48, 52, 56, 60, 64, 149,153, 157, 161, 165

opkg安装iw iwinfo命令

通过iwinfo wlan0 *** 可以查看无线网卡的当前信息 以及支持的信号强度 模式等

例如通过iwinfo wlan0 htmodelist可以查看支持的htmode
例如通过iwinfo wlan0 freqlist可以查看支持的频段

通过iw list查看设备支持的工作模式
iw wlan0 info
iw phy0 info

iw reg get 获取频段和信道宽度

补充信息

https://openwrt.org/docs/guide-user/network/wifi/basic#htmodethe_wi-fi_channel_width

HT20 High Throughput 20MHz, 802.11n
HT40 High Throughput 40MHz, 802.11n
HT40- High Throughput 40MHz, 802.11n, control channel is bellow extension channel.
HT40+ High Throughput 40MHz, 802.11n, control channel is above extension channel.
VHT20 Very High Throughput 20MHz, Supported by 802.11ac
VHT40 Very High Throughput 40MHz, Supported by 802.11ac
VHT80 Very High Throughput 80MHz, Supported by 802.11ac
VHT160 Very High Throughput 160MHz, Supported by 802.11ac
NOHT disables 11n

可能得组合

1
2
3
4
config	wifi-device		'radio0'
option channel '104'
option hwmode '11a'
option htmode 'HT20'
1
2
3
4
config	wifi-device		'radio0'
option channel '7'
option hwmode '11ng'
option htmode 'HT40+'
1
2
3
4
config	wifi-device		'radio0'
option channel '36'
option hwmode '11na'
option htmode 'HT40+'

快照版本问题

如果安装的是快照版本 会有以下几个问题:

  1. 没有luci 需要手动安装
  2. 快照版本为自动构建且软件源对应自动构建的构建版号 导致一旦下个快照产生(通常几个小时?)就会导致软件源无法正常使用

快照版本的好处是可以刷完TF卡后直接启动而不需要任何引导步骤(通常至少需要一个USB键盘和HDMI+显示器)

树莓派使用

Posted on 2020-10-03 | In develop

树莓派官方地址和镜像下载

官方地址https://openwrt.org/
根据硬件下载
例如树莓派的分支可以再Brand分支中查找关键字Raspberry Pi

快速上手推荐直接安装镜像 即跳过系统安装部分直接启动就可以使用, 带来的问题是 一般我们使用的tf卡可能至少32G 但是烧录的镜像只能用到其中的几百M 需要利用工具进行额外的mount挂载.

这里有几个关键字 factory指的的是安装固件 sysupgrade是指的更新专用镜像文件 snapshots是快照镜像文件

Read more »

git和git-lfs编译与使用

Posted on 2020-09-30 | In develop

git和git-lfs编译使用

编译git

github

1
2
3
4
5
6
7
8
9
wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.25.2.tar.gz
tar -xvf git-2.25.2.tar.gz
cd git-2.25.2
make configure NO_OPENSSL=1
./configure --prefix=/usr/local/git all
make
make install
echo "export PATH=/usr/local/git/bin:$PATH" >> /etc/profile
source /etc/profile
Read more »

一种适合共享内存RESUME方案的通用内存分配器设计方法和实现

Posted on 2020-08-11 | In develop
  • 前言
  • 基本原理
  • 内存分配器的基本概念
    • 显示和隐式分配器
    • 设计要求和目标
      • 内部碎片和外部碎片问题
  • 基础分配策略
    • 基础存储方式
      • Sequential Fit 连续适配
      • Segregated List 分离列表
      • Indexed Fit
    • 路径匹配策略
      • Best fit
      • Worst fit
      • First fit
  • 设计方案
    • 设计需求:
    • 设计方式:
    • 代码规模和最终性能

前言

在之前的文章我比较全面的介绍了一个完整的resume机制的阐述, 也提到了一些开发成本和三方库移植的问题, 这篇文章主要介绍如何在共享内存上实现一套可动态扩容的通用内存分配器, 以及如何利用通用内存分配器进行三方库包括stl中容器类的快速resumable化.

通用动态内存分配器的实现可以很好的对共享内存RESUME机制进行一个补充, 例如可以简单的基于分配器实现stl的allocator, 从而直接得到resumable的vector, list, queue, map, multi_map, unorder_map等; 也可以简单的将一些本身就比较容易resumable化的三方库和算法替换其allocator来简单快速的完成移植工作而非重写他们. 例如常见的资源解析rapidxml 移动避免算法库rvo等 .

当然, 处理易用性和快速移植三方库这些优点外, 从项目角度考虑也有一些缺点需要关注并进行合理范围的使用.

相比静态内存机制下的resumable方案

  • 较难估算内存峰值用量

    • 有些场合下该难点是业务需求带来的, 比如说我们普通玩家可以设置可绑定的上限buff100个就够用, 但是对于一些GVE的大型BOSS团本来说, 100个就容易超限, 在扁平化的设计中, 如果我们用静态内存方案那么所有单位的内存使用量都是’上限’, 但是改成动态方案 则是根据真实情况动态波动的. 我们可以根据策划配置通过软上限来进行计算, 但是业务功能量级铺设上来后 则很难全面的评估这些地方对内存使用的真实情况.
    • 静态内存中在启服时可以一次性的计算好所有内存大小, 整个游戏无论负载情况其内存占用是始终稳定且直观的 .
  • 内存安全性不如静态内存

    • 静态内存基本上不存在野指针 越界等问题 也不存在内存不够用的情况
    • 例如说我实现了static_list;
      • 定义声明了OBJ和总大小 static_list<Buff, MAX_BUFF_SIZE> buffs;
      • 然后我引用了一个指针指向其中一个已有的元素进行当前被动动作标记, 在受击出现的时候Buff* act = &受击BUFF; 在受击结束时候在移除act; 这里虽然用到了指针 但是在使用的时候, static_list中所有的元素都在一个连续的静态内存区域内, 并且该指针可以通过偏移检测和bitmap计算是否是有效的obj指针, obj是不是有效的buff等, 并不会因为是指针出现越界访问问题.
  • 定位一些内存访问相关的问题可能会更麻烦一些

    • 例如: 所有战斗单位位于共享内存xxx–yyy地址内以大小X对齐, 每个单位内聚合有技能模块移动模块属性模块. 假如现在出现了一个读取属性错误的问题, 我们很容易根据有限的地址信息去推测出出问题的范围, 并且方便进行基于内存地址的修改情况进行监听断点等
  • 性能相比静态方案一般会有性能上的损失, 动态内存的分配和回收有一个适配的成本开销.

  • 长期运行可能有内存碎片问题

    • 这个问题反而比较乐观, 因为在静态内存池方案上 内存利用率往往是非常低的, 而动态内存分配器的碎片率一般根据情况大约都控制在25%以下, 像dlmalloc则在实践中能控制在95%左右.
    • 静态内存一般来说, 对象池与对象池之间是内存隔离的, 即相互之间的空闲内存不能共用
    • 无论是对象池还是容器, 其规模都是直接以’上限’在定义阶段确定的, 一般情景下都会有大量的富余容量浪费
Read more »

共享内存RESUME机制综述

Posted on 2020-08-03 | In develop
  • 前言
  • 共享内存RESUME出现的背景: 为什么选择共享内存RESUME而不是集群冗余+故障转移
    • MMOACT相比传统互联网的异同
    • 方案对比和决策
  • 可行性分析和验证
    • 隔离业务状态数据与非业务环境数据
    • 隔离业务状态和业务逻辑数据和逻辑分离
    • 最小化验证, FIRST GLOBAL STATE
  • 解决方案和实践
    • RESUME状态重建/恢复的基础问题
    • 基础问题以及解决策略
      • 附: 在随机化的ASLR中确立确定性的地址空间
    • 对象池和基础容器等通用性设计
      • 对象池定长内存池+对象分配回收接口的基础设计
      • 地址无关的容器实现
  • 小结
    • 需要注意的其他问题
    • 通用性上的挑战: 在共享内存上构建通用内存管理器

前言

共享内存RESUME机制是指的: 通过将游戏状态数据保存在共享内存中, 当游戏进程crash后通过重启游戏服务器并attach已有的共享内存来恢复游戏状态, 以此达到玩家游戏体验在出现宕机时的连贯性, 提升游戏的容灾能力.

共享内存RESUME出现的背景: 为什么选择共享内存RESUME而不是集群冗余+故障转移

MMOACT相比传统互联网的异同

在web领域中, 业务和数据分离, 从而达成’业务无状态化’, 开发人员专注于业务本身, 状态数据的一致性问题和容灾问题转移到可以较为独立解决的数据存储领域, 这个领域有非常多的论文和解决方案, 以及成熟的服务等.

而对于游戏领域来说, 互联网成熟的解决的方案很难在这个地方应用, 当然 对于外围系统来说, 我们仍然可以按照互联网成熟的解决方案进行布局, 例如聊天系统, 好友系统, 邮件系统, 日志系统, 或者一些游戏中的公会系统等.

Read more »

多人游戏中的同步机制综述

Posted on 2020-07-24 | In develop
  • 前言
  • 同步问题的产生和基本策略机制
  • 同步模型的一般性描述
  • 游戏中的状态一致性问题
  • 同步过程中的抖动和延迟问题
  • 优化网络延迟和抖动
    • 当前的网络环境
    • 工具
    • 链路层延迟的优化
    • TCP还是UDP
    • TCP下的延迟和抖动优化
    • UDP的优化
  • 时钟选择和时钟同步
    • 实现
  • 移动: 影子跟随算法和优化(内插)
  • 常见的延迟隐藏手段
  • 移动: 航位推测法(外推)
  • 插值和外推, 以及常用算法
    • 内插值常用算法
    • 外插值常用算法
  • 命中: 延迟补偿
    • 延迟补偿的局限
  • 逻辑预演和客户端提交命中
    • 满足进攻者的精彩时刻
  • 提高TickRate
  • 回退 快播 和解
  • 案例分析部分
  • 引用文献

前言

本文中所有内容默认都基于逻辑描述, 逻辑状态,逻辑处理的逻辑游戏世界, 纯本地表现类, 总是通过逻辑世界单向导出的渲染计算等, 均不在本篇文章讨论范畴.

同步问题的产生和基本策略机制

在多人游戏或者基于CS网络模型的游戏中, 玩家所在的游戏世界并非全由本地生成和修改, 必须不断从服务器或者其他玩家获得最新的信息来完成游戏世界的共享体验, 在多人实时交互的游戏中, 相当于每个人都维护一个’完整世界’的副本, 并保证每个人维护的副本之间一致性和实时性, 不同游戏对副本的规模复杂度以及对一致性和实时性的要求不同, 并随着网络环境的变化在不同的历史时期下演化出了多种同步方案.

在所有的同步方案中, 有两种最基础也最常见的同步机制, 即状态同步和帧同步, 其基本机制和区别为:

  • 状态同步: 通过同步游戏中的各种状态来保证游戏世界副本的一致性, 基本流程如下:
    • 服务器维护权威完整副本 客户端维护本地副本 (可以只维护部分副本)
    • 客户端上行请求到服务器 服务器进行完整的逻辑演算 并将发生改变的状态下行给客户端
    • 客户端基于本地副本进行预演和状态预刷新
    • 客户端用来自服务器的状态数据刷新本地副本, 对齐服务器副本
      • 客户端如果有因预演导致的数据不对齐需要通过强同步/回滚/和解等机制达成最终对齐
        • 快照类同步方式总是全量对齐
  • 帧同步: 泛指通过一致的初始状态, 一致的输入事件和一致的逻辑处理, 从而得到相同的计算结果来保证游戏世界副本的一致性的同步方案

    • 该术语为泛指, 所有通过确定性算法,以保证输入一致来得出相同游戏流程结果的同步均可泛称为帧同步.

    • 最早有对等网络的锁步同步, 发展为非对等网络的主机锁步同步, 再到后来的bucket同步以及现在比较流行的定时不等待乐观帧同步

    • 锁步同步:

      • 客户端定时(比如每五帧为一个关键帧)上传一轮输入信息
      • 服务器收到所有输入信息后广播给其他所有客户端
      • 客户端用服务器发来的更新消息中的输入信息进行游戏(如果是对称网络, 这个过程则是广播自己输入信息和搜集所有其他客户端的输入信息)
      • 如果客户端进行到下一个关键帧(5帧后)时没有收到服务器的更新消息则等待
      • 如果客户端进行到下一个关键帧时已经接收到了服务器的更新消息, 则将上面的数据用于游戏, 并采集当前鼠标键盘输入发送给服务器, 同时继续进行下去
      • 服务端采集到所有数据后再次发送下一个关键帧更新消息
    • 定时不等待:

      • 相对于锁步同步来说, 服务器会定时下发收集到的信息, 并根据收集到的信息调整关键帧的间隔, 没有在指定间隔内收到的消息会排在下一次关键帧或者丢弃
      • 相对于锁步同步来说, 任何客户端的卡顿不会阻塞其他玩家

这两种同步模型本质上并不冲突, 并且在细节上会相互补充优化, 常见的为在状态同步这种弱一致性框架下添加确定性演算来增加同步的准确性, 在确定性的帧同步下隔离出来部分状态进行优化增加流畅性, 从模型角度来说, 在复杂的同步需求中, 状态同步总是比帧同步有更多的扩展和调优空间, 典型的案例如UE4和UNITY中的DS服务器.

Read more »

数值模型 战斗属性和判定公式

Posted on 2020-07-21 | In develop

战斗属性

战斗属性属于战斗单位的简单数据字段, 提供基础的数据读写操作(相对于magic state而言).
在实践中 一般战斗属性还包含从配置文件中load数据, 一级战斗属性到二级战斗属性的封装, 以及按照功能,战斗单位层级的划分等.

战斗属性的设计和实现

字段表设计

字段表在设计上隶属于’接口层’这个概念, 简单直接, 易于访问和同步处理时目的.

在C++中 通常考虑用一块静态数组的内存来表示

A A A A A A A A A
字段名 HP MP ATK CRIT RESIST CRIT HIT RATE MISS RATE …
转换类型 INT INT INT INT INT FLOAT FLOAT …

这种字段表的设计有以下优点和特性:

  • 性能非常高
  • 可以直接操作,遍历内存 方便统一管理
  • 以数组下标完成ID的设计, 并使用BIT位进行脏数据标记辅助进行增量同步
  • 初始化约定为0, 进行初始同步时只同步非0数据即可, 后续采用增量同步, 减少同步量
  • 字段表中的数据修改可以由属性表进行托管结算 也可以直接set
    • 通常战斗属性均为属性表托管结算和刷新 不能直接set
    • 通常能量条类属性直接进行set
    • 复杂的属性一般由多个属性功能完成 例如
      • 血量上限 (战斗属性)
      • 当前血量 (属于能量条类, 则特殊条件下以’血量上限属性’为依据进行set 例如出生满血)
Read more »

技能系统中的标签机制

Posted on 2020-06-18 | In develop

技能系统中的标签机制

前言


对于一个大规模系统的建模 一定离不开常见的分类手段, 而分类要根据系统中的元素以及元素之间的关系来作为划分依据, 从而采用不同策略
技能系统中的配置以’技能’和’效果’作为完整的配置单位, 所有的技能和效果之间的关系则是多维的图的拓扑关系的, 例如:

眩晕BUFF: 禁止普通移动, 禁止常规技能释放,
定身BUFF: 禁止普通移动
金身BUFF: 禁止普通移动, 禁止所有技能释放, 不可被眩晕/禁止所有效果(受击, 伤害, debuff/buff等)
冰冻BUFF: 禁止普通移动, 禁止所有技能释放除了解控技能, 可能禁止受击
沉默BUFF: 禁止所有(部分)技能释放
无敌BUFF: 不接受任何伤害
霸体BUFF: 打断受击状态并免控
灯笼BUFF: 可困住霸体BUFF单位
解控技能: 接触被控状态但无法接触部分例如灯笼BUFF
净化技能: 移除DEBUFF
破盾技能: 移除带有指定盾效果的BUFF
致命一击: 突破所有防御包括部分无敌BUFF .
引导技能A: 可被强控技能打断
引导技能B: 可被移动取消
连招技能: 需要前置技能成功释放完成
千斤坠技能: 需要飞行状态可释放

几乎所有的技能和buff之间都需要定义好他们的交互关系, 包括依赖条件, 禁止状态, 打断逻辑, 替换规则, 触发节奏, 否则在不断的引入新的技能时, 很容易导致已有的系统出现局部甚至整体的错误流程和功能表现.

而作为一个灵动丰富的多样性的技能系统, 在具体的状态关系上往往不会是简单的禁止打断逻辑, 而是分梯度, 计数, 浮动值的不同而有不同的分支策略, 需要对这样的一个规模和结构复杂的系统进行井井有条的管理和维护, 则需要一套完善灵活的拆分理念和管理机制.

Read more »
<i class="fa fa-angle-left"></i>123…6<i class="fa fa-angle-right"></i>
夏天

夏天

56 posts
1 categories
© 2022 夏天
Powered by Hexo
Theme - NexT.Gemini