Project1

标题: 天气系统的图片用并行事件显示很卡,用脚...已解决 [打印本页]

作者: 飞翔的小鸟3    时间: 2017-10-14 23:28
标题: 天气系统的图片用并行事件显示很卡,用脚...已解决
本帖最后由 飞翔的小鸟3 于 2017-10-15 12:12 编辑

原标题:天气系统的图片用并行事件显示很卡,用脚本循环卡死
写了一个天气系统,可是用并行事件显示来移动图片很卡,并不掉帧,就是卡,走路很慢。用脚本的while语句直接卡死,不能动。
你们写天气系统都是怎么处理的呢?
顺便说一下啊,这个原因是我1帧调用一下   1.times { Fiber.yield }  ,所以才卡,但是如果不这样子,雪花怎么连续移动呢?
ps,我又想了想,60帧刷新一下就不会这么卡了...所以,并不是我调用了1.times { Fiber.yield },而是调用的1.times { Fiber.yield }帧数不够多?
但是,这只是间接原因,根本原因是一时间处理的图片太多?那别人怎么写着没事?怎么想还是我写法的问题。

作者: guoxiaomi    时间: 2017-10-15 00:27
本帖最后由 guoxiaomi 于 2017-10-15 14:36 编辑

把你的整个脚本,事件发出来。


你看,发出来一下子就知道问题了

作者: 飞翔的小鸟3    时间: 2017-10-15 01:39
guoxiaomi 发表于 2017-10-15 00:27
把你的整个脚本,事件发出来。

RUBY 代码复制
  1. class Weather_change
  2. #==============生成初始值=================
  3.   def start
  4.     if $Weather_change_num == nil
  5.       $stop_weather = 0
  6.       $Weather_change_num = 0
  7.     end
  8.     case rand(2)
  9.     when 0
  10.       @trajectory_x = rand(744)
  11.     when 1
  12.       @trajectory_x = -rand(200)
  13.     end
  14.     @trajectory_y = -rand(416)
  15.   end
  16. #===============生成图像================
  17.   def Generating_image(type)
  18.     case type
  19.     # 雪
  20.     when 1
  21.       $weather_arr = []
  22.       $weather_x = []
  23.       $weather_y = []
  24.       for a in 0..100
  25.       start
  26.       $weather_arr[a] =  Sprite.new
  27.       $weather_arr[a].bitmap = Bitmap.new("Graphics/weather/雪花.png")
  28.       $weather_arr[a].x = @trajectory_x
  29.       $weather_arr[a].y = @trajectory_y
  30.       $weather_x[a] = @trajectory_x
  31.       $weather_y[a] = @trajectory_y
  32.       end
  33.     # 雨1
  34.     when 2
  35.     # 雨2
  36.     when 3
  37.     # 雾
  38.     when 4
  39.     # 风
  40.     when 5
  41.     # 暴风
  42.     when 6
  43.     # 冰雹
  44.     when 7
  45.     end
  46.   end
  47. #==============要生成的天气类型==============
  48.   def Weather_type(type)
  49.     case type
  50.     #=================================
  51.     # 普通天气
  52.     #=================================
  53.     # 小雪
  54.     when 0
  55.       start
  56.       Generating_image(1)
  57.       $game_switches[38] = true
  58.     # 中雪
  59.     when 1
  60.     # 大雪
  61.     when 2
  62.     # 小雨
  63.     when 3
  64.     # 中雨(天灰)
  65.     when 4
  66.     # 大雨(天黑)
  67.     when 5
  68.     # 大雨(打雷+天黑)
  69.     when 6
  70.     # 空打雷
  71.     when 7
  72.     # 雾
  73.     when 8
  74.     # 小风
  75.     when 9
  76.     # 大风
  77.     when 10
  78.     #=================================
  79.     # 灾难性天气
  80.     #=================================
  81.     # 暴风
  82.     when 11
  83.     # 冰雹
  84.     when 12
  85.     # 霜冻
  86.     when 13
  87.     # 台风
  88.     when 14
  89.     # 雷电
  90.     when 15
  91.     # 地震
  92.     when 16
  93.     # 沙尘暴
  94.     when 17
  95.     # 停止天气
  96.     when 100
  97.     end
  98.   end
  99. #==================运动轨迹===================
  100.   # 往右下运动
  101.   def path_particle_1(type)
  102.     case type
  103.     when 1
  104.       x = 2
  105.       y = 4
  106.     when 2
  107.     end
  108.     for a in 0..100
  109.     $weather_x[a] += x
  110.     $weather_y[a] += y
  111.     end
  112.   end
  113.   # 往左下运动
  114.   def path_particle_2
  115.   end
  116.   # 水平向左
  117.   def path_particle_3
  118.   end
  119.   # 水平向右
  120.   def path_particle_4
  121.   end
  122.   # 竖直向下
  123.   def path_particle_5
  124.   end
  125.   # 往右下摆动
  126.   def path_particle_6
  127.   end
  128.   # 往左下摆动
  129.   def path_particle_7
  130.   end
  131. #==================要循环的天气=================
  132.   def light_snow
  133.     while $stop_weather < 1
  134.     path_particle_1(1)
  135.     for a in 0..100
  136.     $weather_arr[a].x = $weather_x[a]
  137.     $weather_arr[a].y = $weather_y[a]
  138.     end
  139.     1.times { Fiber.yield }
  140.     Graphics.update
  141.     end
  142.   end
  143. end








作者: datf166    时间: 2017-10-15 09:36
是不是和其他脚本冲突了?
作者: 精灵使者    时间: 2017-10-15 09:40
我说啊。
在公共事件里执行脚本需要等待帧啊同学。
否则有些动作根本来不及执行啊亲。在天气循环下增加一个“等待1帧”试试效果?

作者: 飞翔的小鸟3    时间: 2017-10-15 12:02
本帖最后由 飞翔的小鸟3 于 2017-10-15 12:10 编辑

各位,不然怎么写啊
更新:
还真让张冬冬同学说对了,我把Graphics.update删掉,没事了,我本来的想法是,不调用Graphics.update,他怎么会自己刷新图片呢?这是看F1帮助文档的锅
有图为证:


他那里调用了Graphics.update,我以为要调用这个,图片的位置才会刷新。。。。。。
不管怎么说,问题解决了

作者: 精灵使者    时间: 2017-11-5 11:11
除非是纯脚本绘制的窗口场景
否则事件里面慎用Graphics.update




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1