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

Project1

 找回密码
 注册会员
搜索
查看: 1971|回复: 12
打印 上一主题 下一主题

[已经解决] update方法,更新画面导致游戏太卡,用它有什么技巧?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3093
在线时间
344 小时
注册时间
2021-10-18
帖子
157
跳转到指定楼层
1
发表于 2021-12-10 22:14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
以前看一些楼主说过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 方法更新,以前没怎么在地图中跑没发现,现在跑一下很要命,太卡了。。。

Lv1.梦旅人

梦石
0
星屑
88
在线时间
9 小时
注册时间
2021-7-9
帖子
5
2
发表于 2021-12-11 13:31:27 | 只看该作者
emmm
update隔几帧更新次可能要好点

点评

隔几帧更新一次是怎么操作?  发表于 2021-12-12 14:57
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21517
在线时间
9398 小时
注册时间
2012-6-19
帖子
7114

开拓者短篇九导演组冠军

3
发表于 2021-12-11 14:57:31 | 只看该作者
减少无必要的画面重绘以及无必要的大开销计算可以减缓画面卡顿

以你主楼的代码为例,把修改透明度从每次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
复制代码


点评

学到了,好的,我去试试  发表于 2021-12-12 15:03

评分

参与人数 1星屑 +150 收起 理由
alexncf125 + 150 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

4
发表于 2021-12-11 16:30:01 | 只看该作者
仔细检查draw_text是否被不断的调用,这是画面绘制里最耗时的东西

点评

值槽不消耗时间,那就不是这里的问题  发表于 2021-12-12 21:19
单独关这个变量绘制的话,还是有,把值槽也关了,一样是会卡,不开全屏(alt+enter),用窗口玩就不卡  发表于 2021-12-12 20:14
那你试试不绘制这个变量,效果如何?  发表于 2021-12-12 17:50
好像真的是文字绘制搞得很卡,不过我才一个更新绘制了一个 数字变量  发表于 2021-12-12 15:02
捕捉世界上最强的郭兄大人!  发表于 2021-12-11 16:55

评分

参与人数 1星屑 +10 收起 理由
alexncf125 + 10 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3093
在线时间
344 小时
注册时间
2021-10-18
帖子
157
5
 楼主| 发表于 2021-12-12 20:22:49 | 只看该作者
其实我想问,def update
                      表达式
                    end

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

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

那我不创建实例,这个update方法会不会执行?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21517
在线时间
9398 小时
注册时间
2012-6-19
帖子
7114

开拓者短篇九导演组冠军

6
发表于 2021-12-12 22:35: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
复制代码




评分

参与人数 1星屑 +150 收起 理由
alexncf125 + 150 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2025-3-13 03:18

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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