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

Project1

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

[已经解决] 有谁知道tilemap的update代码怎么改?

[复制链接]

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
跳转到指定楼层
1
发表于 2021-9-7 18:19:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
我的游戏里每隔几秒钟60帧率就会降到40几,就是卡一下然后恢复原状。目前没找到原因。(脚本大改过)但我觉得有可能和tilemap有关。因为当我在spritesetmap里让tilemap二次更新时(就是多加一次tilemap.update),发生卡顿的频率上升,当我改回来后卡顿频率下降了。
主要是地图动画组件的动画速度实在太慢了,我想加快一点,但是不知道tilemap里update这个内部方法的代码是什么,只能多更新一遍,也就更可能会卡顿……实在不知道怎么改,查了半天查不到,有没有人知道怎么了解这种内部代码?
顺带一提,原脚本里parallax的方法在没有设置远景时会掉帧,我给改掉了

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
2
 楼主| 发表于 2021-9-7 18:22:17 | 只看该作者
还有,之前我试过rgd版本,结果不仅是一堆Bug,闪退,由于战斗画面用了自己大改过的sideview(优化过卡顿),结果及其卡,只有20帧左右,每次一放动画人物动作,那个卡成ppt……这是怎么回事?
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
24287
在线时间
5047 小时
注册时间
2016-3-8
帖子
1618
3
发表于 2021-9-7 18:52:42 | 只看该作者
整个工程砍掉重做吧
我的工程也是之前fps剩下20
现在砍掉重做才回到60
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
4
 楼主| 发表于 2021-9-7 18:53:34 | 只看该作者
一个奇怪的现象:按住shift时莫名卡顿,掉帧明显只有20左右,而且似乎按存档来的,另外开一个就没事了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
5
 楼主| 发表于 2021-9-7 18:54:45 | 只看该作者
alexncf125 发表于 2021-9-7 18:52
整个工程砍掉重做吧
我的工程也是之前fps剩下20
现在砍掉重做才回到60

这是怎么回事?有多少内容导致卡顿能判断吗?
我这个也没到那种程度,平时60的
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
6
 楼主| 发表于 2021-9-7 19:05:27 | 只看该作者
这是一个昵称9 发表于 2021-9-7 18:53
一个奇怪的现象:按住shift时莫名卡顿,掉帧明显只有20左右,而且似乎按存档来的,另外开一个就没事了 ...

这个问题已经找到原因了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
7
 楼主| 发表于 2021-9-7 23:22:10 | 只看该作者
经过测试,新存档不会卡顿,但是游戏进行过程中不知怎么的就卡了
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
768
在线时间
49 小时
注册时间
2020-8-28
帖子
23
8
 楼主| 发表于 2021-9-8 00:30:27 | 只看该作者
本帖最后由 这是一个昵称9 于 2021-9-8 00:36 编辑

此贴可以暂时终结,我找到了问题所在
是显示图片之后,虽然图片消失了,但是图片obj还在,精灵还在,只是bitmap变成了空的,导致画面卡顿
(原脚本优化不当导致的,类似的还有parallax,也是优化问题,如果你不用远景图就会掉帧)
改动方法很简单,sprite_picture里覆盖掉update_bitmap和update_origin
  1. def update_bitmap
  2.     if @picture.name != ""
  3.       self.bitmap = Cache.picture(@picture.name) if [email protected]_name
  4.       self.bitmap = Cache.face(@picture.name) if @picture.f_name
  5.     elsif self.bitmap && !self.bitmap.disposed?
  6.       self.bitmap.dispose
  7.       self.bitmap = nil
  8.     end
  9.   end
  10.   
  11.   def update_origin
  12.     if @picture.origin == 0
  13.       self.ox = 0
  14.       self.oy = 0
  15.     elsif self.bitmap
  16.       self.ox = bitmap.width / 2
  17.       self.oy = bitmap.height / 2
  18.     end
  19.   end
复制代码

如果还想去掉不用的图片,把spriteset_map里update_pictures改成这样
  1. def update_pictures
  2.     @picture_sprites.compact.each do |pic|
  3.       pic.update
  4.     end
  5.     if $game_map.screen.pictures.compact.size != @picture_sprites.compact.size
  6.       $game_map.screen.pictures.each do |pic|
  7.         if pic
  8.         @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport2, pic)
  9.         @picture_sprites[pic.number].update
  10.         elsif @picture_sprites[pic.number]
  11.         @picture_sprites[pic.number].dispose
  12.         @picture_sprites[pic.number] = nil
  13.         end
  14.       end
  15.     end
  16.   end
复制代码

并且在game_pictures里加上
  1. def compact
  2.     @data.compact
  3.   end
复制代码
(要让上面的有用得在事件管理器里把消除图片的加上screen消除game_pictures里的picture)
优化远景图
  1. def update_parallax
  2.     if @parallax_name != $game_map.parallax_name
  3.       @parallax_name = $game_map.parallax_name
  4.       if @parallax && @parallax_name == ""
  5.         @parallax.bitmap.dispose if @parallax.bitmap
  6.         @parallax.dispose
  7.         @parallax = nil
  8.       elsif @parallax_name != ""
  9.         create_parallax if !@parallax
  10.         @parallax.bitmap = Cache.parallax(@parallax_name)
  11.         Graphics.frame_reset
  12.         @paraw = @parallax.bitmap.width
  13.         @parah = @parallax.bitmap.height
  14.       end
  15.     end
  16.     if @parallax
  17.       @parallax.ox = $game_map.parallax_ox(@paraw)
  18.       @parallax.oy = $game_map.parallax_oy(@parah)
  19.     end
  20.   end
  21. def create_parallax
  22.     if $game_map.parallax_name != ""
  23.       @parallax = Plane.new(@viewport1)
  24.       @parallax.z = -100
  25.       @parallax_name = $game_map.parallax_name
  26.       @parallax.bitmap = Cache.parallax(@parallax_name)
  27.       Graphics.frame_reset
  28.       @paraw = @parallax.bitmap.width
  29.       @parah = @parallax.bitmap.height
  30.     else
  31.       if @parallax
  32.         @parallax.bitmap.dispose
  33.         @parallax.dispose
  34.         @parallax = nil
  35.       end
  36.     end
  37.   end
复制代码

评分

参与人数 1星屑 +150 +1 收起 理由
alexncf125 + 150 + 1 精品文章

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 19:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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