exch-bms2 / beatoraja

Cross-platform rhythm game based on Java and libGDX.
GNU General Public License v3.0
627 stars 146 forks source link

bms.player.beatoraja.skin.property.*PropertyがLuaFunctionを実行する際の負荷 #734

Open ich59669 opened 1 year ago

ich59669 commented 1 year ago

各種PropertyにLuaの関数が定義されている場合、その関数は描画ごと(毎秒、本体のFPS設定値の回数分)だけ実行されます。 関数が実行されると、luaj側のLuaClosure.call()が呼び出され、そこでおそらくLuaValueインスタンスが都度生成されると思われます。(luaj側の実装によるもの) 各種Propertyが関数ではなく、通常のSkinPropertyを指す整数である場合はこの処理は発生しないと思われます。 常時大量のインスタンス生成は処理落ちのもととなりますので、何らかの対策を講じたほうが良いかもしれません。

例えば、luaスキン内のパラメータとしてLuaFunctionの実行間隔や周期を指定することで、不必要な関数の実行を防ぐ。 他にアイデアがあれば書いていただけると助かります。

しかしながら、LuaSkinLoaderの実装や、luaj側がluaをどのようにパースしてjava上で実行しているかについてはまだ読み込めておりません。 (LuaSkinLoader.serializeLuaScript()のあたりがキモだとは思っていますが、機能を保ったまま負荷軽減を実現する目処はまだ立っていません)

ich59669 commented 1 year ago

luaj単体で色々テストしてみましたが、やはりLuaValueは都度生成されるようです。メモリの使用量や生きているオブジェクト数は関数の複雑さに応じて多くなりました。 ただやはりこれはluajの仕様ですので、方針としては*Property#get()の実装をメンバの参照のみにし、値の更新(LuaFunction#call()を行っているところ)を別スレッドに任せて、かつパラメータで更新周期を決定できるような実装に変更したいと考えています。