Project1

标题: 【Help窗口滚动】超限部分的说明文字滚动显示 [打印本页]

作者: 纯属小虫    时间: 2022-6-23 13:44
标题: 【Help窗口滚动】超限部分的说明文字滚动显示
本帖最后由 纯属小虫 于 2022-6-24 10:41 编辑

一直觉得help窗口文字超限之后,把文字压缩了不大美观
于是将说明文字做成了滚动显示的模式

效果:


附件下载:请塞个糖呗
说明窗口文字滚动.zip (202.71 KB, 下载次数: 30)


代码:塞个糖糖吧~
滚动窗口代码——可能会与跟help有关的窗口冲突


不过,由于RMXP的编码是UTF-8 汉字是三~四个字节
而汉字实际占用显示的像素空间是数字和字幕和空格的两倍,这种差异使得不大好计算描绘文字的实际像素长度
这里暂时没有解决精确计算字符串长度的问题,所以当说明文字里有比较多的空格和字母的时候,文字滚动会滚过头......



上述问题已经解决...代码附件已更新
直接用Bitmap 的text_size就可以计算文字实际像素长度了,我傻了...



2022/06/24  试图修正了未dispose的问题



作者: RPGzh500223    时间: 2022-6-23 20:34
本帖最后由 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计算描绘文字区域
作者: guoxiaomi    时间: 2022-6-24 02:07
本帖最后由 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
复制代码

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


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

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

极端的试错脚本


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



原脚本已更新修正
作者: guoxiaomi    时间: 2022-6-24 12:09
本帖最后由 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也考虑到了这一点,那其实你怎么写问题也不大,只能说随用随还养成好习惯吧。

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

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




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1