本帖最后由 guoxiaomi 于 2019-9-1 21:47 编辑
一般是整张地图的事件数,海量的碰撞和事件触发判断导致帧率下降。
实际操作的时候,如果只需要显示一个Character,应该实现一个特殊的子类(继承Game_Event或者 Game_Character),依据具体的需求移除此事件类的移动、碰撞、事件页触发、每帧更新图片等功能。
上面提到的“只需要显示一个Character”有歧义,其实是说,只需要显示Character而不做事件触发、移动碰撞等操作。
其实论坛里已经有大量的解决方案了,但是需要自己去适配自己的游戏。
我签名里的《Reformers》,这个是XP工程。工程里用了大量的事件分割地图,并且有跳跃事件,玩家走到此格子会触发跳跃到另一个地方。
由于这些事件都是透明的行走图,而且位置固定,事件页只有一页,就使用下面的脚本阻止了事件页的刷新和角色的移动以提升性能,换句话说,适用于在进入地图的时候就已经加载完毕,永远不会改变的事件:
# 不刷新跳跃事件 #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ # 处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能 # 在 Game_Map 类的内部使用。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 初始化对像 # map_id : 地图 ID # event : 事件 (RPG::Event) #-------------------------------------------------------------------------- alias _jump_inialize initialize def initialize(map_id, event) _jump_inialize(map_id, event) @jump_event = false if @event.name =~ /^#j/ @jump_event = true end end #-------------------------------------------------------------------------- # ● 刷新 #-------------------------------------------------------------------------- alias _jump_refresh refresh def refresh return if @jump_event _jump_refresh end #-------------------------------------------------------------------------- # ● 更新画面 #-------------------------------------------------------------------------- alias _jump_update update def update return if @jump_event _jump_update end end
# 不刷新跳跃事件
#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
# 处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
# 在 Game_Map 类的内部使用。
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 初始化对像
# map_id : 地图 ID
# event : 事件 (RPG::Event)
#--------------------------------------------------------------------------
alias _jump_inialize initialize
def initialize(map_id, event)
_jump_inialize(map_id, event)
@jump_event = false
if @event.name =~ /^#j/
@jump_event = true
end
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
alias _jump_refresh refresh
def refresh
return if @jump_event
_jump_refresh
end
#--------------------------------------------------------------------------
# ● 更新画面
#--------------------------------------------------------------------------
alias _jump_update update
def update
return if @jump_event
_jump_update
end
end
注意 19 行,事件名称必须以 #j 开头才会被停止刷新。进一步的还可以让其他的事件在检索碰撞时忽视这些事件,等等。我这里没有做,是因为我的程序里这些事件被用做地形分割,即为了阻止自由移动的事件跨过区域。
如果要求事件触发或者移动,可以把原来update/refresh部分里相关的内容复制过来。如果对刷新行走图还有性能要求,就需要修改 Sprite_Character 类了,不过在我看来非弹幕游戏的瓶颈不在这里。 |