| 
 
| 赞 | 1 |  
| VIP | 116 |  
| 好人卡 | 40 |  
| 积分 | 4 |  
| 经验 | 19804 |  
| 最后登录 | 2017-12-13 |  
| 在线时间 | 4175 小时 |  
 Lv2.观梦者 
 
	梦石0 星屑432 在线时间4175 小时注册时间2010-6-26帖子6474 | 
不是马甲,希望您能积极把脚本好好弄弄
| 本帖最后由 eve592370698 于 2011-4-10 18:49 编辑 
 该作者目前上高中,要迎战高考,没办法。目前需要DX3D加速才行。
 我公布一下测试结果吧:
 测试地图:图块自己做的,事件60个,其中1个是带有自动消除事件的自动执行事件,还有1个事记录角色坐标及设置背景音乐、场所移动的并行处理事件。
 台式机:
 CPU:AMD 速龙4200双核,1G内存,Nvidia独立显卡512M,操作系统XP,桌面分辨率1280×1024,32位真彩色当您设置的图块优先级比较复杂的时候,人物行走特别卡。打开任务管理器,CPU使用率40%,内存占用64M左右。DX9测试正常。
 测试地图:《寻找神龙测试版》合并的王宫内部(图块139×133,开启记录角色坐标变量的并行事件时候超级卡),世界大地图(有航海和飞空脚本,动画效果欠佳)。FPS才15
 笔记本:
 CPU:Intel Core2 T5870,2G内存,显卡ATI M R HD4300显存1G,桌面分辨率1366×768,16位增强色测试如上地图:
 XP事儿流畅,时而迟钝,FPS能达到25
 windows7略比XP好一点点。但游戏时间长了也会卡屏。
 
 目前找到了一个RGE系统的800×600,但是因为使用的脚本不用,所以不支持外来脚本
 http://rpg.blue/forum.php?mod=vi ... 1&highlight=rge
 
 补充一下,我找到了个卡屏的解决方法,请看此脚本,从CPU提速和防卡经过加工处理过来的:
 不能照搬的原脚本位置
 http://rpg.blue/forum.php?mod=vi ... =%E5%8A%A0%E9%80%9F
 还有,就是这个脚本跟您的CPU、驱动及系统设置有关系,经测试,AMD的CPU似乎不太好使
 为了从根本上防止卡屏,您使用此模板如果没有自动执行和并行处理的事件,一个地图最多容纳45个,如果有并行处理事件,那一个地图不能超过30个。复制代码=begin
★首先,请不要在单核CPU,低于768M内存的电脑上上使用此脚本!否则死机概不负责
☆其次,请不要使用该脚本和后台运行加以改造来无限占用系统资源,否则会引起死机!
  做这个脚本目的是在您的CPU允许的情况下,当您的一个地图设置事件过多而卡机时
通过适当提高CPU使用率来阻止卡机的发生。请注意:
  该脚本针对的是800×600等扩展分辨率的脚本设计的,因为一个地图超过30个事件
时,使用扩展分辨率脚本就会出现卡机状况,为了能够像过去那样使用故添加此项。刚切
换到容易卡机的地图时需要几秒钟的事件等待系统反应过来,所以不要太着急!但是使用
加速也未必能像正常运行那样达到40FPS,也就是增加10个FPS,例如不加入此脚本位20
FPS的,加入此脚本也就能达到25~35FPS。  
 设置CPU线程
=end
class Antilag_Settings
  
  attr_accessor :event
  attr_accessor :max_cpu_utilization
  attr_accessor :cpu_tolerance
  # 初始化对象
  #-----------------------------------------------------------------------------
  def initialize
    @event = true
    @high_priority = true
    @max_cpu_utilization = 60
    #这个是控制优先级。
    @cpu_tolerance = 20
    @SetPriorityClass = Win32API.new('kernel32', 'SetPriorityClass', 
                                     ['p', 'i'], 'i')
    @GetProcessTimes = Win32API.new('kernel32', 'GetProcessTimes', 
                                    ['i','p','p','p','p'], 'i')
  end
  # 更改优先级 on(true)/off(false)
  #-----------------------------------------------------------------------------
  def high_priority=(value)
    @high_priority = value
    if @high_priority
      @SetPriorityClass.call(-1, 0x00000060) # 高质量
      # 设置CPU优先级80为高。110为实时。20为标准。
    else
      @SetPriorityClass.call(-1, 0x00000020) # 标准优先
    end
  end
  #-----------------------------------------------------------------------------
  # 返回现在的CPU使用率
  #-----------------------------------------------------------------------------
  def get_cpu_utilization
    # 使用API获取内核用户调用时间
    creation_time = '0' * 10
    exit_time = '0' * 10
    kernel_time = '0' * 10
    user_time = '0' * 10
    @GetProcessTimes.call(-1, creation_time, exit_time, kernel_time, user_time)
    kernel_time = kernel_time.unpack('l2')
    user_time = user_time.unpack('l2')
    kernel_time = kernel_time[0] + kernel_time[1]
    user_time = user_time[0] + user_time[1]
    # 计算不同的CPU使用率
    if @old_time != nil
      timer_difference = Time.new - @old_timer
      time_difference = kernel_time + user_time - @old_time
      result = time_difference / timer_difference / 100000
    else
      result = $antilag.max_cpu_utilization
    end
    # 节约CPU使用(还是计算)
    @old_timer = Time.new
    @old_time = kernel_time + user_time
    return result
  end
end
$antilag = Antilag_Settings.new
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  处理地图画面的类。
#==============================================================================
class Scene_Map
  #-----------------------------------------------------------------------------
  # 刷新模块, 增加平滑帧数
  #-----------------------------------------------------------------------------
  alias f0tzis_anti_lag_scene_map_update update
  def update
    f0tzis_anti_lag_scene_map_update
    if Graphics.frame_count % 20 == 0 and $antilag.max_cpu_utilization <= 100
      # 计算CPU最大限度利用和当前的利用率
      abs = $antilag.max_cpu_utilization - $antilag.get_cpu_utilization
      # 如果改变帧速率的差异
      if abs.abs >= $antilag.max_cpu_utilization * $antilag.cpu_tolerance/100.0
        Graphics.frame_rate = [[10, Graphics.frame_rate + abs / 2].max, 40].min
      end
    end
  end
end
#==============================================================================
# Game_Event Class
# 处理事件
#===============================================================================
class Game_Event
  # 这里不需要理会
  def in_range?
        
    # 如果TRUE 返回一个虚拟的事件
    # 自动启动/并行处理事件或者一个空的事件
    if not $antilag.event or (@trigger == 3 or @trigger == 4 or 
    (@list != nil and @list[0].code == 108 and @list[0].parameters == ['']))
      return true
    end
          
    screne_x = $game_map.display_x
    screne_x -= 256
    screne_y = $game_map.display_y
    screne_y -= 256
    screne_width = $game_map.display_x
    screne_width += 2816
    screne_height = $game_map.display_y
    screne_height += 2176
    
    return false if @real_x <= screne_x
    return false if @real_x >= screne_width
    return false if @real_y <= screne_y
    return false if @real_y >= screne_height
    return true
            
  end
  #-----------------------------------------------------------------------------
  # ● 更新画面
  #-----------------------------------------------------------------------------
  alias f0tzis_anti_lag_game_event_update update
  def update
    return if not self.in_range?      
    f0tzis_anti_lag_game_event_update
  end
  
end
#===============================================================================
# ■ Game_Map
#
# 处理地图的类。包含卷动以及可以通行的判断功能。
#===============================================================================
class Game_Map
  def update
    # 还原必要的地图
    if $game_map.need_refresh
      refresh
    end
     # 滚动中的情况下
    if @scroll_rest > 0
      # 滚动速度变化为地图坐标系的距离
      distance = 2 ** @scroll_speed
      # 执行滚动
      case @scroll_direction
      when 2    # 下  
        scroll_down(distance)
      when 4    # 左  
        scroll_left(distance)
      when 6    # 右
        scroll_right(distance)
      when 8    # 上
        scroll_up(distance)
      end
      # 滚动距离的减法运算
      @scroll_rest -= distance
    end
    # 更新地图事件
    for event in @events.values
      if in_range?(event) or event.trigger == 3 or event.trigger == 4
        event.update
      end
    end
    # 更新公共事件
    for common_event in @common_events.values
      common_event.update
    end
    # 处理雾的滚动
    @fog_ox -= @fog_sx / 8.0
    @fog_oy -= @fog_sy / 8.0
    # 处理雾的色调变更
    if @fog_tone_duration >= 1
      d = @fog_tone_duration
      target = @fog_tone_target
      @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
      @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
      @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
      @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
      @fog_tone_duration -= 1
    end
    # 处理雾的不透明度变更
    if @fog_opacity_duration >= 1
      d = @fog_opacity_duration
      @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
      @fog_opacity_duration -= 1
    end
  end
  def in_range?(object)
    diff_x = ($game_map.display_x - object.real_x).abs  # 绝对值
    diff_y = ($game_map.display_x - object.real_x).abs  # 绝对值
    width = 128 * 24   # size * tiles
    height = 128 * 19  # size * tiles
    return !((diff_x > width) or (diff_y > height))
  end
end
#===============================================================================
#  ■ Spriteset_Map
#
#  处理地图画面活动块和元件的类。
#===============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 远景与现在的情况有差异发情况下
    if @panorama_name != $game_map.panorama_name or  @panorama_hue != $game_map.panorama_hue
      @panorama_name = $game_map.panorama_name
      @panorama_hue = $game_map.panorama_hue
      if @panorama.bitmap != nil
        @panorama.bitmap.dispose
        @panorama.bitmap = nil
        @panorama2.bitmap.dispose
        @panorama2.bitmap = nil
        @panorama3.bitmap.dispose
        @panorama3.bitmap = nil
        @panorama4.bitmap.dispose
        @panorama4.bitmap = nil
      end
      if @panorama_name != ""
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama2.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama3.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama4.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
      end
      Graphics.frame_reset
    end
    # 雾与现在的情况有差异的情况下
    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
      @fog_name = $game_map.fog_name
      @fog_hue = $game_map.fog_hue
    if @fog.bitmap != nil
      @fog.bitmap.dispose
      @fog.bitmap = nil
      @fog2.bitmap.dispose
      @fog2.bitmap = nil
      @fog3.bitmap.dispose
      @fog3.bitmap = nil
      @fog4.bitmap.dispose
      @fog4.bitmap = nil
    end
    if @fog_name != ""
      @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog2.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog3.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog4.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
    end
      Graphics.frame_reset
    end
    # 刷新元件地图
    @tilemap.ox = $game_map.display_x / 4
    @tilemap.oy = $game_map.display_y / 4
    @tilemap.update
    @tilemap2.ox = @tilemap.ox
    @tilemap2.oy = @tilemap.oy
    @tilemap2.update
    @tilemap3.ox = @tilemap.ox
    @tilemap3.oy = @tilemap.oy + 480
    @tilemap3.update
    @tilemap4.ox = @tilemap.ox
    @tilemap4.oy = @tilemap.oy + 480
    @tilemap4.update
    # 刷新远景平面
    @panorama.ox = $game_map.display_x / 8
    @panorama.oy = $game_map.display_y / 8
    @panorama2.ox = @panorama.ox
    @panorama2.oy = @panorama.oy
    @panorama3.ox = @panorama.ox 
    @panorama3.oy = @panorama.oy + 480
    @panorama4.ox = @panorama.ox
    @panorama4.oy = @panorama.oy + 480
    # 刷新雾平面
    @[email protected][email protected][email protected]_x = $game_map.fog_zoom / 100.0
    @[email protected][email protected][email protected]_y = $game_map.fog_zoom / 100.0
    @[email protected][email protected][email protected] = $game_map.fog_opacity
    @[email protected][email protected][email protected]_type = $game_map.fog_blend_type
    @fog4.tone = @fog3.tone = @fog2.tone = @fog.tone = $game_map.fog_tone
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog2.ox = @fog.ox #+ 140#*@fog.zoom_x
    @fog2.oy = @fog.oy
    @fog3.ox = @fog.ox
    @fog3.oy = @fog.oy + 480
    @fog4.ox = @fog.ox 
    @fog4.oy = @fog.oy + 480
    # 刷新角色活动块
    for sprite in @character_sprites
      sprite.update
    end
    # 刷新天候图形
    @weather.type = $game_screen.weather_type
    @weather.max = $game_screen.weather_max
    @weather.ox = $game_map.display_x / 4
    @weather.oy = $game_map.display_y / 4
    @weather.update  
    # 刷新图片
    for sprite in @picture_sprites
      sprite.update
    end
    # 刷新计时器块
    @timer_sprite.update
    # 设置画面的色调与震动位置
    $viewport1.tone = $game_screen.tone
    $viewport1.ox = $game_screen.shake
    $viewport4.tone = $game_screen.tone
    $viewport4.ox = $game_screen.shake+640
    $viewport5.tone = $game_screen.tone
    $viewport5.ox = $game_screen.shake  
    $viewport6.tone = $game_screen.tone
    $viewport6.ox = $game_screen.shake+640
    # 设置画面的闪烁色
    @viewport3.color = $game_screen.flash_color
    # 刷新显示端口
    $viewport1.update
    @viewport3.update
    $viewport4.update
    $viewport5.update
    $viewport6.update
  end
  def in_range?(object)
    diff_x = ($game_player.real_x - object.real_x).abs  # 绝对值
    diff_y = ($game_player.real_y - object.real_y).abs  # 绝对值
    width = 128 * 24   # size * tiles
    height = 128 * 19  # size * tiles
    return !((diff_x > width) or (diff_y > height))
  end
end
#===============================================================================
# ■ Interpreter
#
# 执行事件命令的解释器
#===============================================================================
class Interpreter
  #-----------------------------------------------------------------------------
  # * 脚本
  #-----------------------------------------------------------------------------
  def command_355
    # script 设置第一行
    script = @list[@index].parameters[0] + "\n"
    # 循环
    loop do
      # 下一个事件指令在脚本 2 行以上的情况下
      if @list[@index+1].code == 655
        # 添加到 script 2 行以后
        script += @list[@index+1].parameters[0] + "\n"
      # 事件指令不在脚本 2 行以上的情况下
      else
        # 中断循环
        break
      end
      # 推进索引
      @index += 1
    end
    # 评价
    result = eval(script)
    #---------------------------------------------------------------------------
    # 返回值为 false 的情况下 
    # NEW: the last word of the code mustnt be false!
    #---------------------------------------------------------------------------
    if result == false and script[script.length-6..script.length-2] != 'false'
      # 结束
      return false
    end
    # 继续
    return true
  end
end
#咳咳少了几行代码
$antilag.max_cpu_utilization = 75                              
$antilag.cpu_tolerance = 20      
$antilag.high_priority = true    
$antilag.event = true
#自动回滚标准
if $antilag.max_cpu_utilization>=100
       $antilag.max_cpu_utilization=70
end                 # 分歧结束。  
 | 
 |