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

Project1

 找回密码
 注册会员
搜索
查看: 5324|回复: 17

[原创发布] FPS限制解除

[复制链接]

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

发表于 2019-5-21 17:06:12 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 SixRC 于 2019-5-21 17:15 编辑

原来的情况
用下面的代码可以测试
RUBY 代码复制
  1. Graphics.frame_rate = 60
  2. c = 0
  3. t = Time.now
  4. s = Sprite.new
  5. s.bitmap = Bitmap.new(200,200)
  6. s.bitmap.font.color = Color.new(255,255,255)
  7. loop do
  8.   Graphics.update
  9.   tt=Time.now
  10.   sleep 0.013
  11.   c += 1
  12.   s.bitmap.clear
  13.   s.bitmap.draw_text(0,0,200,200,"#{c/(Time.now - t)}",1)
  14. end

yl.png

按理说 显示的FPS不应该和每秒执行Graphics.update的次数一样吗
但其实RGSS为了保证游戏能在指定的帧数下运行 割掉了一些帧的显示 (也就是 游戏运行帧率 > 实际显示帧率)
也就是 每秒能执行到Graphics.update那么多次 但是实际渲染的画面数量是不足够的

但是!真正的问题在于 当刷新间隔一大 却没大到应该删帧的时候 它却还是大幅度缩减了帧率
只睡了 13 毫秒 算上绘制字符串 清空位图 最多 2 毫秒 加起来 15 加上绘制和显示的支出 会多吗??? 完全可以上 50+ FPS的
但是它却把这限制了

我不清楚限制的逻辑到底是啥  
上面那个测试 我试几次还不一样
假如把 0.013 改成更高 效果更明显
除此以外 还有个限制
就是一方面即使把帧率设成120 实际显示也就 60 估计是屏幕刷新率 这还好 这个限制能节省资源 因为反正屏幕也显示不了
但是重要的是 在刷新间隔大的时候
会有一个区间 FPS 被限制在 30
这时候不管睡 18ms 20ms 22ms 啥的 都是 30FPS  直到更久了 FPS 才正常掉下去
这是为了稳定吗 不知道

所以有了下面的脚本
一个是强制每次调用 update 都要渲染画面 fps_render_always(bool = true)
一个是解除第二个限制  fps_unlimit(bool = true)
还加了个获取游戏实际显示fps的小功能 fps
只适用于 103J 别的没做
RUBY 代码复制
  1. module Graphics
  2.   module_function
  3.   FPS_DLL = Win32API.new('kernel32','GetModuleHandleA','p','l').call('RGSS103J')
  4.   FPS_WPMPL = Win32API.new('kernel32','WriteProcessMemory','lplll','l')
  5.   FPS_WPMLP = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
  6.   temp = "\0" * 4
  7.   FPS_WPMPL.call(-1, temp, FPS_DLL + 0x12B6C4, 4, 0)
  8.   FPS_FPS = temp.unpack("l")[0] + 0x124
  9.   def fps_unlimit(bool = true)
  10.     if bool
  11.       FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\xEB",1,0)
  12.     else
  13.       FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\x74",1,0)
  14.     end
  15.   end
  16.   def fps_render_always(bool = true)
  17.     if bool
  18.       FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\xEB",1,0)
  19.     else
  20.       FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\x7D",1,0)
  21.     end
  22.   end
  23.   def fps
  24.     f = "\0" * 4
  25.     FPS_WPMPL.call(-1, f, FPS_FPS, 4, 0)
  26.     (f.unpack("l")[0] + 500) / 1000
  27.   end
  28. end


这样就让游戏运行帧率和实际显示帧率一致
缺点是假如运行慢了 游戏运行帧率会下去
不过那样就还原就好 各取所需

现在
RUBY 代码复制
  1. Graphics.fps_render_always
  2. Graphics.fps_unlimit
  3. Graphics.frame_rate = 60
  4. c = 0
  5. t = Time.now
  6. s = Sprite.new
  7. s.bitmap = Bitmap.new(200,200)
  8. s.bitmap.font.color = Color.new(255,255,255)
  9. loop do
  10.   Graphics.update
  11.   tt=Time.now
  12.   sleep 0.013
  13.   c += 1
  14.   s.bitmap.clear
  15.   s.bitmap.draw_text(0,0,200,100,"#{Graphics.fps}",1)
  16.   s.bitmap.draw_text(0,100,200,100,"#{c/(Time.now - t)}",1)
  17. end

now.png

评分

参与人数 2+2 收起 理由
kirh_036 + 1 精品文章
ppspssss + 1 不过RMXP运行效率太低了

查看全部评分

Lv4.逐梦者

梦石
0
星屑
14051
在线时间
2135 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

发表于 2019-5-22 09:53:30 | 显示全部楼层
本帖最后由 miantouchi 于 2019-5-22 15:09 编辑

把module Graphics这段代码插到main方法前,貌似和以前没什么区别
2019-05-22_150521.png

点评

1.调帧率 2.自己找游戏里影响效率的地方优化 3.找通用优化脚本 4.嫌麻烦的话不可能  发表于 2019-5-23 13:28
虽然是同步了,但是xp的 FPS始终是40左右,有什么办法能提高吗?  发表于 2019-5-23 10:13
设置帧率不属于我脚本的一部分  发表于 2019-5-22 15:53
调用方法加到这里可以吧  发表于 2019-5-22 15:09
底下范例  发表于 2019-5-22 11:44
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1237
在线时间
163 小时
注册时间
2019-10-4
帖子
217
发表于 2020-4-22 10:44:25 | 显示全部楼层
看不懂 但是还是想问个问题,就是在地图上加速移动画面会撕裂开 是帧数率的问题吗

点评

不懂画面撕裂 能发个范例吗 我好研究一下  发表于 2020-4-22 11:20
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1237
在线时间
163 小时
注册时间
2019-10-4
帖子
217
发表于 2020-4-22 11:28:36 | 显示全部楼层
契约师Vi 发表于 2020-4-22 10:44
看不懂 但是还是想问个问题,就是在地图上加速移动画面会撕裂开 是帧数率的问题吗 ...

就是移动的时候,地图最上方块面会分裂开,实际情况就是我添加了加速移动脚本
QQ浏览器截图20200422112938.png
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1237
在线时间
163 小时
注册时间
2019-10-4
帖子
217
发表于 2020-4-22 11:29:53 | 显示全部楼层
契约师Vi 发表于 2020-4-22 11:28
就是移动的时候,地图最上方块面会分裂开,实际情况就是我添加了加速移动脚本 ...

可以看到上方的湖水和树枝,山的块状分裂了吗?有解决方法吗楼主

点评

不要连帖 善用编辑和点评 图片能让我知道有问题 不能让我知道问题在哪 麻烦发个最小规模的范例  发表于 2020-4-22 12:24
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
11194
在线时间
607 小时
注册时间
2016-8-25
帖子
1393

R考场第七期纪念奖

发表于 2020-4-22 11:52:32 | 显示全部楼层
这个60帧之后人物移速会增加吗

点评

嗯 和时间挂钩就不会被帧率影响 不过感觉会很麻烦 什么都要改的感觉...还好我不做游戏不考虑这个.. 加油  发表于 2020-4-22 12:35
是的,我之前改成60帧,移速变快了 计时器什么的估计也得一起改  发表于 2020-4-22 12:28
60帧比40帧理论上移速会快 但这和脚本怎么写有关 然后 我的脚本和60帧无关 上面的只是范例和功能介绍  发表于 2020-4-22 12:26
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-29 14:56

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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