本帖最后由 guoxiaomi 于 2022-6-24 12:22 编辑 纯属小虫 发表于 2022-6-24 10:38 测试了一下,确实不会内存泄漏。
这段代码在我的电脑上操作时,内存占用会先上升到 264M(这部分 Bitmap 会占 256M,ruby 的栈占 8M),然后下降到 12M。说明GC开始后,临时的Bitmap申请的的内存都释放掉了。 RGSS内部类是如何实现的,我们也只能靠猜。可能是这样的:在创建Bitmap时,RGSS会向操作系统申请一块内存以放置图块文件,每个像素点4个字节存储RGBA。而在dispose时,RGSS会归还这部分内存,当然,Bitmap在释放后就不能执行任何操作了。如果RGSS里没有设置GC时也会归还内存,就会造成内存泄漏。不过RGSS也考虑到了这一点,那其实你怎么写问题也不大,只能说随用随还养成好习惯吧。 |
本帖最后由 纯属小虫 于 2022-6-24 10:48 编辑 guoxiaomi 发表于 2022-6-24 02:07 嗯~虽然不大清楚内存泄露会造成什么翻车现象,以及内存泄露的原理 不过我好像懂了释放的重要性 我写了一个试错脚本,还请大佬帮我看看,如果这样写,是不是就会内存泄露 极端的试错脚本 另外,再请教一下,dispose这个操作,具体是做了什么——来自半吊子的疑惑 原脚本已更新修正 |
本帖最后由 guoxiaomi 于 2022-6-24 12:19 编辑 你仍然可以在 initialize 方法里先创建一个默认的 contents,然后在需要改变 contents 前(调用 self.contents = Bitmap.new 之前)释放之 self.contents.dispose 。 至于你的 @text_width_pro,这是一个实例变量,最好不要同时有 2 种类型,当你不想使用某个 Bitmap 时,必须主动调用 dispose 释放它。 === 分割线 === 说起来我写的新引擎里,Bitmap 除了 dispose 方法外,也会在 GC 时主动释放资源,从而避免内存泄漏,省心省力。
|
本帖最后由 RPGzh500223 于 2022-6-23 20:38 编辑 @text_width_pro = Bitmap.new(4,4) self.contents = Bitmap.new(width - 32 + @text_width_pro, height - 32) 没考虑释放,这算是不小的问题了…… self.contents本身就是个Bitmap实例,可以self.contents.text_size计算描绘文字区域 |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-23 18:23
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.