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

Project1

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

[讨论] CPU 提速脚本(推荐RMXP加速脚本)

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
215
在线时间
10 小时
注册时间
2009-7-25
帖子
656
跳转到指定楼层
1
发表于 2009-10-27 08:09:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Goldencolor 于 2009-11-1 11:06 编辑

如果有问题请论坛留言。计算部分来自德国www.rpgxp.org
申明:有大概几十行代码转载自国外。。其他原创
由于大多朋友都不知道什么是线程,所以解释一下线程
  线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。
  线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
  线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU
  线程的周期
  新建 就绪 运行 阻塞 死亡
  线程调度与优先级
  有线程进入了就绪状态,需要有线程调度程序来决定何时执行,根据优先级来调度.

  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.     if @high_priority
  40.       @SetPriorityClass.call(-1, 0x00000080) # 高质量
  41.       # 设置CPU优先级80为高。110为实时。20为标准。
  42.     else
  43.       @SetPriorityClass.call(-1, 0x00000020) # 标准优先
  44.     end
  45.   end
  46.   #-----------------------------------------------------------------------------
  47.   # 返回现在的CPU使用率
  48.   #-----------------------------------------------------------------------------
  49.   def get_cpu_utilization
  50.     # 使用API获取内核用户调用时间
  51.     creation_time = '0' * 10
  52.     exit_time = '0' * 10
  53.     kernel_time = '0' * 10
  54.     user_time = '0' * 10
  55.     @GetProcessTimes.call(-1, creation_time, exit_time, kernel_time, user_time)
  56.     kernel_time = kernel_time.unpack('l2')
  57.     user_time = user_time.unpack('l2')
  58.     kernel_time = kernel_time[0] + kernel_time[1]
  59.     user_time = user_time[0] + user_time[1]
  60.     # 计算不同的CPU使用率
  61.     if @old_time != nil
  62.       timer_difference = Time.new - @old_timer
  63.       time_difference = kernel_time + user_time - @old_time
  64.       result = time_difference / timer_difference / 100000
  65.     else
  66.       result = $antilag.max_cpu_utilization
  67.     end
  68.     # 节约CPU使用(还是计算)
  69.     @old_timer = Time.new
  70.     @old_time = kernel_time + user_time
  71.     return result
  72.   end
  73. end
  74. $antilag = Antilag_Settings.new
  75. #==============================================================================
  76. # ■ Scene_Map
  77. #------------------------------------------------------------------------------
  78. #  处理地图画面的类。
  79. #==============================================================================
  80. class Scene_Map
  81.   #-----------------------------------------------------------------------------
  82.   # 刷新模块, 增加平滑帧数
  83.   #-----------------------------------------------------------------------------
  84.   alias f0tzis_anti_lag_scene_map_update update
  85.   def update
  86.     f0tzis_anti_lag_scene_map_update
  87.     if Graphics.frame_count % 20 == 0 and $antilag.max_cpu_utilization <= 100
  88.       # 计算CPU最大限度利用和当前的利用率
  89.       abs = $antilag.max_cpu_utilization - $antilag.get_cpu_utilization
  90.       # 如果改变帧速率的差异
  91.       if abs.abs >= $antilag.max_cpu_utilization * $antilag.cpu_tolerance/100.0
  92.         Graphics.frame_rate = [[10, Graphics.frame_rate + abs / 2].max, 40].min
  93.       end
  94.     end
  95.   end
  96. end
  97. #==============================================================================
  98. # Game_Event Class
  99. # 处理事件
  100. #===============================================================================
  101. class Game_Event
  102.   # 这里不需要理会
  103.   def in_range?
  104.         
  105.     # 如果TRUE 返回一个虚拟的事件
  106.     # 自动启动/并行处理事件或者一个空的事件
  107.     if not $antilag.event or (@trigger == 3 or @trigger == 4 or
  108.     (@list != nil and @list[0].code == 108 and @list[0].parameters == ['']))
  109.       return true
  110.     end
  111.          
  112.     screne_x = $game_map.display_x
  113.     screne_x -= 256
  114.     screne_y = $game_map.display_y
  115.     screne_y -= 256
  116.     screne_width = $game_map.display_x
  117.     screne_width += 2816
  118.     screne_height = $game_map.display_y
  119.     screne_height += 2176
  120.    
  121.     return false if @real_x <= screne_x
  122.     return false if @real_x >= screne_width
  123.     return false if @real_y <= screne_y
  124.     return false if @real_y >= screne_height
  125.     return true
  126.             
  127.   end
  128.   #-----------------------------------------------------------------------------
  129.   # ● 更新画面
  130.   #-----------------------------------------------------------------------------
  131.   alias f0tzis_anti_lag_game_event_update update
  132.   def update
  133.     return if not self.in_range?      
  134.     f0tzis_anti_lag_game_event_update
  135.   end
  136.   
  137. end
  138. #==============================================================================
  139. # ■ Sprite_Character
  140. #------------------------------------------------------------------------------
  141. #  角色显示用脚本。监视 Game_Character 类的实例、
  142. # 自动变化脚本状态。
  143. #==============================================================================
  144. class Sprite_Character < RPG::Sprite
  145.   #-----------------------------------------------------------------------------
  146.   # ● 更新画面
  147.   #-----------------------------------------------------------------------------
  148.   alias f0tzis_anti_lag_sprite_char_update update
  149.   def update
  150.     return if @character.is_a?(Game_Event) and not @character.in_range?
  151.     f0tzis_anti_lag_sprite_char_update
  152.   end
  153.   
  154. end

  155. #===============================================================================
  156. # ■ Game_Map
  157. #
  158. # 处理地图的类。包含卷动以及可以通行的判断功能。
  159. #===============================================================================
  160. class Game_Map
  161.   def update
  162.     # 还原必要的地图
  163.     if $game_map.need_refresh
  164.       refresh
  165.     end
  166.      # 滚动中的情况下
  167.     if @scroll_rest > 0
  168.       # 滚动速度变化为地图坐标系的距离
  169.       distance = 2 ** @scroll_speed
  170.       # 执行滚动
  171.       case @scroll_direction
  172.       when 2    # 下  
  173.         scroll_down(distance)
  174.       when 4    # 左  
  175.         scroll_left(distance)
  176.       when 6    # 右
  177.         scroll_right(distance)
  178.       when 8    # 上
  179.         scroll_up(distance)
  180.       end
  181.       # 滚动距离的减法运算
  182.       @scroll_rest -= distance
  183.     end
  184.     # 更新地图事件
  185.     for event in @events.values
  186.       if in_range?(event) or event.trigger == 3 or event.trigger == 4
  187.         event.update
  188.       end
  189.     end
  190.     # 更新公共事件
  191.     for common_event in @common_events.values
  192.       common_event.update
  193.     end
  194.     # 处理雾的滚动
  195.     @fog_ox -= @fog_sx / 8.0
  196.     @fog_oy -= @fog_sy / 8.0
  197.     # 处理雾的色调变更
  198.     if @fog_tone_duration >= 1
  199.       d = @fog_tone_duration
  200.       target = @fog_tone_target
  201.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  202.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  203.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  204.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  205.       @fog_tone_duration -= 1
  206.     end
  207.     # 处理雾的不透明度变更
  208.     if @fog_opacity_duration >= 1
  209.       d = @fog_opacity_duration
  210.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  211.       @fog_opacity_duration -= 1
  212.     end
  213.   end
  214.   def in_range?(object)
  215.     diff_x = ($game_map.display_x - object.real_x).abs  # 绝对值
  216.     diff_y = ($game_map.display_x - object.real_x).abs  # 绝对值
  217.     width = 128 * 24   # size * tiles
  218.     height = 128 * 19  # size * tiles
  219.     return !((diff_x > width) or (diff_y > height))
  220.   end
  221. end
  222. #===============================================================================
  223. #  ■ Spriteset_Map
  224. #
  225. #  处理地图画面活动块和元件的类。
  226. #===============================================================================
  227. class Spriteset_Map
  228.   #--------------------------------------------------------------------------
  229.   # ● 刷新画面
  230.   #--------------------------------------------------------------------------
  231.   def update
  232.     # 远景与现在的情况有差异发情况下
  233.     if @panorama_name != $game_map.panorama_name or
  234.       @panorama_hue != $game_map.panorama_hue
  235.       @panorama_name = $game_map.panorama_name
  236.       @panorama_hue = $game_map.panorama_hue
  237.       if @panorama.bitmap != nil
  238.         @panorama.bitmap.dispose
  239.         @panorama.bitmap = nil
  240.       end
  241.       if @panorama_name != ""
  242.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  243.       end
  244.       Graphics.frame_reset
  245.     end
  246.     # 雾与现在的情况有差异的情况下
  247.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  248.       @fog_name = $game_map.fog_name
  249.       @fog_hue = $game_map.fog_hue
  250.       if @fog.bitmap != nil
  251.         @fog.bitmap.dispose
  252.         @fog.bitmap = nil
  253.       end
  254.       if @fog_name != ""
  255.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  256.       end
  257.       Graphics.frame_reset
  258.     end
  259.     # 刷新元件地图
  260.     @tilemap.ox = $game_map.display_x / 4
  261.     @tilemap.oy = $game_map.display_y / 4
  262.     @tilemap.update
  263.     # 刷新远景平面
  264.     @panorama.ox = $game_map.display_x / 8
  265.     @panorama.oy = $game_map.display_y / 8
  266.     # 刷新雾平面
  267.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  268.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  269.     @fog.opacity = $game_map.fog_opacity
  270.     @fog.blend_type = $game_map.fog_blend_type
  271.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  272.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  273.     @fog.tone = $game_map.fog_tone
  274.     # 刷新角色活动块
  275.     for sprite in @character_sprites
  276.       if in_range?(sprite.character)
  277.         sprite.update
  278.       end
  279.     end
  280.     # 刷新天候图形
  281.     @weather.type = $game_screen.weather_type
  282.     @weather.max = $game_screen.weather_max
  283.     @weather.ox = $game_map.display_x / 4
  284.     @weather.oy = $game_map.display_y / 4
  285.     @weather.update
  286.     # 刷新图片
  287.     for sprite in @picture_sprites
  288.       sprite.update
  289.     end
  290.     # 刷新计时器块
  291.     @timer_sprite.update
  292.     # 设置画面的色调与震动位置
  293.     @viewport1.tone = $game_screen.tone
  294.     @viewport1.ox = $game_screen.shake
  295.     # 设置画面的闪烁色
  296.     @viewport3.color = $game_screen.flash_color
  297.     # 刷新显示端口
  298.     @viewport1.update
  299.     @viewport3.update
  300.   end
  301.   def in_range?(object)
  302.     diff_x = ($game_player.real_x - object.real_x).abs  # 绝对值
  303.     diff_y = ($game_player.real_y - object.real_y).abs  # 绝对值
  304.     width = 128 * 24   # size * tiles
  305.     height = 128 * 19  # size * tiles
  306.     return !((diff_x > width) or (diff_y > height))
  307.   end
  308. end
  309. #===============================================================================
  310. # ■ Interpreter
  311. #
  312. # 执行事件命令的解释器
  313. #===============================================================================
  314. class Interpreter
  315.   #-----------------------------------------------------------------------------
  316.   # * 脚本
  317.   #-----------------------------------------------------------------------------
  318.   def command_355
  319.     # script 设置第一行
  320.     script = @list[@index].parameters[0] + "\n"
  321.     # 循环
  322.     loop do
  323.       # 下一个事件指令在脚本 2 行以上的情况下
  324.       if @list[@index+1].code == 655
  325.         # 添加到 script 2 行以后
  326.         script += @list[@index+1].parameters[0] + "\n"
  327.       # 事件指令不在脚本 2 行以上的情况下
  328.       else
  329.         # 中断循环
  330.         break
  331.       end
  332.       # 推进索引
  333.       @index += 1
  334.     end
  335.     # 评价
  336.     result = eval(script)
  337.     #---------------------------------------------------------------------------
  338.     # 返回值为 false 的情况下
  339.     # NEW: the last word of the code mustnt be false!
  340.     #---------------------------------------------------------------------------
  341.     if result == false and script[script.length-6..script.length-2] != 'false'
  342.       # 结束
  343.       return false
  344.     end
  345.     # 继续
  346.     return true
  347.   end
  348. end
  349. #咳咳少了几行代码
  350. $antilag.max_cpu_utilization = 75                              
  351. $antilag.cpu_tolerance = 20      
  352. $antilag.high_priority = true   
  353. $antilag.event = true
  354. #自动回滚标准
  355. if $antilag.max_cpu_utilization>=100
  356.        $antilag.max_cpu_utilization=70
  357. end                 # 分歧结束。

  358.    
复制代码

评分

参与人数 1星屑 +2 收起 理由
eve592370698 + 2 鼓励一下,请问怎么整合到800×600分辨率扩.

查看全部评分

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-10-16
帖子
450
2
发表于 2009-10-27 08:49:07 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
3
星屑
6420
在线时间
1131 小时
注册时间
2007-12-26
帖子
2402
3
发表于 2009-10-27 10:30:44 | 只看该作者
这个效果明显么?对于ARPG来说。。
囡囚囨囚囨図囨囧
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
215
在线时间
10 小时
注册时间
2009-7-25
帖子
656
4
 楼主| 发表于 2009-10-27 11:13:52 | 只看该作者
这个效果明显么?对于ARPG来说。。
幻耶 发表于 2009-10-27 10:30

恩。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
64
在线时间
4352 小时
注册时间
2007-8-31
帖子
1982
5
发表于 2009-10-27 18:57:55 | 只看该作者
好眼熟的脚本
本脚本核心部分基本与下面链接中这位外国作者相同
http://www.hbgames.org/forums/viewtopic.php?t=11639
似乎仅在原基础上添加和删减了少部分内容并作汉化
甚至连这个方法名(f0tzis_anti_lag_scene_map_update)都相同(里面出现那位外国作者的名字),这些都是巧合么?请楼主解释下。
我真是王小二过年,一年不如一年。目前正在寻找状态中,努力找回当初的动力!
“底蕴制作者”—asperta最新博客开通!以后将在这里更新制作进度报告!
我的作品官网:http://www.asperta.org/
ASPERTA世界论坛:http://bbs.asperta.org/


回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

6
发表于 2009-10-27 21:13:30 | 只看该作者
还是先了解下 线程和进程的区别比较好  = =
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6865
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

7
发表于 2009-10-27 23:41:03 | 只看该作者
本帖最后由 后知后觉 于 2009-10-27 23:45 编辑

又来一个侵权的家伙?- -
先【暂时】转地球村
如楼主仍然把该脚本标记为【原创】
那就只有请地球村版主给转开水或直接删除了











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
61 小时
注册时间
2006-9-15
帖子
946
8
发表于 2009-10-28 01:25:27 | 只看该作者
VX能用么。。。
回复 支持 反对

使用道具 举报

Lv1.梦旅人


梦石
0
星屑
89
在线时间
24 小时
注册时间
2006-5-27
帖子
11425

贵宾

9
发表于 2009-10-28 18:27:35 | 只看该作者
好眼熟的脚本
本脚本核心部分基本与下面链接中这位外国作者相同
http://www.hbgames.org/forums/viewtopic.php?t=11639
似乎仅在原基础上添加和删减了少部分内容并作汉化
甚至连这个方法名(f0tzis_anti_lag_scene_ma ...
asperta 发表于 2009-10-27 18:57

请楼主解释下+1
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
215
在线时间
10 小时
注册时间
2009-7-25
帖子
656
10
 楼主| 发表于 2009-10-29 16:59:36 | 只看该作者
不好意思,没有说清楚。开始有一部分是来自某德国一个网站。可能就是计算那部分其他都是原创。
我在此道歉
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-29 00:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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