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

Project1

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

[原创发布] 【更新】提高游戏运行速度_v1.01

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 2011-4-22 17:00:58 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 一箭烂YiJL 于 2011-4-25 11:55 编辑

-1.序前序
我还是第一次在XP区发布(我是VX区驻扎人员,偶然探望XP区= =),由于这一帖:【更新】提高游戏运行速度(v1.01)
需要在XP的移植,因为XP并没有Scene_Base,所以用了也无效。
于是"下手"在了Graphics.update。这种手法既能用于XP,又能用于VX
在XP的非"平滑模式"下,会卡着,具体原因是用了Graphics.frame_count来判断"跳帧",
后来我又用了另外的解决办法,但是当非"平滑模式"下,将倍数x2后,(其他的都没问题)
fps会莫名其妙的增加至40帧,于是这个只是应用在游戏测试中而已。
之后以下的句子跟VX的帖子一样:
(ps:VX没有XP的v1.01更新内容,因为VX没有F12问题= =)


0.序
往往游戏过程因为太慢,所以想高速测试有难度。
最简单的办法是将帧频率调高,但是不能超过120。
这办法适用在游戏测试中(尤其是破关时间),请不要发布于游戏中,
因为速度不等于效率,极快会感觉一卡一卡。


1.讲解
当删掉Graphics.update时,会出现画面不更新,但是操作极快的问题。
loop do绝对超过一秒60次(帧频率)。于是这是我的猜测
Graphics.update除了有更新画面的基本动作外,还会有:
  1. sleep(1/Graphics.frame_rate - 更新画面的时间 - 逻辑运算的时间)    # 此处经过修正
复制代码
所以不用Graphics.update就会高速不断地循环计算。

2.脚本
综合以上,脚本如下:

  1. #==============================================================================
  2. # ■ 提高游戏速度(v1.0.1)    by 一箭烂
  3. #------------------------------------------------------------------------------
  4. #  设置Graphics的@speed_lv以提高游戏速度,
  5. #    请插在main以上的位置
  6. #
  7. #  属性:
  8. #
  9. #    Graphics.speed_lv
  10. #      加快速度(倍数), 可修改
  11. #
  12. #  更新:
  13. #
  14. #    - *1.0.1* (2011-04-21) By 一箭烂(YiJL)
  15. #      *改了些东西, 解决F12问题
  16. #      *换了速度变量的方式
  17. #
  18. #    - *1.0.0* (2011-04-21) By 一箭烂(YiJL)
  19. #      *初版
  20. #      *对Graphics.frame_count的修正
  21. #
  22. #==============================================================================
  23. module Graphics
  24.   @speed_lv     = 5            # 加快速度(倍数)
  25.   @timer        = 0
  26.   @speed_update = method("update") unless @speed_update
  27.   #--------------------------------------------------------------------------
  28.   # ● Graphics.update
  29.   #--------------------------------------------------------------------------
  30.   def self.update
  31.     @timer += 1
  32.     @timer %= @speed_lv
  33.     if @timer >= (@speed_lv - 1)
  34.       @speed_update.call             # 更新游戏画面
  35.       Graphics.frame_count -= 1
  36.     end
  37.     Graphics.frame_count += 1
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● Graphics.speed_lv
  41.   #--------------------------------------------------------------------------
  42.   def self.speed_lv
  43.     @speed_lv
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● Graphics.speed_lv=
  47.   #--------------------------------------------------------------------------
  48.   def self.speed_lv=(value)
  49.     @speed_lv = value
  50.   end
  51. end
复制代码
用#------
 #------包着的这些是外加的意思。

3.其他
实质上帧频率不变,但是做一次Graphics.update(画面更新)就等于做了x次的其他数据运算。
当数据运算量太大时就可能会有卡的状况。(Speed_Lv影响着数据运算比起平常倍数!)
还有现在的版本只能加速/不加速,不能减速!

4.范例
没什么范例可给的,一插脚本就见效嘛~伸手要范例的回帖去吧。
算了,有些无谓的回帖,但是又不是下载的,慢慢在草原奔跑吧~
提高游戏运行速度_v1.01.zip (203.58 KB, 下载次数: 1654)

点评

17楼我已经上传附件了,您可以下载看看,那个防卡的脚本很让我失望。  发表于 2011-4-24 20:25
主要问题是扩展分辨率太娇气了,虽然卡屏,FPS降低到个位数,但是CPU使用率并没有达到100%,找了很多防卡和加速脚本但是兼容性还是让我失望。  发表于 2011-4-24 13:59

评分

参与人数 4星屑 +364 收起 理由
eve592370698 + 200 帮我弄把那个扩展分辨率加加速度吧。.
小传子 + 100 好强大啊喵= =。。。 学习了
px.凤翔九天 + 40 不错,原来Graphics.update 是这个原理啊~.
烁灵 + 24 前辈好强大0.0

查看全部评分

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
2
 楼主| 发表于 2011-4-22 17:45:38 | 显示全部楼层
本帖最后由 一箭烂YiJL 于 2011-4-22 17:52 编辑

回复 IamI 的帖子

class<<和alias真是麻烦...有办法解决F12么?

减速的方法早已留意到,但是随意的倍数(浮点数倍数)需要sleep了。
(毕竟这个是提高速度...)

事实上是跳帧的原理,同样的加快frame_count是给逻辑运算和PlayTime用的,
方便测试游戏时间和逻辑运算的准确性。
重申速度不等于效率= =

最莫名其妙的是如果另外开一个实例变量来储存真的Graphics.frame_count,
用于修正Graphics.frame_count,这样虽然可以兼容了非"平滑模式",
但是却在倍数为2的时候出现上调至40帧频率的问题。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
3
 楼主| 发表于 2011-4-22 18:53:24 | 显示全部楼层
回复 忧雪の伤 的帖子

@speed_Lv还不算被定义了,所以会出错。
用全局变量可以在任何地方随时改变加速倍数。(而且不会没定义)

以前还不知道F12干啥的。现在知道了,也不知道F12这么快重载的原理。
总之,谢谢提出F12解决办法。

点评

额,忘了这一点……就看看F12这点吧……  发表于 2011-4-22 19:01
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
4
 楼主| 发表于 2011-4-23 10:46:10 | 显示全部楼层
回复 苏小脉 的帖子

试过了,的确能够解决F12的函数问题(包括module的method)。
原理是将整个架构保存一次,然后再F12重载的时候将架构复原,是吗?

但是我发现这样有点问题,当如这样所说,插入了以后,
在中间写下:p true,F12不会执行,又比如在一个新工程画白色背景:
  1. back = Sprite.new
  2. back.z = 1
  3. back.bitmap = Bitmap.new(640, 480)
  4. back.bitmap.fill_rect(0, 0, 640, 480, Color.new(255,255,255))
复制代码
第一次的时候,白背景将标题背景遮住了。F12,白背景不见了。
就算(module的)实例变量也有相同的问题,苏可以在沉影的(dll)鼠标系统里试试,
会发生disposed sprite的问题。

也不知道这真是问题还是我搞错呢......
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
5
 楼主| 发表于 2011-4-23 17:49:09 | 显示全部楼层
回复 苏小脉 的帖子

也就是要在函数中赋值。 alias放上,原版更上?但原版是函数外赋值的话,就麻烦了。
如果能对method、alias、alias_method......下做method_defined?、unless...的话能解决?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
6
 楼主| 发表于 2011-4-24 10:56:38 | 显示全部楼层
回复 苏小脉 的帖子

“函数中赋值”意思是要在函数中定义变量的值:
  1. @a = 50 if @a.nil?
  2. @b = Sprite.new if @b.nil? or @b.disposed?
复制代码
但是在常用的update中会耗用逻辑运算时间。
(尤其在没有initialize的模块类,除非另外开一个函数定义变量。)

还要自设跳转点啊...那么alias那些就要跟函数外定义变量的模块都要拆开?

我指的"下手"是在method、alias、alias_method......这些函数内部下手,
让method_defined?为false的时候才工作。(但是这似乎是不可能的)
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4869
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
7
 楼主| 发表于 2011-4-24 21:45:37 | 显示全部楼层
回复 苏小脉 的帖子
抱歉,我还是没跟上,这个和我们之前讨论的有什么联系?

之前不是说过用您的办法后函数外给变量定义会出错么?(沉影dll鼠标会出现Sprite disposed)
但是函数内给变量定义且没问题。看一下两个例子:
  1. # 函数外赋值(F12杯具)
  2. $__f12_no_reeval.call if $__f12_no_reeval
  3. module AAA
  4.   @a = Sprite.new
  5.   def self.a
  6.     @a.x = 100
  7.     p @a.x
  8.   end
  9. end
  10. callcc { |$__f12_no_reeval| }
  11. AAA.a     # 代表Scene_Base的update
复制代码

如果是函数内赋值:
  1. # 函数内赋值(F12无问题, 但耗费逻辑时间)
  2. $__f12_no_reeval.call if $__f12_no_reeval
  3. module AAA
  4.   def self.a
  5.     @a = Sprite.new if @a.nil? or @a.disposed?
  6.     @a.x = 100
  7.     p @a.x
  8.   end
  9. end
  10. callcc { |$__f12_no_reeval| }
  11. AAA.a     # 代表Scene_Base的update
复制代码

不用啊,为什么?那篇文章里面给的例子就是在 Main 的开头设立了一个跳转点,我的意思是需要的话可以在不同的地方设立多个,这样可以控制 F12 之后哪段执行,哪段跳过。

如果跳一次的话,就要将alias和函数外定义变量分开= =但是跳来跳去也挺乱的。
但是这样(即有alias和函数外定义变量):
  1. #~ $__f12_no_reeval.call if $__f12_no_reeval
  2. module Graphics
  3.   @speed_update = method("update")
  4.   @speed_lv = Sprite.new
  5.   @speed_lv.x = 50
  6.   def self.update
  7.     a = @speed_lv.x
  8.     @speed_update.call
  9.   end
  10. end
  11. #~ callcc { |$__f12_no_reeval| }
  12. Graphics.update      # 代表后置的场景操作
  13. # 用callcc的时候会发生Sprite disposed
  14. # 不用的时候会发生stack level too deep
复制代码

而我说的将两者分开的做法是这样:
  1. $__f12_no_reeval.call if $__f12_no_reeval
  2. # alias/函数 堆
  3. module Graphics
  4.   @speed_update = method("update")
  5.   def self.update
  6.     a = @speed_lv.x
  7.     @speed_update.call
  8.   end
  9. end

  10. callcc { |$__f12_no_reeval| }  # callcc

  11. # 函数外赋值 堆
  12. module Graphics
  13.   @speed_lv = Sprite.new
  14.   @speed_lv.x = 50
  15. end

  16. Graphics.update      # 代表后置的场景操作
复制代码

我想您说的办法应该是这样:

  1. $__f12_no_reeval.call if $__f12_no_reeval
  2. module Graphics
  3.   @speed_update = method("update")
  4.   callcc { |$__f12_no_reeval| }    # callcc
  5.   @speed_lv = Sprite.new
  6.   @speed_lv.x = 50
  7.   def self.update
  8.     a = @speed_lv.x
  9.     @speed_update.call
  10.   end
  11. end
  12. Graphics.update      # 代表后置的场景操作
复制代码

嗯~相信您会清楚我在说啥...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-14 02:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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