设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

【Help窗口滚动】超限部分的说明文字滚动显示

查看数: 2565 | 评论数: 5 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2022-6-23 13:44

正文摘要:

本帖最后由 纯属小虫 于 2022-6-24 10:41 编辑 一直觉得help窗口文字超限之后,把文字压缩了不大美观 于是将说明文字做成了滚动显示的模式 效果: 代码:塞个糖糖吧~ 滚动窗口代码——可能会与跟help有关的 ...

回复

xuprmpau 发表于 2023-9-30 14:37:33
使用時 在戰鬥時 選擇技能
當技能的說明有改變文字顏色的話 並且說明文字需要滾動  遊戲FPS 會降到超低 整個很卡  不知道是甚麼問題QQ

另外說明文字明明很短  但卻因為 說明有打上 \C[N]改變文字 或者\i[n]顯示圖標  而導致腳本好像覺得該段文字超過了 於是也會滾動
求解

点评

可以打开任务管理器,看看滚动字条的时候,电脑内存占有是否上升。如果有,应该还是上述内存未释放的问题造成的。  发表于 2023-10-7 11:21
對 我有自己加入改變顏色跟顯示圖標 不過主要問題還是fps的降低QQ  发表于 2023-10-5 21:39
应该是使用了不兼容脚本导致的,说明文字中原版脚本不支持使用改字色和图标显示  发表于 2023-10-5 17:52
guoxiaomi 发表于 2022-6-24 12:09:43
本帖最后由 guoxiaomi 于 2022-6-24 12:22 编辑
纯属小虫 发表于 2022-6-24 10:38
嗯~虽然不大清楚内存泄露会造成什么翻车现象,以及内存泄露的原理
不过我好像懂了释放的重要性


测试了一下,确实不会内存泄漏。
  1. 1000.times do
  2.   Bitmap.new(256, 256)
  3. end

  4. sleep 3

  5. GC.start

  6. loop do
  7.   Graphics.update
  8.   Input.update
  9.   exit if Input.trigger?(Input::C)
  10. end
复制代码

这段代码在我的电脑上操作时,内存占用会先上升到 264M(这部分 Bitmap 会占 256M,ruby 的栈占 8M),然后下降到 12M。说明GC开始后,临时的Bitmap申请的的内存都释放掉了。

RGSS内部类是如何实现的,我们也只能靠猜。可能是这样的:在创建Bitmap时,RGSS会向操作系统申请一块内存以放置图块文件,每个像素点4个字节存储RGBA。而在dispose时,RGSS会归还这部分内存,当然,Bitmap在释放后就不能执行任何操作了。如果RGSS里没有设置GC时也会归还内存,就会造成内存泄漏。不过RGSS也考虑到了这一点,那其实你怎么写问题也不大,只能说随用随还养成好习惯吧。

点评

我去测试了一下,内存占用确实也是先升高到一个限度,然后猛降低;释放了就不会升高~~~感谢提醒,以前写的脚本都忽略了释放,该改改习惯了~~~  发表于 2022-6-24 14:21

评分

参与人数 1+1 收起 理由
纯属小虫 + 1 塞糖

查看全部评分

纯属小虫 发表于 2022-6-24 10:38:30
本帖最后由 纯属小虫 于 2022-6-24 10:48 编辑
guoxiaomi 发表于 2022-6-24 02:07
2楼说的很对,你这样的写法会造成内存泄漏。RGSS的正常写法里,Window的contents属性都是在initialize方法 ...


嗯~虽然不大清楚内存泄露会造成什么翻车现象,以及内存泄露的原理
不过我好像懂了释放的重要性

我写了一个试错脚本,还请大佬帮我看看,如果这样写,是不是就会内存泄露

极端的试错脚本


另外,再请教一下,dispose这个操作,具体是做了什么——来自半吊子的疑惑



原脚本已更新修正
guoxiaomi 发表于 2022-6-24 02:07:33
本帖最后由 guoxiaomi 于 2022-6-24 12:19 编辑

2楼说的很对,你这样的写法会造成内存泄漏。见下面楼层解释)RGSS的正常写法里,Window的contents属性都是在initialize方法里定义的,当然,这个时候必须知道窗口的宽和高。而绘制相关的方法里,只能使用self.contents.clear,然后开始绘制。

你仍然可以在 initialize 方法里先创建一个默认的 contents,然后在需要改变 contents 前(调用 self.contents = Bitmap.new 之前)释放之 self.contents.dispose 。
至于你的 @text_width_pro,这是一个实例变量,最好不要同时有 2 种类型,当你不想使用某个 Bitmap 时,必须主动调用 dispose 释放它。

=== 分割线 ===
说起来我写的新引擎里,Bitmap 除了 dispose 方法外,也会在 GC 时主动释放资源,从而避免内存泄漏,省心省力。
  1. class Bitmap
  2.   def self.create_finalizer
  3.     proc { |object_id| RGM::Base.bitmap_dispose(object_id) }
  4.   end

  5.   def initialize(*args)
  6.     # ...
  7.     ObjectSpace.define_finalizer(self, self.class.create_finalizer)
  8.   end
  9. end
复制代码

评分

参与人数 1+1 收起 理由
纯属小虫 + 1 我很赞同

查看全部评分

RPGzh500223 发表于 2022-6-23 20:34:18
本帖最后由 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计算描绘文字区域

点评

我忘了还有GC回收的机制了……/(ㄒoㄒ)/~~,其实RPG::Cache.clear就是个很明显的例子  发表于 2022-7-3 22:03
测试了一下,GC时这部分内容会被正常回收,那么其实也不算内存泄漏……  发表于 2022-6-24 12:18
第一点你可以打开任务管理器,不断切换选项,内存一直增加,很明显的内存泄漏了 第二点我只能说见仁见智了  发表于 2022-6-23 23:20
另外,没有直接用self.contents 是因为生成self.contents前需要计算宽度,如果用同一个,看起来有点别扭,所以就介入了另一个量@text_width_pro  发表于 2022-6-23 22:32
啊哈哈,@text_width_pro = Bitmap.new 其实就是个计算多于宽度的临时变量,最后被覆盖成数字了,我理解的应该是不用释放  发表于 2022-6-23 22:31

评分

参与人数 1+1 收起 理由
纯属小虫 + 1 我很赞同

查看全部评分

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 18:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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