Project1

标题: 设置120帧率后为何实际帧率只有20 [打印本页]

作者: qq634488405    时间: 2022-10-2 21:19
标题: 设置120帧率后为何实际帧率只有20
脚本中用Graphics.frame_rate=120后,实际帧率只有20,尝试设置为80则实际只有10...而将Graphics.frame_rate=120注释掉之后,保持默认帧率,反而帧率稳定在40左右。。
工程地址https://rpg.blue/thread-327759-1-1.html
主要是该工程的Scene_Study
但是Scene_FP,Scene_MP,Scene_Practice都有和Scene_Study类似的进度条,但这三个都可以达到120帧。
我尝试去掉部分判断,减少随机数,减少if嵌套。。。但是似乎没什么效果。
下面是修改后的脚本,仍然只有20帧,有无大佬指点一下,万分感谢~~
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Scene_Study
  3. #------------------------------------------------------------------------------
  4. #  处理请教画面的类。
  5. #==============================================================================
  6.  
  7. class Scene_Study
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #    id   -- 师傅ID
  11.   #    type -- 师傅类型,0表示NPC,1表示秘籍,2表示夫妻传授
  12.   #--------------------------------------------------------------------------
  13.   def initialize(id, type = 0)
  14.     @id = id
  15.     @type = type
  16.     @actor = $game_actor
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 主处理
  20.   #--------------------------------------------------------------------------
  21.   def main
  22.     @screen = Spriteset_Map.new
  23.     # 生成对话窗口
  24.     @talk_window = Window_Help.new(480,160)
  25.     @talk_window.visible,@talk_window.x = false,80
  26.     @talk_window.y,@talk_window.z = 304,500
  27.     # 生成询问窗口
  28.     @confirm_window=Window_Command.new(240,$data_system.confirm_choice,2,3)
  29.     @confirm_window.visible,@confirm_window.active = false,false
  30.     @confirm_window.x,@confirm_window.y = 200,416
  31.     @confirm_window.z = 600
  32.     # 获取请教列表
  33.     if @type == 2
  34.       @skill_list = @actor.couple_kf_list
  35.     else
  36.       teacher = @type == 1 ? $data_items[@id] : $data_enemies[@id]
  37.       @skill_list = teacher.skill_list
  38.     end
  39.     # 显示文本提示
  40.     if @type != 1
  41.       @top_window = Window_Base.new(0, 0, 640, 64)
  42.       @top_window.contents.draw_text(4, 0, 256, 32, $data_text.learn_what)
  43.     end
  44.     @list = []
  45.     # 生成功夫命令列表
  46.     @skill_list.each do |i|
  47.       kf_id,kf_lv = i[0],i[1]
  48.       kf_name = $data_kungfus[kf_id].name
  49.       t_size = kf_name.size / 3
  50.       command = kf_name + "  "*(5-t_size)
  51.       command += " " if kf_lv < 100
  52.       command += "×" + kf_lv.to_s
  53.       @list.push(command)
  54.     end
  55.     # 生成请教窗口
  56.     @skill_window = Window_Command.new(272,@list,1,3,1,0,8,64,224)
  57.     # 生成进度条背景窗口
  58.     @learn = Window_Base.new(160,10,352,64)
  59.     @learn.z = 600
  60.     @learn.visible = false
  61.     @phase = 1
  62.     # 执行过度
  63.     Graphics.transition
  64.     # 主循环
  65.     loop do
  66.       $scene=Scene_Map.new if @skill_list.size == 0
  67.       # 刷新游戏画面
  68.       Graphics.update
  69.       # 刷新输入信息
  70.       Input.update
  71.       # 刷新信息
  72.       update
  73.       # 如果画面切换就中断循环
  74.       if $scene != self
  75.         break
  76.       end
  77.     end
  78.     # 准备过渡
  79.     Graphics.freeze
  80.     $eat_flag = true
  81.     # 释放窗口
  82.     @top_window.dispose if @top_window !=nil
  83.     @skill_window.dispose
  84.     @confirm_window.dispose
  85.     @talk_window.dispose
  86.     @learn.dispose
  87.     @screen.dispose
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 刷新信息
  91.   #--------------------------------------------------------------------------
  92.   def update
  93.     @skill_window.update
  94.     @confirm_window.update
  95.     @top_window.update if @top_window != nil
  96.     @talk_window.update
  97.     @learn.update
  98.     case @phase
  99.     when 1
  100.       update_study
  101.     when 2
  102.       $eat_flag = false
  103.       study(@list_id)
  104.     when 3
  105.       $eat_flag = true
  106.       update_confirm
  107.     end
  108.     @screen.update
  109.   end
  110.   #--------------------------------------------------------------------------
  111.   # ● 刷新学习画面
  112.   #--------------------------------------------------------------------------
  113.   def update_study
  114.     # 按下 B 键的情况下
  115.     if Input.trigger?(Input::B)
  116.       # 播放取消SE
  117.       $game_system.se_play($data_system.cancel_se)
  118.       $scene = Scene_Map.new
  119.     end
  120.     # 按下 C 键的情况下
  121.     if Input.trigger?(Input::C)
  122.       # 演奏确定 SE
  123.       $game_system.se_play($data_system.decision_se)
  124.       @skill_window.active=false
  125.       kf = @skill_list[@skill_window.index]
  126.       kf_id,@max_lv = kf[0],kf[1]
  127.       @max_lv = [@max_lv,255].min
  128.       @list_id = @actor.get_kf_index(kf_id)
  129.       # 检查是否能学习
  130.       return unless check_kf_lv_exp
  131.       # 检查功夫列表是否已满且未学会该武功
  132.       if @actor.full_kf_list? and @actor.get_kf_level(kf_id) == 0
  133.         # 播放冻结SE
  134.         $game_system.se_play($data_system.buzzer_se)
  135.         return
  136.       end
  137.       if @list_id == -1 # 功夫未学
  138.         @actor.skill_list.push([kf_id,0,0,0])
  139.         @list_id = @actor.get_kf_index(kf_id)
  140.       end
  141.       @top_window.visible = false if @top_window != nil
  142.       @phase = 2
  143.     end
  144.   end
  145.   #--------------------------------------------------------------------------
  146.   # ● 刷新画面
  147.   #--------------------------------------------------------------------------
  148.   def update_confirm
  149.     # 调整速度
  150.     Graphics.frame_rate = 40
  151.     # 按下 B 键的情况下
  152.     if Input.trigger?(Input::B)
  153.       # 播放取消SE
  154.       $game_system.se_play($data_system.cancel_se)
  155.       stop_learn
  156.       return
  157.     end
  158.     # 按下 C 键的情况下
  159.     if Input.trigger?(Input::C)
  160.       # 演奏确定 SE
  161.       $game_system.se_play($data_system.decision_se)
  162.       case @confirm_window.index
  163.       when 0 # 继续
  164.         @confirm_window.active=false
  165.         @talk_window.visible = false
  166.         @confirm_window.visible = false
  167.         # 检查是否能学习
  168.         return unless check_kf_lv_exp
  169.         @phase = 2
  170.       when 1 # 取消继续学习
  171.         stop_learn
  172.       end
  173.     end
  174.   end
  175.   #--------------------------------------------------------------------------
  176.   # ● 描绘出错信息
  177.   #--------------------------------------------------------------------------
  178.   def draw_error(text,time=Graphics.frame_rate)
  179.     @talk_window.auto_text(text.dup)
  180.     @talk_window.visible=true
  181.     # 显示延时
  182.     for i in 1..time
  183.       # 刷新画面
  184.       Graphics.update
  185.     end
  186.     @talk_window.visible=false
  187.   end
  188.   #--------------------------------------------------------------------------
  189.   # ● 获取读书识字的学费
  190.   #--------------------------------------------------------------------------
  191.   def study_gold(lv)
  192.     return 5 if lv<=20
  193.     return 10 if lv<=30
  194.     return 50 if lv<=60
  195.     return 150 if lv<=80
  196.     return 300 if lv<=100
  197.     return 500 if lv<=120
  198.     return 1000
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 检查技能等级及经验
  202.   #--------------------------------------------------------------------------
  203.   def check_kf_lv_exp
  204.     kf_id = @actor.skill_list[@list_id][0]
  205.     now_lv = @actor.skill_list[@list_id][1]
  206.     # 技能等级高于师父或已满级
  207.     if now_lv > @max_lv or now_lv == 255
  208.       t_id = @type # 师父及秘籍
  209.       if @type == 2 # 夫妻请教
  210.         case @actor.gender
  211.         when 0,1
  212.           t_id = @actor.gender + 2
  213.         when 2
  214.           t_id = @actor.marry % 2 + 2
  215.         end
  216.       end
  217.       draw_error($data_text.no_learn[t_id])
  218.       stop_learn
  219.       return false
  220.     end
  221.     # 检查经验是否充足
  222.     unless @actor.check_kf_exp(kf_id)
  223.       draw_error($data_text.learn_no_exp)
  224.       stop_learn
  225.       return false
  226.     end
  227.     return true
  228.   end
  229.   #--------------------------------------------------------------------------
  230.   # ● 学习技能
  231.   #--------------------------------------------------------------------------
  232.   def study(id)
  233.     # 按下 B 键的情况
  234.     if Input.trigger?(Input::B)
  235.       stop_learn
  236.       return
  237.     end
  238.     # 调整速度
  239.     Graphics.frame_rate = 120
  240.     now_lv = @actor.skill_list[id][1]
  241.     kf_id = @actor.skill_list[id][0]
  242.     point_max = (now_lv+1)**2
  243.     # 判断潜能是否为0
  244.     if @actor.pot == 0
  245.       draw_error($data_text.learn_no_pot)
  246.       stop_learn
  247.       return
  248.     end
  249.     @actor.pot -= 1
  250.     speed = (@actor.int/2 + rand(@actor.int))/2 + rand(@actor.luck/5)
  251.     @actor.skill_list[id][2] += speed
  252.     # 学习的技能是读书识字
  253.     if kf_id == 11
  254.       gold = study_gold(now_lv)
  255.       # 判断学费
  256.       if @actor.gold >= gold
  257.         @actor.lose_gold(gold)
  258.       else # 学费不足,复原潜能及学习点数
  259.         @actor.pot += 1
  260.         @actor.skill_list[id][2] -= speed
  261.         draw_error($data_text.learn_no_gold)
  262.         stop_learn
  263.         return
  264.       end
  265.     end
  266.     process=[200*@actor.skill_list[id][2]/point_max,200].min
  267.     # 描绘学习进度条
  268.     @learn.visible = true
  269.     draw_process(process,@actor.skill_list[id][2],now_lv)
  270.     # 学习点数大于升级点数
  271.     if @actor.skill_list[id][2] >= point_max
  272.       @actor.skill_list[id][2] = 0
  273.       @actor.skill_list[id][1] += 1
  274.       # 你的功夫进步了
  275.       draw_error($data_text.sk_lv_up)
  276.       @learn.visible = false
  277.       text = $data_text.continue_learn.dup
  278.       @talk_window.auto_text(text)
  279.       @talk_window.visible = true
  280.       @confirm_window.visible = true
  281.       @confirm_window.active = true
  282.       @skill_window.active=false
  283.       @phase = 3
  284.       return
  285.     end
  286.   end
  287.   #--------------------------------------------------------------------------
  288.   # ● 描绘学习进度
  289.   #--------------------------------------------------------------------------
  290.   def draw_process(process,kf_point,kf_lv)
  291.     # 根据显示内容调整宽度
  292.     text = kf_point.to_s + "/" + kf_lv.to_s
  293.     @learn.width = 248 + text.size * 12
  294.     @learn.contents = Bitmap.new(@learn.width - 32,@learn.height - 32)
  295.     color = @learn.normal_color
  296.     @learn.contents.font.color = color
  297.     @learn.contents.clear
  298.     # 边框
  299.     @learn.contents.fill_rect(5,9,200,1,color)
  300.     @learn.contents.fill_rect(5,24,200,1,color)
  301.     @learn.contents.fill_rect(5,9,1,15,color)
  302.     @learn.contents.fill_rect(205,9,1,16,color)
  303.     # 进度条
  304.     @learn.contents.fill_rect(5,9,process,15,color)
  305.     # 点数/等级
  306.     @learn.contents.draw_text(216,0,@learn.width-248,32,text)
  307.   end
  308.   #--------------------------------------------------------------------------
  309.   # ● 停止学习
  310.   #--------------------------------------------------------------------------
  311.   def stop_learn
  312.     @skill_window.active=true
  313.     @confirm_window.active=false
  314.     @talk_window.visible = false
  315.     @learn.visible = false
  316.     @top_window.visible = true if @top_window != nil
  317.     @confirm_window.visible = false
  318.     @confirm_window.index = 0
  319.     # 恢复帧率
  320.     Graphics.frame_rate = 40
  321.     @phase = 1
  322.   end
  323. end

作者: guoxiaomi    时间: 2022-10-2 23:49
没看出来有什么特别要注意的。再仔细统计一下每帧draw_text的调用次数吧。顺便我下载了这个游戏,但是不知道怎么进入Scene_Study。。。
作者: qq634488405    时间: 2022-10-3 20:25
guoxiaomi 发表于 2022-10-2 23:49
没看出来有什么特别要注意的。再仔细统计一下每帧draw_text的调用次数吧。顺便我下载了这个游戏,但是不知 ...

找npc拜师请教就会进入scene_study, 是scene_fp, scene_mp和这个类似的,进度条的时候draw_text一样的。区别是study多了些判断和随机,fp, mp都能120帧,这个反而默认40帧最稳定




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1