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

Project1

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

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

[复制链接]

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
跳转到指定楼层
1
发表于 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)

评分

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

查看全部评分

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
2
 楼主| 发表于 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使用率马上下降了,游戏也慢了下来。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
3
 楼主| 发表于 2011-4-21 23:50:22 | 显示全部楼层
更新了,仪式上顶一下。
如果卡的话,游戏Debug测试时可以用8楼的脚本,
但是要定制监控CPU使用量,以免耗用量过大。
更重要的是游戏发布时最好别用8楼的脚本。(流氓~)

点评

期待xp的、、、、、、、  发表于 2011-4-22 12:24
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
4
 楼主| 发表于 2011-4-22 17:03:49 | 显示全部楼层
回复 005020671 的帖子

XP的发布了:提高游戏运行速度
有一个bug,就是非"平滑模式",具体看上面。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
5
 楼主| 发表于 2011-4-27 10:07:27 | 显示全部楼层
回复 link006007 的帖子

偶尔看见您的发帖。于是就说:

我们RGSS脚本是一条线程,(好像也是窗口的主线程,紫苏应该比较清楚),
所谓画面、逻辑加快也只是限于这线程。那么其他Ruby线程在没加快的情况下,
而且该线程一直执行着与游戏有关的运算,就不再同步了。

线程有他自己的优先级,与他的进程的CPU使用有关,(一下只是评论:)
RM主线程被用满的时候,就要用Ruby的线程?(Thread.new),
但是也同时依赖Game.exe这个进程。Game.exe的优先级所有的CPU使用量也用完了,
那么彻底的完蛋了= =(该优先级不是好办法...另开进程也不是好办法...)
最好就是逻辑运算高速简洁。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

弓箭手?剑兰

梦石
0
星屑
4859
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
6
 楼主| 发表于 2011-4-27 13:31:43 | 显示全部楼层
回复 link006007 的帖子

原来确的,Ruby线程用的是时间片轮转法,开了多线程也是不会提高进程效率...但是Thread.new出来的线程是否属于窗口(RM主线程)就不知道,不过RGSS却的确被进行再RM窗口。(用GetCurrentThreadId和GetWindowThreadProcessId就能知道)。

但在任务调度机制下,优先级抢占运行。一个进程里的每一个线程都有他们的优先级,CPU是先给高优先级的进程,再由它的线程优先级分先后运行。多核是多个CPU在同时分配工作嘛~当然运行的快点啦。

控制线程操作速度...貌似要很手动,sleep少一点?

点评

见 25 楼。轮转式调度不是原因,整个 Windows NT 都是轮转式调度的。  发表于 2011-4-27 13:54
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-11 12:26

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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