赞 | 1 |
VIP | 116 |
好人卡 | 40 |
积分 | 4 |
经验 | 19804 |
最后登录 | 2017-12-13 |
在线时间 | 4175 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 432
- 在线时间
- 4175 小时
- 注册时间
- 2010-6-26
- 帖子
- 6474
|
发表于 2011-3-16 14:47:08
|
显示全部楼层
不是马甲,希望您能积极把脚本好好弄弄
本帖最后由 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似乎不太好使- =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 # 分歧结束。
复制代码 为了从根本上防止卡屏,您使用此模板如果没有自动执行和并行处理的事件,一个地图最多容纳45个,如果有并行处理事件,那一个地图不能超过30个。 |
|