查看: 1435|回复: 0

[讨论] 测出运行速度Low最低帧数?(不准确)

[复制链接]
梦石
0
星屑
1517
在线时间
253 小时
注册时间
2023-11-9
回帖
44
发表于 2025-7-25 20:35:16 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 ppspssss2 于 2025-8-2 22:37 编辑

xp(只在xp测试)vx,ace 或许要作出修改(没试)

本贴参考自论坛用户名:SixRC的贴子(下面有地址),改装成可在游戏中测试实际运行之效率
实际上我也不知是测出什么玩意(按道理应该不会超出设定帧数值,但他就是超过了30%,按SixRC的结论就是1.3倍 30% ,是实际游戏运行速度),我自己是无结论,或许看SixRC的结论就是正确,SixRC的结论来说(大于实际显示帧数F2)但我自己是还看不懂,主要作用还是测出卡顿的情况,low越小卡顿越严重,无法用于测游戏帧数用途(不准确)
放在不同的update处得出数值也很大分别,数值会有很大波动范围,如 为什么会超出范围如60帧测出会去到80我就不知道了(SixRC的结论游戏运行帧率大于实际显示帧数)


由于XP,VX,VACE也是纯软解,无法使用软件测附加测出帧率,体感觉到行走地图会卡,(若其他情况请自行添加在相关的update处),但debug F2显示的帧数较难得知卡到底掉到多少帧,
后来用RGD测出,该脚本是游戏实际update帧数而非绘制帧数
如果是这样估计不适合高速动作类游戏,因为帧数波动范围大,尤其CPU占用大时,波动范围会更大采集实际运行之帧数 是 忽高忽低

本脚本:获取电系系统当前时间Time.now 之差 得出当前帧数,再用1除以他, 比如差值是0。02   套用公式1/0.02 = 50 , 当前为50帧
减法计算:Time.now.to_f*10000000- @time_now_刚才.to_f*10000000
根据Time.now.to_f 会得到6~7位小数,自动四舍五入7位变6位,由于减法计算会自动去除小数值,因此需乘大7个0的倍数, 变成整数计算后再除以7个零变回小数
c=c/10000000
本贴试了update是放在scene_map地图(放不同地方测出结果不同?),地图执行采集到的帧数貌似会低于游戏显示的帧值,sixric用结论那样推测是游戏实际运行速度要低于画面速度,(平滑模式下20帧实际运行依然是每秒到40)'
为什么时大时少的有时超过40去到50多?难道会出现快于40帧每秒情况吗? 《《经过测试好像是会的
如需其他测试需放在对应脚本刷新处


032750b3-baab-4a62-958e-44f92e25534f.png
RMXP工程地图:大多时间为40,38~43,(仅限该图片的工程参考数据,该工程CPU占用较低)

实际大于显示帧率

实际大于显示帧率

图示:超出60,去到76(偶尔还会到80)

微星小飞机RGD绘制速度:

微星小飞机RGD绘制速度:
、
RGD若设定为60帧,会有时50帧~80帧 之间波动
而游戏显示帧数为稳定60(与微星小飞机测出一致,RGD F2帧数=微星小飞机)(仅限该图片的工程参考数据,该工程CPU占用较高,GPU占用较低)
1%Low帧 ,和其他软件的1%Low不一样,只是我方便名字是我不知起什么好, 实际游戏运行效率
Low帧是用获取100帧,收集100帧的数据,待完成后,使用 数组的 【.sort】方法由小到大排列.sort[0] 则是数组第一个值因此为最小值以得到Low帧,若.sort[99]则为数组中的最大值以得到high帧,
先前脚本:[讨论] (整活假的)模仿微星小飞机硬件监控 (无实际功能)
https://rpg.blue/forum.php?mod=v ... p;extra=#pid2994880


参考了过往的论坛里的贴子多个贴子文章(具体别的贴子也忘了,最主要SixRC这个贴子,是这个贴子吧?





参考自SixRC贴子:
https://rpg.blue/thread-477301-1-1.html
[原创发布] FPS限制解除
@SixRC
此用户已长期没上线(上次活动时间2021-1-24 09:29) 所以无法询问此脚本是获取了每秒的update运行次数还是图象绘制的update次数

[fold=主脚本,面向对象 备注:注释混杂,尽量别看]
#__END__
#=============================================
# 显示晶片名字窗口。#攻击力以及元素标识
#==============================================================================
#为独立分支
#模拟微星小飞机,显示电脑状态动态刷新,(整活用假)
#Graphics.frame_rate = 600
class Window_chipname # @ chipname_window #其实不算window类别搞混了只是普通实例
attr_accessor :showtext #attr_accessor可外部读写变量这里就不用
#attr_accessor :visible #?不用,不使用原窗口
attr_accessor :vis
attr_accessor :elem_pic
attr_accessor :text_three
attr_accessor :w_chipname元素标识隐藏
def initialize #初始化
   @vis = true #不用
  @text_three = Sprite.new
   #@text_three.bitmap = Bitmap.new(175,210)
   @text_three.bitmap = Bitmap.new(150,22*2) #画布大小,设定小会显示不全,太大会占用资源
   @text_three.x = 0 #初始x,y轴为左上角
   @text_three.y = 100
   @text_three.z = 5020 # z轴尽量大显示在最上方
   #@visible = false #不用
   @my_framecount = 0 #计时器用的变量
   @showtext = ["","",""] #不用
   @showtext = ["RTX4090","22","33"] #不用
   @showtext_2 = ["100度","100%","33MHz"] #不用
   @low帧数组 =[]
   @savelow帧 = 0
   @time_now_刚才= "" #不用
   @标题_1 = "RTX4090" #不用
   @行数_1=0 #不用
   @右数= #不用
   @r=[]#存放隨機数的数组
   
   refresh #初始化后需刷新一次
   
   #@x = 0
   #@y = 96
   
end

#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
   @time_now_刚才 = Time.now if @time_now_刚才 ==""#储存现时时间,跟下面的Time.now作对比
   @time_now_刚才 = Time.now if @my_framecount ==0
   #用于延迟每34帧才进行刷新一次
   @my_framecount += 1 #每轮询一次计数器加1
   if @my_framecount >= 2#大于34计数,刷新
     @my_framecount = 0 #重置计时器
   else
     return #不刷新
   end
   
   @text_three.bitmap.clear #清除上一次绘制了的东西
   draw_chiptext #运行draw_chiptext def(方法)
#   @elem_pic.src_rect.set(b*28,a*28,28,28)
   

   #@元素标识隐藏 in

   
end

def draw_chiptext

#p c
  @行数_1=0
   @text_three.bitmap.font.color.set(245, 162, 0) #设定@text_three.bitmap.font的文字的颜色
  @text_three.bitmap.font.bold = true #使用文字粗体
  @text_three.bitmap.font.size = 22 #字体大小
  #@text_three.bitmap.font.default_out_color = Color.new(255,255,255,128) #描邊顏色#RGSS3用,RGSS1没用
#  @text_three.bitmap.font.outline = true #RGSS3用,RGSS1没用
  #@text_three.bitmap.
#  Font.default_shadow = false #RGSS3用,RGSS1没用
#gpu  占用百分比 温度
#显存
#cpu 占用百分比 温度 频率
#RAM 内存占用
#D3D12 帧率 延迟
#draw_text后分别为(x,y,x容量大小,y容量大小,要显示的string字串)
  @text_three.bitmap.font.color.set(110,186,68) # 文字绿色
  #@text_three.bitmap.draw_text(0, 0+@行数_1*22, 170, 22, "RTX4090")#
  @行数_1+=1 #方便统计
  @text_three.bitmap.font.color.set(110,186,68)  
# @text_three.bitmap.draw_text(0, 0+@行数_1*22, 115,22, "显存 24GB")#
  @行数_1+=1
  @text_three.bitmap.font.color.set(0, 134, 205)  # 文字蓝色
# @text_three.bitmap.draw_text(0, 0+@行数_1*22, 115,22, "R9 7950")#
  @行数_1+=1
# @text_three.bitmap.draw_text(0, 0+@行数_1*22, 115,22, "内存 48X2")#
  @行数_1+=1
    @text_three.bitmap.font.color.set(241,157,174)
# @text_three.bitmap.draw_text(0, 0+@行数_1*22, 115,22, "D3D12")#
  @行数_1+=1
  @text_three.bitmap.font.color.set(245, 162, 0) # # 文字橙色
  r=0#不用
  @r[r]=rand(10)+30 if rand(10*30)==0 or @r[r]==nil
  #数组用于储存值跟一次如果不刷新就复用,10分之1慨率刷新rand(10)==0,令看上去不会经常动的感觉(我看原版也是这样),第一次使 用是没有值因而要 加入or @r[r] ==nil就刷新一次
#  @text_three.bitmap.draw_text(22*5, 0+0*22, 170, 22, "#{@r[r]}"+"%")#
  @r[r+1]=rand(10)+60 if rand(10*30)==0 or @r[r+1]==nil
# @text_three.bitmap.draw_text(22*5+5*22, 0+0*22, 115,22, "#{@r[r+1]}"+"℃")#
  @r[r+2]=rand(100)+23000 if rand(10*30)==0 or @r[r+2]==nil
# @text_three.bitmap.draw_text(22*5, 0+1*22, 115,22, "#{@r[r+2]}"+"MB")#
  @r[r+3]=rand(10)+20 if rand(10*30)==0  or @r[r+3]==nil
# @text_three.bitmap.draw_text(22*5, 0+2*22, 170, 22, "#{@r[r+3]}"+"%")#
  @r[r+4]=rand(10)+50 if rand(10*30)==0  or @r[r+4]==nil
# @text_three.bitmap.draw_text(22*5+5*22, 0+2*22, 115,22, "#{@r[r+4]}"+"℃")#
  @r[r+5]=(rand(16))*25+5300 if rand(10*30)==0  or @r[r+5]==nil#处理器好像是每25Mhz步进,因此使用每25数值乘数
# @text_three.bitmap.draw_text(22*5+10*22, 0+2*22, 115,22, "#{@r[r+5]}"+"MHZ")#
  @r[r+6]=rand(1000)+95000 if rand(10*30)==0  or @r[r+6]==nil
# @text_three.bitmap.draw_text(22*5, 0+3*22, 115,22, "#{@r[r+6]}"+"MB")#
    @text_three.bitmap.font.color.set(255, 255, 255) # # 文字白色
    c = Time.now.to_f*10000000- @time_now_刚才.to_f*10000000 #用于跟上方的time.now相差作浮动用(其实也没什么用),随机生成也可以
  #因小数计算会只调用3位数? 因Time.now.to_f实际是7位因此乘7个0倍数,
  #待计算完毕再除以7个0倍数
    c=c/10000000
#

  @r[r+7]=c #加上一个固定值令看上去很大(随便起的)
  @r[r+7] = sprintf("%.0f", (1/@r[r+7])   ) #%.1f=保留小数点后1位,要是想3位把1f改成3f %.3f=保留小数点后3位
#p @r[r+7] if (@r[r+7].to_i) < 25



  @text_three.bitmap.draw_text(22*0, 0+0*22, 155,22, "#{@r[r+7]}"+"普通FPS" )#
  @r[r+8]= (1000/@r[r+7].to_f) #延迟差值秒乘1000等于毫秒(ms) ,1秒=1000毫秒(ms)
#  @text_three.bitmap.draw_text(22*5+5*22, 0+4*22, 155,22, "#{@r[r+8].to_i}"+"ms")#
  @r[r+9] = (@r[r+7].to_i)
  if @low帧数组.size>=100
       @low帧数组=[]
    @low帧数组.push(@r[r+9])
  
  else
   # p @low帧数组
   @low帧数组.push(@r[r+9])
  end #if
  
  
# @r[r+9] = (@r[r+7].to_i)  if (@r[r+7].to_i) < 25
if @low帧数组.size>=100
  a = @low帧数组.sort[0]
  @savelow帧 = a
  if @savelow帧 <= 20
  @text_three.bitmap.font.color.set(245, 162, 0)
else
  @text_three.bitmap.font.color.set(255, 255, 255)
  end
  @text_three.bitmap.draw_text(22*0, 0+1*22, 155,22, "#{@savelow帧.to_i}")#
  @text_three.bitmap.font.color.set(255, 255, 255)
  @text_three.bitmap.draw_text(22*1, 0+1*22, 155,22, " 1% Low帧 ")#
  else  #if @low帧数组
  #@savelow帧 = 0
  
  if @savelow帧 <= 20
  @text_three.bitmap.font.color.set(245, 162, 0)
else
  @text_three.bitmap.font.color.set(255, 255, 255)
  end
  @text_three.bitmap.draw_text(22*0, 0+1*22, 155,22, "#{@savelow帧.to_i}")#
  @text_three.bitmap.font.color.set(255, 255, 255)
  @text_three.bitmap.draw_text(22*1, 0+1*22, 155,22, " 1% Low帧 ")#
  end #if
  
end




end #class end

#$w_显示 = Window_chipname.new #全局变量生成实例 #放在要生成的地方
#$w_显示.refresh #要放在要刷新updata处(每帧调用时刷新一次)
#==========================================================================
# 本脚本来自www.66rpg.com,用于任何游戏请保留此信息。别以为加密就可以del哦
#==========================================================================
__END__
以下为例子方便调用
(245, 162, 0) 橙   (0, 134, 205) 蓝 (110,186,68)绿 (241,157,174)粉
0.016*60 = 1 (0.016 = 1/60 )time.now除出来的值乘看上去大一点
0.01*1000 = 10ms (每秒中反应时长越短越快)[/fold]

[fold=在Scene_Map中的update重复定义:用于跑地图测Low帧用]
class Scene_Map
  $w_显示_Map = Window_chipname.new #b
alias update_old update
def update
   update_old
   $w_显示_Map.refresh if $w_显示_Map!= nil
   #end #def
end #def
  
end  #class[/fold]

[fold=(其他可不看)pst]原出处@end55rpg 的 [通用发布] 99%无冲突的“显示消息”,可任意场景调用!pst print
而我使用QQ堂 驱逐坏蛋1.3内的脚本,因此以下是1.1版本:备注:也是该@end55rpg 作者

[pre lang="ruby"]#__END__
#===============================================================================
# PrintSuperText ver1.1
# 调用:pst(内容,是否不消失?,初始化透明度)
#    或pst(内容1, 内容2, 内容3, 内容4, 内容n.......)【内容 = String】
#    或printst(内容1,内容2,内容n)【内容 可以是 数值】
#      choose([选项名1,脚本字符串],[选项名2, ...],……)#注意这是待开发的。
# It can write down:(t1,t2,t3.....) and not erron as print.
# 以下是更新历史(update history):
# Ver1.1中:添加了加速机制,智能等待看完后消失。
#                                                    ----By End66rpg in 2012,2.
#===============================================================================
module Graphics
  # 生成Sprite对像
  @Tsprite = Sprite.new
  @Tsprite.y = 50 #
  @Tsprite.bitmap = Bitmap.new(64,32)
  @Tsprite.z = 9999999 + 1
  @Tsprite.opacity = 0
  @Tsprite_alltext = "notaking"
  @Tsprite_lastwait = 0
  @waitframe = 0
  @TspriteTEXT = Sprite.new
  @TspriteTEXT.y = 50 #
  @TspriteTEXT.bitmap = Bitmap.new(64,32)
  @TspriteTEXT.z = 9999999 + 2
  @TspriteTEXT.opacity = 0
  @Ruduce_Time = 0 #
  Update = method("update")
  def self.update(*arg)
    Update.call(*arg)
    unless @noclear == true
      if @waitframe != 0
        @waitframe -= 1
      else
        if @Tsprite != nil and @Tsprite.opacity > 0
          @Tsprite.opacity -= 3 #3
          @TspriteTEXT.opacity -= 3 #3
          Sety(0) if @Tsprite.opacity == 0
        end
      end
    end
  end
  def self.Sety(y) #y軸回复初始值
    #@Tsprite.y = y
    #@TspriteTEXT.y = y
  end
  def self.SetNewText(text,noclear,op)
    #text = text.to_s unless text.is_a?(String)
    if !text.is_a?(Array)
      if [text] == text.split("\n")
        text = text.unpack('100a100a100a')
      else
        text = text.split("\n")
      end
    else
      text = text.to_s
    end
    if @Tsprite_alltext == text
      @Tsprite.opacity = op.to_i
      @TspriteTEXT.opacity = op.to_i
      @waitframe = @Tsprite_lastwait
      return
    end
    @waitframe = 0
    @TspriteTEXT.bitmap.clear
    if @Tsprite_alltext.size != text.size or @Tsprite_alltext == 'notaking'
      @Tsprite.bitmap.clear
      
      @Tsprite.bitmap = Bitmap.new(640,32+text.size*32)
      @Tsprite.bitmap.fill_rect(0,0,640,text.size*12, Color.new(0,0,0,200))#矩形黑色顏色,透明度
    end
    @Tsprite.opacity = op.to_i
   
    @TspriteTEXT.bitmap = Bitmap.new(640,32+text.size*32)
    @TspriteTEXT.bitmap.font.color = Color.new(240,240,240)#文字顏色
    @TspriteTEXT.opacity = 255
    @Ruduce_Time = 0
   
    for t in 0..text.size-1
      @waitframe += (text[t].size.to_f / 16.5).round*40
      @TspriteTEXT.bitmap.draw_text(0,t*32,640,32, text[t].to_s,1)
    end
    @Tsprite_alltext = text
    @wait_frame = 60 if @waitframe == 0
    @noclear = noclear
    @waitframe*=3
    @Tsprite_lastwait = @waitframe
  end
  def self.noclear=(xx)
    @noclear = xx
  end
end
module Kernel
  #Print Super Text !!
  def pst(*arg)#(text,noclear = false,op=255)
    if [*arg][1].is_a?(String)
      Graphics.SetNewText([*arg],false,255)
      return
    end
    a = ([*arg][1]==nil ? false : [*arg][1])
    b = ([*arg][2]==nil ? 255   : [*arg][2])
    Graphics.SetNewText([*arg][0],a,b)
  end
  def printst(*arg)#(text,noclear = false,op=255)
    arr = []
    [*arg].each{|a|arr.push(a.to_s)}
    Graphics.SetNewText(arr,false,255)
  end
  def ypst(*arg)#(text,y)
    if [*arg][0].is_a?(String)
      Graphics.Sety([*arg][1])
      Graphics.SetNewText([*arg][0],false,255)
      return
    end
  end
end
#===============================================================================
# Happy Febrary!
#===============================================================================[/pre][/fold]

[fold=rmxp内存释放句子RPG::Cache.clear(论坛中搜玔的老贴子)]222
[已经解决] 随着游戏进行,内存到1G多,最后强退了。怎么解决呀?
https://rpg.blue/thread-348787-1-1.html
@yagami 你释放的只是图像精灵 图片数据一直存在cache里 除非手动清
RPG::Cache.clear
我用rgss1转rgss3脚本后,跑地图内存能上到400MB,之后一下子释放到100MB, 因此卡住1秒,用了这句就能释放,清除频繁一点可以不用一下子清那么多就不用卡
在短时间之间释放,就能解决一次性释放太大内存导致之卡顿(对不会自动释放导致大内存的工程来说作用大)
*用rgss1转rgss3脚本  指这个RPGMaker XP Ace (RMXP+RGSS3+可調分辨率)  请勿使用多BUG
每隔一会主动使用该句,可以清理缓存
此句在F1帮助中有提及到
[/fold]
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部