Project1

标题: 请问:为什么要把@battleback_sprite的位图释放掉? [打印本页]

作者: kvkv97    时间: 2021-2-21 15:24
标题: 请问:为什么要把@battleback_sprite的位图释放掉?
请问:为什么要把@battleback_sprite的位图释放掉?

   # 战斗背景的文件名与现在情况有差异的情况下
    if @battleback_name != $game_temp.battleback_name
      @battleback_name = $game_temp.battleback_name
      if @battleback_sprite.bitmap != nil
        @battleback_sprite.bitmap.dispose
      end
      @battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)
      @battleback_sprite.src_rect.set(0, 0, 640, 320)
    end
请问,为什么要把@battleback_sprite.bitmap释放掉?
作者: enghao_lim    时间: 2021-2-22 03:33
因为要生成新的bitmap,旧的bitmap最好的做法就是释放,让内存可以被回收。
作者: Im剑侠客    时间: 2021-2-22 18:14
窗口的描绘也是一个原理,旧的clear之后,新的再生成。
作者: ppspssss    时间: 2021-2-25 13:42
这个问题问得好 , 既然下方会覆盖为什么还要删的呢
@enghao_lim 他说的对 , 我就用自己比喻法說一下詳情 , 虽然@battleback_sprite.bitmap = RPG::Cache.battleback(@battleback_name)看出之後他的bitmap会被新的战斗背景图片覆盖 ,图片精灵(sprite)的精灵虽然指针 , 但其实内存里还是有变成一个没有用旧图片 , 这个旧图片没有指针, 但图像还是占用了内存, 过一段时间引擎会自动清除这种旧图片 , 一旦积聚多, 一下子清除就会游戏卡帧完全静止, 其他图片精灵(sprite)叠加就会加重这个问题, 因此清除是有道理的
作者: RyanBern    时间: 2021-2-25 23:39
本帖最后由 RyanBern 于 2021-2-25 23:42 编辑

楼上的各位存在一个误区。

注意这里的 @battleback_sprite.bitmap 是用 RPG::Cache 方式生成的(高速缓存),而高速缓存的作用就是在内存里面留有一个图片的副本,方便下次载入的时候直接从内存读而不是从外部文件直接生成。所以原则上使用 RPG::Cache 产生的 Bitmap 不需要被释放。详见 F1 中的 RPG::Cache 模块。真正需要释放的是使用 Bitmap.new 方法生成的位图(例如窗口的 contents)。

那么为什么默认脚本还是释放了?怕是只能理解为写默认脚本的人忘记了这回事了。




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