2020年2月6日木曜日

GearSwapの処理軽量化

モーグリやサクラなどのスフィアを展開するフェイスを出していると、棒立ちの状態でも息継ぎをするように十数秒おきに重くなると思います。当方の環境では定期的に29fpsから27fpsに落ちて、処理がカクつきます。いわゆるプチフリ状態です。このプチフリはGearSwapをアンロードすると起こらなくなります。
どの処理が重いのか調査したところ、packet_parsing.lua の 518 行目あたりの処理が関係していることがわかりました。518行目からの4行をコメントアウトすると処理落ちが軽減されました。下記の4行です。これはバフ情報更新のパケットが飛んでくると動く処理です。

if not gearswap_disabled then
    refresh_globals()
    equip_sets('buff_refresh',nil,buff_name,new)
end

上記の refresh_globals() 関数はけっこう重い処理で、プレイヤーの状態や、かばんの中身など、膨大な量のデータをすべて再精査する処理が行われています。たまに動く程度ならば問題ないのですが、スフィアを展開するフェイスを出していると3秒おきにバフ情報更新のパケットが飛んできてそのたびに処理が実行され、継続的に大量のデータが更新され続けることでLuaの内部でガーベジコレクションなどの処理が動き、プチフリみたいなことになっているのかなと考えています。

で、3秒おきに飛んでくるスフィアのバフ情報更新のパケットですが、そのバフの持続時間(duration)はだいたい5~8秒に設定されています。なので、フェイスをしまうと数秒後にバフが消えるという仕掛けです。

この5~8秒という数値を利用して、duration が10秒以上の場合にのみrefresh_globals() 関数を実行するように変更することで、3秒おきにくるスフィア用のパケットを無視できます。

if not gearswap_disabled and new.duration > 10 then
    refresh_globals()
    equip_sets('buff_refresh',nil,buff_name,new)
end

上記のように変更すると、プチフリが軽減されました。スフィアのバフはIDが通常のバフとは違っているため、duration ではなくバフのIDでフィルタリングしても良いのですが、Allied ManteletやMirthful Mandragoraのリフレシュスフィアのようにバフによっては通常のバフと同じIDを使用している場合もあるため、duration の方が確実だと思います。


0 件のコメント:

コメントを投稿