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

Project1

 找回密码
 注册会员
搜索
查看: 6193|回复: 21

【更新】提高游戏运行速度(v1.01)

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4739
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
发表于 2011-4-21 13:24:56 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一箭烂YiJL 于 2011-4-23 18:09 编辑

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


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

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

  1. #==============================================================================
  2. # ■ 提高游戏速度(v1.01)    by 一箭烂
  3. #------------------------------------------------------------------------------
  4. #  设置$Speed_Lv以致提高游戏速度,
  5. #    请插在main之上, Scene_Base之下
  6. #
  7. #  更新:
  8. #
  9. #    - *1.0.1* (2011-04-21) By 一箭烂(YiJL)
  10. #      *对Graphics.frame_count的修正
  11. #      
  12. #
  13. #    - *1.0.0* (2011-04-21) By 一箭烂(YiJL)
  14. #      *初版
  15. #
  16. #==============================================================================
  17. class Scene_Base
  18.   $Speed_Lv = 2     # 正常速度的倍数
  19.   #--------------------------------------------------------------------------
  20.   # ● 主处理
  21.   #--------------------------------------------------------------------------
  22.   def main
  23.     start                         # 开始处理
  24.     perform_transition            # 执行渐变
  25.     post_start                    # 开始后处理
  26.     Input.update                  # 更新输入讯息
  27.     #------------------------------------------------------------------------
  28.     # 添加部分
  29.     old_time = 1
  30.     #------------------------------------------------------------------------
  31.     loop do
  32.       #----------------------------------------------------------------------
  33.       # 添加部分
  34.       old_time += 1
  35.       old_time %= $Speed_Lv
  36.       if old_time >= ($Speed_Lv - 1)
  37.         Graphics.update           # 更新游戏画面
  38.       else
  39.         Graphics.frame_count += 1
  40.       end
  41.       #----------------------------------------------------------------------
  42.       Input.update                # 更新输入讯息
  43.       update                      # 更新画面
  44.       break if $scene != self     # 切换画面时中断循环
  45.     end
  46.     Graphics.update
  47.     pre_terminate                 # 结束前处理
  48.     Graphics.freeze               # 准备渐变
  49.     terminate                     # 结束处理
  50.   end
  51. end
复制代码
用#------
 #------包着的这些是外加的意思。

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

4.范例
没什么范例可给的,一插脚本就见效嘛~伸手要范例的回帖去吧。
已经把回复可见去掉了,VX区为啥这么多人想在草原中奔跑呢?= =
提高游戏速度_v1.01.zip (261.49 KB, 下载次数: 609)

点评

大概明白你想说啥, 但应该不是if吧,应该是until/while, 再做内容修改...  发表于 2011-4-25 12:06
就是 return if @update_count>60 and (Time.now-@ot==0)  发表于 2011-4-23 21:11
我有点听不懂....= =  发表于 2011-4-22 08:04
你可以这么认为……1秒里面Update超过60次就阿掉你……  发表于 2011-4-22 00:03
为什么是VX的范例啊·····没有XP的吗  发表于 2011-4-21 13:30

评分

参与人数 2星屑 +84 收起 理由
夕阳武士 + 60 加油~
summer92 + 24 我很赞同

查看全部评分

Lv3.寻梦者

超哲♂学安仔

梦石
0
星屑
1143
在线时间
1473 小时
注册时间
2011-3-10
帖子
3726

短篇七彩虹组亚军

发表于 2011-4-21 13:28:52 | 显示全部楼层
本帖最后由 zx工作室2 于 2011-4-21 13:29 编辑

沙发!
为什么是VX的范例啊·····

点评

XP没有Scene_Base,但可以从Graphics.update下手。(要么做一个在XP区发布。)  发表于 2011-4-21 13:39
这里是VX区= =  发表于 2011-4-21 13:30
为什么是VX的范例啊·····  发表于 2011-4-21 13:29
不找1,不找0,不找0.5,不找瘦猴狒狒U熊,
30岁以上以下以内以外的都可以回帖交流。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
176 小时
注册时间
2011-1-26
帖子
131
发表于 2011-4-21 13:55:35 | 显示全部楼层
支持,抱走了,看看是否能流畅的运行99个并行事件
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

发表于 2011-4-21 14:00:55 | 显示全部楼层
最好  能够考虑到,画面只是游戏流畅度的一部分。对于每帧都有逻辑或AI计算的游戏来说,画面和这些部分不同步也会有很多问题。

点评

丢线程异步  发表于 2011-4-22 00:03
说错了,应该是说尤其用Graphics.frame_count的。  发表于 2011-4-21 14:37
的确,比如在横版这种强制及高运算移动执行,会出现问题。  发表于 2011-4-21 14:26
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv2.观梦者

邪恶米饼殿

梦石
0
星屑
367
在线时间
569 小时
注册时间
2007-12-23
帖子
1584
发表于 2011-4-21 14:24:18 | 显示全部楼层
容易出错吧这样弄
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1224
在线时间
667 小时
注册时间
2009-11-11
帖子
2787
发表于 2011-4-21 14:30:41 | 显示全部楼层
是吗?超过120.....挑战CPU啊

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
发表于 2011-4-21 14:52:10 | 显示全部楼层
本帖最后由 苏小脉 于 2011-4-21 14:53 编辑

嗯,有些人称这种方法或现象为“跳帧”。
另外睡眠那里应该是减去游戏逻辑耗费的时间比较合理,因为是固定帧率。

变慢的话可以调用两次 Graphics.update,不过这么做只能是帧率的倍数,任意比率的话就只能手动 sleep 了,嘿嘿。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

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

那么也就是Graphics.update已经考虑到逻辑运算所消耗的时间了。
如此推论的话,当实际fps下降是因为RM进程(Game.exe)/RM线程的优先级不够高?
然后抢得CPU使用量不够多?于是我做了一下实验:


用SetProcessWorkingSetSize函数将RM进程(Game.exe)提升到最高级(即时):
  1. SetProcPriority = Win32API.new("kernel32", "SetPriorityClass", "ll", "i")
  2. SetProcPriority.call(-1, 0x100)
复制代码
然后用"跳帧"的方法,10倍的跳帧。
应用在我计划的一个即时性战斗游戏里,重点在于即时性,双方、动画、逻辑运算越来越多。
然后设下一个按钮开关,准备将优先级降低至悠闲级(最低)。

然后开始,不一会,CPU介乎于90~100%,然后把优先级降低至最低,
CPU使用率马上下降了,游戏也慢了下来。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
发表于 2011-4-21 15:36:02 | 显示全部楼层
一箭烂YiJL 发表于 2011-4-21 15:14
回复 苏小脉 的帖子

那么也就是Graphics.update已经考虑到逻辑运算所消耗的时间了。

实际帧率下降主要还是逻辑超出了预期运算时间了(预期最大不超过 (1000/帧率) 毫秒),所以原本固定 40 帧每秒,实际可能只渲染了不到 40 帧。

在抢先式多任务的操作系统下通过调整优先级就算有性能上的改善,也不是解决问题的正途,因为这种行为很流氓。抢先式系统下资源大家共有,地主老财作风从来不被提倡。微软操作系统缺省的排程还是比较人性化的,在前台的程序优先级总是稍高于后台程序。

点评

@yangff 没人说是混合在一起的啊。  发表于 2011-4-22 01:21
渲染这个是架构问题……其实很少把逻辑运算和渲染混合在一起的  发表于 2011-4-22 00:06
我们可以用任务管理器调教进程的优先级。(貌似有些很重要的进程不能改。)  发表于 2011-4-21 21:00
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
157 小时
注册时间
2011-1-19
帖子
59
发表于 2011-4-21 19:07:38 | 显示全部楼层
我喜欢收藏,所以要回复也下,切~。。。

点评

可惜目前版本对Graphics.frame_count没有修正。  发表于 2011-4-21 19:38
无个人签名
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 18:08

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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