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

Project1

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

[已经过期] 请问XP有无防卡脚本

[复制链接]

Lv5.捕梦者 (版主)

梦石
20
星屑
1840
在线时间
6925 小时
注册时间
2012-12-14
帖子
11485

短篇十战斗者组别冠军开拓者贵宾短篇九勇士组亚军

跳转到指定楼层
1
发表于 2013-1-16 08:30:03 手机端发表。 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 美丽晨露 于 2013-1-21 19:12 编辑

全动画战斗弄得画面一卡一卡的,很不舒服。有无防卡脚本可以缓解一下卡帧的问题

点评

奇怪了···这些防卡脚本不是主站很早就有了吗  发表于 2013-6-21 11:16

Lv4.逐梦者

梦石
0
星屑
19854
在线时间
3121 小时
注册时间
2013-1-11
帖子
1295
2
发表于 2013-1-16 09:15:37 | 只看该作者
#===============================================================================
# Class Antilag Settings
#-------------------------------------------------------------------------------
# 防止事件过多卡机脚本
# 设置CPU线程
#===============================================================================
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 = 70
    #这个是控制优先级。
    @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, 0x00000080) # 高质量
      # 设置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, 60].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
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  角色显示用脚本。监视 Game_Character 类的实例、
# 自动变化脚本状态。
#==============================================================================
class Sprite_Character < RPG::Sprite
  #-----------------------------------------------------------------------------
  # ● 更新画面
  #-----------------------------------------------------------------------------
  alias f0tzis_anti_lag_sprite_char_update update
  def update
    return if @character.is_a?(Game_Event) and not @character.in_range?
    f0tzis_anti_lag_sprite_char_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
      end
      if @panorama_name != ""
        @panorama.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
      end
      if @fog_name != ""
        @fog.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
    # 刷新远景平面
    @panorama.ox = $game_map.display_x / 4
    @panorama.oy = $game_map.display_y / 4
    # 刷新雾平面
    @fog.zoom_x = $game_map.fog_zoom / 100.0
    @fog.zoom_y = $game_map.fog_zoom / 100.0
    @fog.opacity = $game_map.fog_opacity
    @fog.blend_type = $game_map.fog_blend_type
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog.tone = $game_map.fog_tone
    # 刷新角色活动块
    for sprite in @character_sprites
      if in_range?(sprite.character)
        sprite.update
      end
    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
    # 设置画面的闪烁色
    @viewport3.color = $game_screen.flash_color
    # 刷新显示端口
    @viewport1.update
    @viewport3.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 or @list[@index+1].code == 355
        # 添加到 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 = 85                              
$antilag.cpu_tolerance = 20      
$antilag.high_priority = true   
$antilag.event = true
#自动回滚标准
if $antilag.max_cpu_utilization>=100
  $antilag.max_cpu_utilization=85
end    # 分歧结束。

点评

这是事件防卡,不是动画防卡  发表于 2013-1-16 19:30
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
20
星屑
1840
在线时间
6925 小时
注册时间
2012-12-14
帖子
11485

短篇十战斗者组别冠军开拓者贵宾短篇九勇士组亚军

3
 楼主| 发表于 2013-1-16 19:59:02 | 只看该作者
没有人能解决这个问题么?
大家好,这里是晨露的说。请多多指教。
刚入门RM软件制作,请大家多多帮助我哦。
落雪君的欢乐像素教程,欢迎查阅。

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
47
在线时间
976 小时
注册时间
2011-4-30
帖子
860
4
发表于 2013-1-17 19:53:49 | 只看该作者
在我看来全动画战斗的设计理念上就错了。

假设我一个人物动画,大小100x100像素,20帧,我建立个精灵刷新,也就占用1份内存,全动画战斗一个动作192x192,20个动作放在一个图片里,一套动作就等于重复在刷

960x768的图片,敌方加己方最多12个人物,不卡才怪了。

你要怕卡就别用“全动画”这个脚本。
湿滑落式骑!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-12-28 22:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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