Project1

标题: update方法,更新画面导致游戏太卡,用它有什么技巧? [打印本页]

作者: 掘窖人    时间: 2021-12-10 22:14
标题: update方法,更新画面导致游戏太卡,用它有什么技巧?
以前看一些楼主说过update方法,之后我用它的时候都大概这样写:

def update
  表达式
end

在窗口类用还好,因为不会太长时间呆在菜单里面,所以没发现什么卡;但是后来在地图场景(Scene_Map)里面用update 方法加了一些 值槽 的更新,比如生命值、饥饿值、头上聊天气泡之类,就卡得明显。

这种卡不是画面卡,是在按方向键跑步的时候,按住左一直跑一段时间再往右跑,角色会延迟1秒多才往右跑,然后按方向下跑一段再按方向键上也是延迟1秒多才开始往上跑。

感觉是因为用多了update方法导致的,

我看内建类更新方法一般是: Input.update、Windows.update     这样用,

但是我用时 def update     不知道是不是我搞错了什么, 更新不是这样用的吗?
                    表达式
                 end


比如:

def update
  case WenZi.Yt      #实际是$game_player.y坐标
      when 0..1
         @Zhi_Cao.contents_opacity=50
         
      when 2..900
         @Zhi_Cao.contents_opacity=255        
   end
end

这个更新,是更新值槽的透明度,如果角色走在地图 Y坐标为0到1之间的地方,值槽窗口不透明度就是50;在2到900之间,就是不透明度255;

然后让它一直更新判定。

不知道这种写法对不对,我脚本中大量使用这种update 方法更新,以前没怎么在地图中跑没发现,现在跑一下很要命,太卡了。。。
作者: BMMGA    时间: 2021-12-11 13:31
emmm
update隔几帧更新次可能要好点
作者: 喵呜喵5    时间: 2021-12-11 14:57
减少无必要的画面重绘以及无必要的大开销计算可以减缓画面卡顿

以你主楼的代码为例,把修改透明度从每次update都修改一次调整为透明度发生变化了才修改一次

  1. def update
  2.   case WenZi.Yt
  3.   when 0..1
  4.     @cache = 50
  5.   when 2..900
  6.     @cache = 255
  7.   end
  8.   if @Zhi_Cao.contents_opacity != @cache
  9.     @Zhi_Cao.contents_opacity = @cache
  10.   end
  11. end
复制代码



作者: guoxiaomi    时间: 2021-12-11 16:30
仔细检查draw_text是否被不断的调用,这是画面绘制里最耗时的东西
作者: 掘窖人    时间: 2021-12-12 20:22
其实我想问,def update
                      表达式
                    end

这个方法是什么原理?我没见它在父类哪里有定义,一般方法调用需要用【对象】 调用 【方法】的吧,也没发现它在哪里被调用了。

如果我在一个类里面,定义 def update
                                          表达式
                                        end

那我不创建实例,这个update方法会不会执行?
作者: 喵呜喵5    时间: 2021-12-12 22:35
掘窖人 发表于 2021-12-12 20:22
其实我想问,def update
                      表达式
                    end

你可以直接在脚本里全局搜索 .update ,就能发现各个update在哪里调用了

例如 Scene_Base 第93行
  1.   def update_all_windows
  2.     instance_variables.each do |varname|
  3.       ivar = instance_variable_get(varname)
  4.       ivar.update if ivar.is_a?(Window)
  5.     end
  6.   end
复制代码


这段代码的含义是所有 Scene_Base 的子类调用 update_all_windows 方法时,会执行他实例变量里是 Window 子类的那些实例变量的 update 方法
Scene_Base 的 update_all_windows 被他自己的 update_basic - update 方法调用
而这个 update 又被 Scene 自己的 main 用 until 循环的方式调用
  1.   def main
  2.     start
  3.     post_start
  4.     update until scene_changing?
  5.     pre_terminate
  6.     terminate
  7.   end
复制代码


然后,因为 Scene_Base 在 update 中调用了RGSS3的 Graphics.update,所以没有导致死循环,而是实现了每帧 update 一次的效果
  1.   def update_basic
  2.     Graphics.update
  3.     Input.update
  4.     update_all_windows
  5.   end
复制代码









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