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

Project1

 找回密码
 注册会员
搜索
查看: 1440|回复: 0
打印 上一主题 下一主题

[已经过期] 关于 CPU 提速脚本的讨论!

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
207 小时
注册时间
2014-8-16
帖子
132
跳转到指定楼层
1
发表于 2015-5-30 22:17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 a107480098 于 2015-5-30 22:20 编辑

游戏里我用到了双远景脚本,是不是在 CPU 提速脚本的■ Game_Map类里的“刷新画面”也要改动成和双远景脚本里的■ Game_Map类里的“刷新画面”一致?

附上未改动的CPU 提速脚本:

RUBY 代码复制
  1. #===============================================================================
  2. # ** CPU speed Script
  3. #
  4. # by Goldencolor V1.0
  5. # 2009.10.19
  6. #前言:今天刚学了Java线程。然后就有个想法。RGSS如果加入线程速度可能会更快。事件也加速#的
  7. #用这个脚本可以提速。如果在用提帧数差不多可以到。邪恶 -_-!可以到150帧左右
  8. #找啊找啊找= =b找到了。由于最近比较忙~没有时间发。
  9. #注意:不要乱该。。这个关系RPGXP抢CPU的速度(线程)
  10. #===============================================================================
  11. # Class Antilag Settings
  12. #-------------------------------------------------------------------------------
  13. # 设置CPU线程
  14. #===============================================================================
  15. class Antilag_Settings
  16.  
  17.   attr_accessor :event
  18.   attr_accessor :max_cpu_utilization
  19.   attr_accessor :cpu_tolerance
  20.   #-----------------------------------------------------------------------------
  21.   # 初始化对象
  22.   #-----------------------------------------------------------------------------
  23.   def initialize
  24.     @event = true
  25.     @high_priority = true
  26.     @max_cpu_utilization = 70
  27.     #这个是控制优先级。
  28.     @cpu_tolerance = 20
  29.     @SetPriorityClass = Win32API.new('kernel32', 'SetPriorityClass',
  30.                                      ['p', 'i'], 'i')
  31.     @GetProcessTimes = Win32API.new('kernel32', 'GetProcessTimes',
  32.                                     ['i','p','p','p','p'], 'i')
  33.   end
  34.   #-----------------------------------------------------------------------------
  35.   # 更改优先级 on(true)/off(false)
  36.   #-----------------------------------------------------------------------------
  37.   def high_priority=(value)
  38.     @high_priority = value
  39.  
  40.     if @high_priority
  41.       @SetPriorityClass.call(-1, 0x00000080) # 高质量
  42.       # 设置CPU优先级80为高。110为实时。20为标准。
  43.     else
  44.       @SetPriorityClass.call(-1, 0x00000020) # 标准优先
  45.     end
  46.   end
  47.   #-----------------------------------------------------------------------------
  48.   # 返回现在的CPU使用率
  49.   #-----------------------------------------------------------------------------
  50.   def get_cpu_utilization
  51.     # 使用API获取内核用户调用时间
  52.     creation_time = '0' * 10
  53.     exit_time = '0' * 10
  54.     kernel_time = '0' * 10
  55.     user_time = '0' * 10
  56.     @GetProcessTimes.call(-1, creation_time, exit_time, kernel_time, user_time)
  57.     kernel_time = kernel_time.unpack('l2')
  58.     user_time = user_time.unpack('l2')
  59.     kernel_time = kernel_time[0] + kernel_time[1]
  60.     user_time = user_time[0] + user_time[1]
  61.     # 计算不同的CPU使用率
  62.     if @old_time != nil
  63.       timer_difference = Time.new - @old_timer
  64.       time_difference = kernel_time + user_time - @old_time
  65.       result = time_difference / timer_difference / 100000
  66.     else
  67.       result = $antilag.max_cpu_utilization
  68.     end
  69.     # 节约CPU使用(还是计算)
  70.     @old_timer = Time.new
  71.     @old_time = kernel_time + user_time
  72.     return result
  73.   end
  74. end
  75. $antilag = Antilag_Settings.new
  76. #==============================================================================
  77. # ■ Scene_Map
  78. #------------------------------------------------------------------------------
  79. #  处理地图画面的类。
  80. #==============================================================================
  81. class Scene_Map
  82.   #-----------------------------------------------------------------------------
  83.   # 刷新模块, 增加平滑帧数
  84.   #-----------------------------------------------------------------------------
  85.   alias f0tzis_anti_lag_scene_map_update update
  86.   def update
  87.     f0tzis_anti_lag_scene_map_update
  88.     if Graphics.frame_count % 20 == 0 and $antilag.max_cpu_utilization <= 100
  89.       # 计算CPU最大限度利用和当前的利用率
  90.       abs = $antilag.max_cpu_utilization - $antilag.get_cpu_utilization
  91.       # 如果改变帧速率的差异
  92.       if abs.abs >= $antilag.max_cpu_utilization * $antilag.cpu_tolerance/100.0
  93.         Graphics.frame_rate = [[10, Graphics.frame_rate + abs / 2].max, 40].min
  94.       end
  95.     end
  96.   end
  97. end
  98. #==============================================================================
  99. # Game_Event Class
  100. # 处理事件
  101. #===============================================================================
  102. class Game_Event
  103.   # 这里不需要理会
  104.   def in_range?
  105.  
  106.     # 如果TRUE 返回一个虚拟的事件
  107.     # 自动启动/并行处理事件或者一个空的事件
  108.     if not $antilag.event or (@trigger == 3 or @trigger == 4 or
  109.     (@list != nil and @list[0].code == 108 and @list[0].parameters == ['']))
  110.       return true
  111.     end
  112.  
  113.     screne_x = $game_map.display_x
  114.     screne_x -= 256
  115.     screne_y = $game_map.display_y
  116.     screne_y -= 256
  117.     screne_width = $game_map.display_x
  118.     screne_width += 2816
  119.     screne_height = $game_map.display_y
  120.     screne_height += 2176
  121.  
  122.     return false if @real_x <= screne_x
  123.     return false if @real_x >= screne_width
  124.     return false if @real_y <= screne_y
  125.     return false if @real_y >= screne_height
  126.     return true
  127.  
  128.   end
  129.   #-----------------------------------------------------------------------------
  130.   # ● 更新画面
  131.   #-----------------------------------------------------------------------------
  132.   alias f0tzis_anti_lag_game_event_update update
  133.   def update
  134.     return if not self.in_range?      
  135.     f0tzis_anti_lag_game_event_update
  136.   end
  137.  
  138. end
  139. #==============================================================================
  140. # ■ Sprite_Character
  141. #------------------------------------------------------------------------------
  142. #  角色显示用脚本。监视 Game_Character 类的实例、
  143. # 自动变化脚本状态。
  144. #==============================================================================
  145. class Sprite_Character < RPG::Sprite
  146.   #-----------------------------------------------------------------------------
  147.   # ● 更新画面
  148.   #-----------------------------------------------------------------------------
  149.   alias f0tzis_anti_lag_sprite_char_update update
  150.   def update
  151.     return if @character.is_a?(Game_Event) and not @character.in_range?
  152.     f0tzis_anti_lag_sprite_char_update
  153.   end
  154.  
  155. end
  156.  
  157. #===============================================================================
  158. # ■ Game_Map
  159. #
  160. # 处理地图的类。包含卷动以及可以通行的判断功能。
  161. #===============================================================================
  162. class Game_Map
  163.   def update
  164.     # 还原必要的地图
  165.     if $game_map.need_refresh
  166.       refresh
  167.     end
  168.      # 滚动中的情况下
  169.     if @scroll_rest > 0
  170.       # 滚动速度变化为地图坐标系的距离
  171.       distance = 2 ** @scroll_speed
  172.       # 执行滚动
  173.       case @scroll_direction
  174.       when 2    # 下  
  175.         scroll_down(distance)
  176.       when 4    # 左  
  177.         scroll_left(distance)
  178.       when 6    # 右
  179.         scroll_right(distance)
  180.       when 8    # 上
  181.         scroll_up(distance)
  182.       end
  183.       # 滚动距离的减法运算
  184.       @scroll_rest -= distance
  185.     end
  186.     # 更新地图事件
  187.     for event in @events.values
  188.       if in_range?(event) or event.trigger == 3 or event.trigger == 4
  189.         event.update
  190.       end
  191.     end
  192.     # 更新公共事件
  193.     for common_event in @common_events.values
  194.       common_event.update
  195.     end
  196.     # 处理雾的滚动
  197.     @fog_ox -= @fog_sx / 8.0
  198.     @fog_oy -= @fog_sy / 8.0
  199.     # 处理雾的色调变更
  200.     if @fog_tone_duration >= 1
  201.       d = @fog_tone_duration
  202.       target = @fog_tone_target
  203.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  204.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  205.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  206.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  207.       @fog_tone_duration -= 1
  208.     end
  209.     # 处理雾的不透明度变更
  210.     if @fog_opacity_duration >= 1
  211.       d = @fog_opacity_duration
  212.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  213.       @fog_opacity_duration -= 1
  214.     end
  215.   end
  216.   def in_range?(object)
  217.     diff_x = ($game_map.display_x - object.real_x).abs  # 绝对值
  218.     diff_y = ($game_map.display_x - object.real_x).abs  # 绝对值
  219.     width = 128 * 24   # size * tiles
  220.     height = 128 * 19  # size * tiles
  221.     return !((diff_x > width) or (diff_y > height))
  222.   end
  223. end
  224. #===============================================================================
  225. #  ■ Spriteset_Map
  226. #
  227. #  处理地图画面活动块和元件的类。
  228. #===============================================================================
  229. class Spriteset_Map
  230.   #--------------------------------------------------------------------------
  231.   # ● 刷新画面
  232.   #--------------------------------------------------------------------------
  233.   def update
  234.     # 远景与现在的情况有差异发情况下
  235.     if @panorama_name != $game_map.panorama_name or
  236.       @panorama_hue != $game_map.panorama_hue
  237.       @panorama_name = $game_map.panorama_name
  238.       @panorama_hue = $game_map.panorama_hue
  239.       if @panorama.bitmap != nil
  240.         @panorama.bitmap.dispose
  241.         @panorama.bitmap = nil
  242.       end
  243.       if @panorama_name != ""
  244.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  245.       end
  246.       Graphics.frame_reset
  247.     end
  248.     # 雾与现在的情况有差异的情况下
  249.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  250.       @fog_name = $game_map.fog_name
  251.       @fog_hue = $game_map.fog_hue
  252.       if @fog.bitmap != nil
  253.         @fog.bitmap.dispose
  254.         @fog.bitmap = nil
  255.       end
  256.       if @fog_name != ""
  257.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  258.       end
  259.       Graphics.frame_reset
  260.     end
  261.     # 刷新元件地图
  262.     @tilemap.ox = $game_map.display_x / 4
  263.     @tilemap.oy = $game_map.display_y / 4
  264.     @tilemap.update
  265.     # 刷新远景平面
  266.     @panorama.ox = $game_map.display_x / 8
  267.     @panorama.oy = $game_map.display_y / 8
  268.     # 刷新雾平面
  269.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  270.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  271.     @fog.opacity = $game_map.fog_opacity
  272.     @fog.blend_type = $game_map.fog_blend_type
  273.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  274.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  275.     @fog.tone = $game_map.fog_tone
  276.     # 刷新角色活动块
  277.     for sprite in @character_sprites
  278.       if in_range?(sprite.character)
  279.         sprite.update
  280.       end
  281.     end
  282.     # 刷新天候图形
  283.     @weather.type = $game_screen.weather_type
  284.     @weather.max = $game_screen.weather_max
  285.     @weather.ox = $game_map.display_x / 4
  286.     @weather.oy = $game_map.display_y / 4
  287.     @weather.update
  288.     # 刷新图片
  289.     for sprite in @picture_sprites
  290.       sprite.update
  291.     end
  292.     # 刷新计时器块
  293.     @timer_sprite.update
  294.     # 设置画面的色调与震动位置
  295.     @viewport1.tone = $game_screen.tone
  296.     @viewport1.ox = $game_screen.shake
  297.     # 设置画面的闪烁色
  298.     @viewport3.color = $game_screen.flash_color
  299.     # 刷新显示端口
  300.     @viewport1.update
  301.     @viewport3.update
  302.   end
  303.   def in_range?(object)
  304.     diff_x = ($game_player.real_x - object.real_x).abs  # 绝对值
  305.     diff_y = ($game_player.real_y - object.real_y).abs  # 绝对值
  306.     width = 128 * 24   # size * tiles
  307.     height = 128 * 19  # size * tiles
  308.     return !((diff_x > width) or (diff_y > height))
  309.   end
  310. end
  311. #===============================================================================
  312. # ■ Interpreter
  313. #
  314. # 执行事件命令的解释器
  315. #===============================================================================
  316. class Interpreter
  317.   #-----------------------------------------------------------------------------
  318.   # * 脚本
  319.   #-----------------------------------------------------------------------------
  320.   def command_355
  321.     # script 设置第一行
  322.     script = @list[@index].parameters[0] + "\n"
  323.     # 循环
  324.     loop do
  325.       # 下一个事件指令在脚本 2 行以上的情况下
  326.       if @list[@index+1].code == 655
  327.         # 添加到 script 2 行以后
  328.         script += @list[@index+1].parameters[0] + "\n"
  329.       # 事件指令不在脚本 2 行以上的情况下
  330.       else
  331.         # 中断循环
  332.         break
  333.       end
  334.       # 推进索引
  335.       @index += 1
  336.     end
  337.     # 评价
  338.     result = eval(script)
  339.     #---------------------------------------------------------------------------
  340.     # 返回值为 false 的情况下
  341.     # NEW: the last word of the code mustnt be false!
  342.     #---------------------------------------------------------------------------
  343.     if result == false and script[script.length-6..script.length-2] != 'false'
  344.       # 结束
  345.       return false
  346.     end
  347.     # 继续
  348.     return true
  349.   end
  350. end
  351. #咳咳少了几行代码
  352. $antilag.max_cpu_utilization = 75                              
  353. $antilag.cpu_tolerance = 20      
  354. $antilag.high_priority = true   
  355. $antilag.event = true
  356. #自动回滚标准
  357. if $antilag.max_cpu_utilization>=100
  358.        $antilag.max_cpu_utilization=70
  359. end                 # 分歧结束。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-26 03:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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