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

Project1

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

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

[复制链接]

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5594
在线时间
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, 下载次数: 1655)

评分

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

查看全部评分

Lv1.梦旅人

虱子

梦石
0
星屑
121
在线时间
1782 小时
注册时间
2010-6-19
帖子
3597
2
发表于 2011-4-22 17:21:39 | 只看该作者
我想知道这样alias按F12会出错么?

http://rpg.blue/thread-175056-1-2.html
PVZ型塔防物一个
http://rpg.blue/thread-155199-1-2.html
RMXP技术讨论区手动认可帖,得到答案请认可
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

3
发表于 2011-4-22 17:33:38 | 只看该作者
F12必挂……另外减速其实就是多开几次update嘛 - -b
另外没改frame_count、画面没有实质刷新,本质上等于跳帧- -b
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5594
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
4
 楼主| 发表于 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帧频率的问题。
回复 支持 反对

使用道具 举报

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

5
发表于 2011-4-22 18:29:17 | 只看该作者

  1. class << Graphics
  2.   @speed_Lv = 2
  3.   alias :speed_update :update unless method_defined?("speed_update")
  4.   def update
  5.     @timer = 0 if @timer.nil?
  6.     @timer += 1
  7.     @timer %= @speed_Lv
  8.     if @timer >= (@speed_Lv - 1)
  9.       speed_update            
  10.       Graphics.frame_count -= 1
  11.     end
  12.     Graphics.frame_count += 1
  13.   end
  14. end
复制代码
F12神马的……顺便改了下全局变量……
可以不用全局还是不用吧?……
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5594
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
6
 楼主| 发表于 2011-4-22 18:53:24 | 只看该作者
回复 忧雪の伤 的帖子

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

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

点评

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
26 小时
注册时间
2011-1-22
帖子
10
7
发表于 2011-4-22 21:32:48 | 只看该作者
回复 忧雪の伤 的帖子

更新了,虽然没有用你提供办法,但是F12依然已经解决,
而且不用class的形式编写了,而是用了本身的module。

之前所说的@speed_Lv还没定义,是因为并非以module的形式编写,
导致不能将@speed_Lv赋值。(除非函数触动的方式)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
8
发表于 2011-4-23 09:33:36 | 只看该作者
一箭烂YiJL 发表于 2011-4-22 17:45
回复 IamI 的帖子

class

解决 F12:
http://szsu.wordpress.com/2010/09/07/continuation/
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5594
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
9
 楼主| 发表于 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的问题。

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
10
发表于 2011-4-23 10:57:06 | 只看该作者
一箭烂YiJL 发表于 2011-4-23 10:46
回复 苏小脉 的帖子

试过了,的确能够解决F12的函数问题(包括module的method)。

原理是记录 Main 脚本之前的堆栈环境,F12 回到开头的时候直接全局跳转到记录点。中间写的东西 F12 之后不会执行第二次,所以希望 F12 后重新执行的内容得放在 callcc 的调用下面。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-28 10:59

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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