赞 | 86 |
VIP | 0 |
好人卡 | 1 |
积分 | 136 |
经验 | 14048 |
最后登录 | 2021-1-24 |
在线时间 | 2753 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 帖子
- 756
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 SixRC 于 2019-5-21 17:15 编辑
原来的情况
用下面的代码可以测试
Graphics.frame_rate = 60 c = 0 t = Time.now s = Sprite.new s.bitmap = Bitmap.new(200,200) s.bitmap.font.color = Color.new(255,255,255) loop do Graphics.update tt=Time.now sleep 0.013 c += 1 s.bitmap.clear s.bitmap.draw_text(0,0,200,200,"#{c/(Time.now - t)}",1) end
Graphics.frame_rate = 60
c = 0
t = Time.now
s = Sprite.new
s.bitmap = Bitmap.new(200,200)
s.bitmap.font.color = Color.new(255,255,255)
loop do
Graphics.update
tt=Time.now
sleep 0.013
c += 1
s.bitmap.clear
s.bitmap.draw_text(0,0,200,200,"#{c/(Time.now - t)}",1)
end
按理说 显示的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 别的没做
module Graphics module_function FPS_DLL = Win32API.new('kernel32','GetModuleHandleA','p','l').call('RGSS103J') FPS_WPMPL = Win32API.new('kernel32','WriteProcessMemory','lplll','l') FPS_WPMLP = Win32API.new('kernel32','WriteProcessMemory','llpll','l') temp = "\0" * 4 FPS_WPMPL.call(-1, temp, FPS_DLL + 0x12B6C4, 4, 0) FPS_FPS = temp.unpack("l")[0] + 0x124 def fps_unlimit(bool = true) if bool FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\xEB",1,0) else FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\x74",1,0) end end def fps_render_always(bool = true) if bool FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\xEB",1,0) else FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\x7D",1,0) end end def fps f = "\0" * 4 FPS_WPMPL.call(-1, f, FPS_FPS, 4, 0) (f.unpack("l")[0] + 500) / 1000 end end
module Graphics
module_function
FPS_DLL = Win32API.new('kernel32','GetModuleHandleA','p','l').call('RGSS103J')
FPS_WPMPL = Win32API.new('kernel32','WriteProcessMemory','lplll','l')
FPS_WPMLP = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
temp = "\0" * 4
FPS_WPMPL.call(-1, temp, FPS_DLL + 0x12B6C4, 4, 0)
FPS_FPS = temp.unpack("l")[0] + 0x124
def fps_unlimit(bool = true)
if bool
FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\xEB",1,0)
else
FPS_WPMLP.call(-1,FPS_DLL+0x1552B,"\x74",1,0)
end
end
def fps_render_always(bool = true)
if bool
FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\xEB",1,0)
else
FPS_WPMLP.call(-1,FPS_DLL+0x2AE4,"\x7D",1,0)
end
end
def fps
f = "\0" * 4
FPS_WPMPL.call(-1, f, FPS_FPS, 4, 0)
(f.unpack("l")[0] + 500) / 1000
end
end
这样就让游戏运行帧率和实际显示帧率一致
缺点是假如运行慢了 游戏运行帧率会下去
不过那样就还原就好 各取所需
现在
Graphics.fps_render_always Graphics.fps_unlimit Graphics.frame_rate = 60 c = 0 t = Time.now s = Sprite.new s.bitmap = Bitmap.new(200,200) s.bitmap.font.color = Color.new(255,255,255) loop do Graphics.update tt=Time.now sleep 0.013 c += 1 s.bitmap.clear s.bitmap.draw_text(0,0,200,100,"#{Graphics.fps}",1) s.bitmap.draw_text(0,100,200,100,"#{c/(Time.now - t)}",1) end
Graphics.fps_render_always
Graphics.fps_unlimit
Graphics.frame_rate = 60
c = 0
t = Time.now
s = Sprite.new
s.bitmap = Bitmap.new(200,200)
s.bitmap.font.color = Color.new(255,255,255)
loop do
Graphics.update
tt=Time.now
sleep 0.013
c += 1
s.bitmap.clear
s.bitmap.draw_text(0,0,200,100,"#{Graphics.fps}",1)
s.bitmap.draw_text(0,100,200,100,"#{c/(Time.now - t)}",1)
end
|
评分
-
查看全部评分
|