LUACN论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
热搜: YJWOW MagicStone BoL
123
返回列表 发新帖
楼主: vshrd

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

[复制链接]
发表于 2024-8-13 21:12:01 | 显示全部楼层
谢谢分享谢谢分享
回复 支持 反对

使用道具 举报

发表于 2024-8-14 09:06:22 | 显示全部楼层
行了行了 发表于 2024-8-13 03:24 PM
我咋感觉这句话有点像日本动漫或者轻小说里面的说辞呢

这可是02年 说不得大师 的 小说佣兵天下里面的台词 和日本动漫可是没关系
回复 支持 反对

使用道具 举报

发表于 2024-8-14 09:17:07 | 显示全部楼层
vshrd 发表于 2024-8-13 01:54 PM
操= =我忽然想起来了
我从小一直口癖喜欢说这句话
好像就是因为看了佣兵天下

佣兵一出 再无他书   佣兵看了5遍,每个年龄阶段看 感受都不一样。
回复 支持 反对

使用道具 举报

发表于 2024-8-14 09:17:43 | 显示全部楼层
那位同学我可是对号入座了,看样子我得先按照面向对象的特性将我之前的100多行代码给改改。
有机会就求医,请大佬回复下:
[Lua] 纯文本查看 复制代码
local a = 1   
if a then   
    TurnRightStop()
end
local function Turn(_,_,_,t)
    if t=="采集草药" then
        TurnRightStart()
    end
end
local TurnR = CreateFrame("Frame")  
TurnR:RegisterEvent("UNIT_SPELLCAST_FAILED")
TurnR:SetScript("OnEvent", Turn)

也就是监测UNIT_SPELLCAST_FAILED,监测到就转动下。问题在于跑一晚上WBE内存的占用从3M提升到了60M,似乎就出现了掉帧的情况。在论坛上查看了一些帖子,这情况应该是由于多次注册导致,是不是相当于注册了N个表出来,这个要怎么处理呢。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-14 09:53:05 | 显示全部楼层
xiaoyao1 发表于 2024-8-14 09:17 AM
那位同学我可是对号入座了,看样子我得先按照面向对象的特性将我之前的100多行代码给改改。
有机 ...

这个问题设计的就比较深了
并且即使知道底层的内存管理原则
但魔兽本身的代码并不可知
所以也不知道魔兽做没做相应的处理

加上我学编程也比较晚
用现代编程去看2000年左右立项开发的魔兽
思路是否完全适用也并不一定准确.

你的问题3M提高到60M不用怀疑,肯定是在某些地方开辟了内存没有释放导致的
但并不一定是事件系统
首先你用来接收frame的变量是临时变量
内存开辟在栈上面的
也就意味着每一帧结束时都会释放
从下一帧开始重新开辟

如果按照现代编程的内存管理机制来说
你的TurnR是取的创建Frame的一个引用
内存释放原则是引用计数.
也就是说TurnR在帧结束时出栈释放
而TurnR释放的同时导致Frame的引用计数为0
那么Frame就也会被纳入到待释放内存
而伴随TurnR所注册的一系列事件按说应该也会随着他的上级管理一起释放

这是正常的流程,先不说这样写合不合适.
至少从理论上看着不像是由它引起的内存泄露.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-14 09:59:14 | 显示全部楼层
xiaoyao1 发表于 2024-8-14 09:17 AM
那位同学我可是对号入座了,看样子我得先按照面向对象的特性将我之前的100多行代码给改改。
有机 ...

当然。也不能因为暴雪是牛逼大公司
就排出它本身代码有bug的可能性
只能说内存泄漏这种问题
我们作为外人想要彻底查明原因
要伴随着大量的测试分析
当然,还得建立在你本身的编程习惯没问题的情况下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-14 10:06:52 | 显示全部楼层
xiaoyao1 发表于 2024-8-14 09:17 AM
那位同学我可是对号入座了,看样子我得先按照面向对象的特性将我之前的100多行代码给改改。
有机 ...

不过至少能通过掉帧分析到魔风的内存高占用
并直接联想到可能导致内存泄漏的代码段
而且这段代码也确实算是比较有嫌疑
如果你真的是业余爱好者的话
那还确实已经蛮厉害了解不少东西了
至少上一篇教程讲的东西应该是get到了
回复 支持 反对

使用道具 举报

发表于 2024-8-14 10:54:45 | 显示全部楼层
vshrd 发表于 2024-8-14 10:06 AM
不过至少能通过掉帧分析到魔风的内存高占用
并直接联想到可能导致内存泄漏的代码段
而且这段代码也确实 ...

感谢大佬的三连答复。我是魔兽爱好者+编程业余爱好者,有时会觉得学编程影响我游戏的速度,但其实有明确的答案,我更乐意的是看到编写的代码跑起来,而游戏本身没那么大的吸引力。来论坛前,为了搞个自动钓鱼,还去学python,用图像分析的方法来实现,做了一半,可以监测到鱼上钩了,结果发现论坛里有n多小工具就没在做了。
这个问题在另外一个帖子给了个解决方式,我去验证下。再次感谢答复。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-14 11:09:25 | 显示全部楼层
xiaoyao1 发表于 2024-8-14 10:54 AM
感谢大佬的三连答复。我是魔兽爱好者+编程业余爱好者,有时会觉得学编程影响我游戏的速度,但其实有明确 ...


那个帖子我也回复了
我当时就跟他说,把框体置为静态
后面也有人说做成全局.
其实是一个意思,就是把框体变量的生命周期给置为永存了.

这虽然是一个解决方案.
但其实是对萌新玩家的技术力不足的妥协.
实际上全局变量本身就是会在编程过程中尽量避免使用的.

等你真正get到面向对象的精髓.
明白了生命周期概念.
明白了可控生命周期.
就会真的理解到为什么业内的程序在职的程序不会喜欢全局变量

其实说到这里我也想起来了.
官方库是专门给出了施放事件的方法的
这也就意味着已经注册过的事件不处于内存池中被自动管理的范畴.

那么在不了解面向对象的基础上
也确实只能要么做成全局防止重复注册.
要么就每次注册后手动释放
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-31 04:14 AM , Processed in 0.166385 second(s), 26 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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