- 累计送礼:
- 0 个
- 累计收礼:
- 0 个
TA的每日心情 | 开心 2025-7-8 01:43 |
---|
签到天数: 157 天 连续签到: 2 天 [LV.7]常住居民III

管理员
  
- VIP
- 6
- 卡币
- 13119
- OK点
- 16
- 推广点
- 0
- 同能卷
- 0
- 积分
- 16093


|
一般来说,我们认为RGSS的内存泄漏通常发生在需要主动dispose的资源类型上,
其他的数据类型如果不是刻意为之,很难导致严重的内存泄漏,
但是,由于Joiplay的引擎底层跟RPGMaker PC端并不完全一致,
可能就会导致一些在PC端上没有任何问题的脚本,在Joiplay上出现严重的问题
其中,Joiplay的字体缓存就是重灾区
请看以下这段代码:
RUBY 代码 - def draw_text(x,y,w)
- returnunless@cur_val
- @window.contents.font.name = "VL GOTHIC"
- @window.change_color(@window.system_color)
- @window.draw_text(x, y, 30, @window.line_height, @vocab)
- @window.change_color(@window.normal_color)
- @window.change_color(@window.crisis_color)if@cur_val < @max_val / 4
- xr = x + w
- if w < 96
- @window.draw_text(xr - 40, y, 42, @window.line_height, @cur_val.to_i, 2)
- else
- @window.draw_text(xr - 92, y, 42, @window.line_height, @cur_val.to_i, 2)
- @window.change_color(@window.normal_color)
- @window.draw_text(xr - 52, y, 12, @window.line_height, "/", 2)
- @window.draw_text(xr - 42, y, 42, @window.line_height, @max_val, 2)
- end
- @window.contents.font.name = Font.default_name[0]
- end
复制代码
这段代码看起来就是很普通的切换显示字体,显示文本,然后把字体切回去
在PC端上,引擎会从内建的字体缓存中切换字体,几乎没有性能开销
但是在Joiplay上,每次执行这段代码,Joiplay都会尝试重新读取字体,
而不幸的是,这段代码被放在了角色状态栏的动画效果中,
只要进行战斗动作就会随着HPMP的动画效果每帧执行,
最终的结果就是平均每回合提升约60MB的内存占用
那么应该怎么解决呢?
唔呣,既然Joiplay没有字体缓存,那么我们就只好自己创建字体缓存了
具体来说,是把每个Font当作缓存来用,不到万不得已不直接修改Font里的内容
例如,在这个案例中,我选择在类里面塞两个Font作为缓存,
需要用的时候直接切换整个font,这样就可以避免对Font内部做修改导致的Joiplay问题
RUBY 代码 - class Special_Gauge
- @@original_gauge_font = nil
- @@custom_gauge_font = nil
- attr_accessor :cur_val
- def initialize(x,y,w,r,c1,c2,window,height = SPECIAL_GAUGES::DEFAULT_HEIGHT)
- @x = x
- @y = y
- @width = w
- @cur_rate = r
- @max_rate = r
- @color1 = c1
- @color2 = c2
- @window = window
- @speed = 0
- @speed_rate = 0
- @height = height
- @fall_sprites = []
- # 修复:初始化字体缓存
- if @@custom_gauge_font.nil?
- @@original_gauge_font = @window.contents.font.deep_copy# 其实就是新建了一个字体然后把所有属性搬过去
- @@custom_gauge_font = @window.contents.font.deep_copy(false)# 少搬一个名字,避免又主动读取字体
- @@custom_gauge_font.name = SPECIAL_GAUGES::CUSTOM_FONT_NAME
- end
- refresh
- end
- def draw_text(x,y,w)
- returnunless@cur_val
- # 修复:使用字体缓存切换字体而不是名字
- @window.contents.font = @@custom_gauge_font
- @window.change_color(@window.system_color)
- @window.draw_text(x, y, 30, @window.line_height, @vocab)
- @window.change_color(@window.normal_color)
- @window.change_color(@window.crisis_color)if@cur_val < @max_val / 4
- xr = x + w
- if w < 96
- @window.draw_text(xr - 40, y, 42, @window.line_height, @cur_val.to_i, 2)
- else
- @window.draw_text(xr - 92, y, 42, @window.line_height, @cur_val.to_i, 2)
- @window.change_color(@window.normal_color)
- @window.draw_text(xr - 52, y, 12, @window.line_height, "/", 2)
- @window.draw_text(xr - 42, y, 42, @window.line_height, @max_val, 2)
- end
- @window.contents.font = @@original_gauge_font
- end
复制代码
另外,Joiplay上经常出现的字体透明度错误的问题,也是因为字体缓存没有及时刷新导致的
但是这个问题我还没有研究透彻,也没有找到主动刷新缓存的方案
如果有大佬知道,还请指点一下
本帖来自P1论坛作者saicatedoan,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址: https://rpg.blue/forum.php?mod=viewthread&tid=497767 若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。 |
|