查看: 64|回复: 0

[转载发布] FPS限制解除

[复制链接]
  • TA的每日心情
    开心
    前天 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月八日(秋) | 显示全部楼层 |阅读模式
    原来的情况
    用下面的代码可以测试
    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. loopdo
    8.   Graphics.update
    9.   tt=Time.now
    10.   sleep0.013
    11.   c += 1
    12.   s.bitmap.clear
    13.   s.bitmap.draw_text(0,0,200,200,"#{c/(Time.now - t)}",1)
    14. 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 别的没做
    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. loopdo
    10.   Graphics.update
    11.   tt=Time.now
    12.   sleep0.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
    复制代码


                 本帖来自P1论坛作者SixRC,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=477301  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2024-5-12 03:48 , Processed in 0.050282 second(s), 45 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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