LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
楼主: vshrd

BEE进阶研究第五季--动态数据与静态数据的划分

[复制链接]
 楼主| 发表于 2024-8-13 15:45:25 | 显示全部楼层
本帖最后由 vshrd 于 2024-8-13 03:48 PM 编辑
行了行了 发表于 2024-8-13 03:21 PM
我有个疑问啊,写脚本时候存在大量的判断条件,这些条件基本都是动态吧,静态很少吧
比如CD、身上特定的BU ...

很好的问题,确实问到点子上了.
那么我来回答下,就拿buff/debuff来举例

1.当我们要知道某个单位身上是否有某个特定buff时,虽然对你来说只是单纯用魔风封装好的方法直接请求返回一个ture或false的布尔返回值
但其实我们是需要遍历单位身上所有的buff/debuff,直到最后一个.
才能真正确定单位是否真正持有这个buff/debuff

2.当我们有多个技能都需要进行buff/debuff判定时,
意味着我们单帧里就需要请求多次,每一次就是一个完整遍历.开销就翻了数倍,每次请求就是1倍

3.当我们有不止一个需要监控的目标时,
开销基于之前的基础,再次翻了数倍.几个目标就是几倍

4.当我们一个GCD内每一帧都进行了许多次遍历时,
其实对我们来说真正有实际意义的遍历,就只有真正需要释放技能前的那一次
不然开销又基于之前再次翻数倍,每多一帧就再翻一倍

综上,到这里就已经是在指数级的开销增长了.

那么我们能否实现 一个GCD内,只有真正要准备放技能时,才去遍历一边buff/debuff
并且,把这些数据保存起来.
这样不仅是A技能可以用,对于同样需要进行buff/debuff判断的B技能、C技能、D技能来说
这部分数据全是可以复用的呢?

这是不是意味着我在好几十帧里,对于相同目标来说,仅获取了一次完整的buff/debuff列表信息


回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-8-13 15:52:24 | 显示全部楼层
行了行了 发表于 2024-8-13 03:21 PM
我有个疑问啊,写脚本时候存在大量的判断条件,这些条件基本都是动态吧,静态很少吧
比如CD、身上特定的BU ...

然后是代码量的问题.
写不到100行不代表一辈子都写不到100行
只要你有心思去钻研,去扣细节.
去实现一些可能在萌新阶段想都不敢想的一些需求实现时.
代码行数就已经不重要了,
对你而言就只是一个数字而已.
等你一不小心回过头,或是偶然瞟了一眼代码行数时,
才会忽然感叹道,
原来不知不觉已经写了这么多代码了可能是几百行几千行甚至几万行. = =都不奇怪
回复 支持 1 反对 0

使用道具 举报

发表于 2024-8-13 15:52:51 | 显示全部楼层
本帖最后由 行了行了 于 2024-8-13 03:54 PM 编辑
vshrd 发表于 2024-8-13 03:45 PM
很好的问题,确实问到点子上了.
那么我来回答下,就拿buff/debuff来举例
那么我们能否实现 一个GCD内,只有真正要准备放技能时,才去遍历一边buff/debuff
并且,把这些数据保存起来.
这样不仅是A技能可以用,对于同样需要进行buff/debuff判断的B技能、C技能、D技能来说
这部分数据全是可以复用的呢?

大佬请问这些保存的数据,我怎么确认B/C/D技能施放时,它还是有效呢?是不是还是要花性能去维护这些保存数据的时效性?

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-13 15:55:46 | 显示全部楼层
行了行了 发表于 2024-8-13 03:52 PM
大佬请问这些保存的数据,我怎么确认B/C/D技能施放时,它还是有效呢?是不是还是要花性能去维护这些保 ...

怎么保证有效.
当你确定你的当前帧一定会释放一个技能出来,不管是哪一个技能时
那么你把动态数据的更新行为放在这之前,他不就是一定有效的吗
因为对你而言.在同一帧里,数据一定是不会变化的.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-13 16:01:01 | 显示全部楼层
行了行了 发表于 2024-8-13 03:52 PM
大佬请问这些保存的数据,我怎么确认B/C/D技能施放时,它还是有效呢?是不是还是要花性能去维护这些保 ...

至于花费性能去保存数据这个问题.
嗯虽然这部分如果我再继续往下衍生确实有点深了.

但还是简单讲讲吧.
数据的存储,占据的是内存空间.
而数据的计算,消耗的是CPU算力.
就目前的硬件市场而言,内存是在计算机资源体系里,最廉价的一种.

对于消费者用户来说如此,
对于开发者来说更甚.

一个char一个字节  一个shot2个字节  一个int或者float或者一个ptr占4个字节
你的这几个虾米数据保存进去根本不算什么.

但如果你把他放到了逐帧更新的动态数据里.
那cpu就会骂你娘
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-13 16:05:06 | 显示全部楼层
本帖最后由 vshrd 于 2024-8-13 04:28 PM 编辑
行了行了 发表于 2024-8-13 03:52 PM
大佬请问这些保存的数据,我怎么确认B/C/D技能施放时,它还是有效呢?是不是还是要花性能去维护这些保 ...

严格意义上来讲
这里的动态静态其实应该被称为
"堆数据"和"栈数据"
我在正文中这样的说法是错误的

但大家都不是来学计算机底层的
我强行这样写教程也会使教程变得更加晦涩,难以理解.

所以就简单把这些当成一个概念简单理解一下即可
回复 支持 反对

使用道具 举报

发表于 2024-8-13 16:05:08 | 显示全部楼层
vshrd 发表于 2024-8-13 03:55 PM
怎么保证有效.
当你确定你的当前帧一定会释放一个技能出来,不管是哪一个技能时
那么你把动态数据的更新 ...

大佬啊,我还是不太明白,通常我们是根据条件施放技能,怎么能做到我确定要施放技能时再去核实条件呢?
我举个具体例子,麻烦看看如何实现
比如火法输出中,当触发法术连击的BUFF时,炎爆术就变成瞬发,这时候就会丢炎爆术
通常我们的脚本是这样:
if A and B then C end --其他输出条件
if BeeUnitBuff("法术连击","player",0,1)>0 then BeeRun("炎爆术") return end --法术连击时施放
我可能会在每一帧去获取 BeeUnitBuff("法术连击","player",0,1)它的值,然后根据值来决定要不要放炎爆术
如果用您说的静态动态数据的概念,是怎么一个方法?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-13 16:07:08 | 显示全部楼层
行了行了 发表于 2024-8-13 04:05 PM
大佬啊,我还是不太明白,通常我们是根据条件施放技能,怎么能做到我确定要施放技能时再去核实条件呢?
...

这个你可能需要从第一篇教程开始看过来了
先有个面向对象的加持.
我们才能正确的存储"堆数据"
或者说是"需要临时保存一段时间的动态数据(相对静态数据)"

回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-13 16:08:28 | 显示全部楼层
行了行了 发表于 2024-8-13 04:05 PM
大佬啊,我还是不太明白,通常我们是根据条件施放技能,怎么能做到我确定要施放技能时再去核实条件呢?
...

或者说你继续耐心等待
等到教程出到最后一篇
也就是一个完整面向对象实例脚本时
你就会明白这期间每一篇教程
每一个知识点
都是具体在为代码中的那些东西服务了
回复 支持 反对

使用道具 举报

发表于 2024-8-13 16:19:50 | 显示全部楼层
vshrd 发表于 2024-8-13 04:08 PM
或者说你继续耐心等待
等到教程出到最后一篇
也就是一个完整面向对象实例脚本时

好的,感谢大佬,前面纯理论的我看起来很吃力
等待大佬的实例出来,再回过头结合理论来看
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

小黑屋|手机版|Archiver|LUACN论坛

GMT+8, 2026-5-31 04:13 AM , Processed in 0.176349 second(s), 29 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表