Project1

标题: 關於事件數量VS效能的問題 [打印本页]

作者: sdgn    时间: 2019-8-22 21:53
标题: 關於事件數量VS效能的問題
本帖最后由 sdgn 于 2019-9-1 17:45 编辑

首先已用最小尺寸的地圖試過排滿空的事件會很卡....
想請問RM事件效能的影響是一個畫面上的事件數還是整張地圖的事件數???
想說如果是前ˊ者的話就避免一個畫面占太多事件就好了
作者: guoxiaomi    时间: 2019-9-1 17:03
本帖最后由 guoxiaomi 于 2019-9-1 21:47 编辑

一般是整张地图的事件数,海量的碰撞和事件触发判断导致帧率下降。

实际操作的时候,如果只需要显示一个Character,应该实现一个特殊的子类(继承Game_Event或者 Game_Character),依据具体的需求移除此事件类的移动、碰撞、事件页触发、每帧更新图片等功能。

上面提到的“只需要显示一个Character”有歧义,其实是说,只需要显示Character而不做事件触发、移动碰撞等操作。

其实论坛里已经有大量的解决方案了,但是需要自己去适配自己的游戏。

我签名里的《Reformers》,这个是XP工程。工程里用了大量的事件分割地图,并且有跳跃事件,玩家走到此格子会触发跳跃到另一个地方。

由于这些事件都是透明的行走图,而且位置固定,事件页只有一页,就使用下面的脚本阻止了事件页的刷新和角色的移动以提升性能,换句话说,适用于在进入地图的时候就已经加载完毕,永远不会改变的事件:

RUBY 代码复制
  1. # 不刷新跳跃事件
  2. #==============================================================================
  3. # ■ Game_Event
  4. #------------------------------------------------------------------------------
  5. #  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
  6. # 在 Game_Map 类的内部使用。
  7. #==============================================================================
  8.  
  9. class Game_Event < Game_Character
  10.   #--------------------------------------------------------------------------
  11.   # ● 初始化对像
  12.   #     map_id : 地图 ID
  13.   #     event  : 事件 (RPG::Event)
  14.   #--------------------------------------------------------------------------
  15.   alias _jump_inialize initialize
  16.   def initialize(map_id, event)
  17.     _jump_inialize(map_id, event)
  18.     @jump_event = false
  19.     if @event.name =~ /^#j/
  20.       @jump_event = true
  21.     end
  22.   end
  23.   #--------------------------------------------------------------------------
  24.   # ● 刷新
  25.   #--------------------------------------------------------------------------
  26.   alias _jump_refresh refresh
  27.   def refresh
  28.     return if @jump_event
  29.     _jump_refresh
  30.   end
  31.   #--------------------------------------------------------------------------
  32.   # ● 更新画面
  33.   #--------------------------------------------------------------------------
  34.   alias _jump_update update
  35.   def update
  36.     return if @jump_event
  37.     _jump_update
  38.   end
  39. end


注意 19 行,事件名称必须以 #j 开头才会被停止刷新。进一步的还可以让其他的事件在检索碰撞时忽视这些事件,等等。我这里没有做,是因为我的程序里这些事件被用做地形分割,即为了阻止自由移动的事件跨过区域。

如果要求事件触发或者移动,可以把原来update/refresh部分里相关的内容复制过来。如果对刷新行走图还有性能要求,就需要修改 Sprite_Character 类了,不过在我看来非弹幕游戏的瓶颈不在这里。




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