Page 1 of 1

パラメータをCalculatorで参照するとき、Calculator.OnGetParameter()やCalculator.UnwatchParameters()で毎回GC Allocが発生する場合がある

Posted: 2023/10/28 04:08
by ooee
いつもお世話になっています。

不具合かどうかはわかりませんが、以前のバージョンでは発生しなかった現象を確認したので、ご報告いたします。

OS: Windows11
Unityバージョン: 2021.3.31f1
Arborバージョン: 3.9.11

再現方法:
1.ステートマシンにintパラメータを追加
2.以下を毎フレーム実行
Ind.Add(Value1:intパラメータ、Value2:0)→Ind.Add(Value1:intパラメータ、Value2:左Int.AddのResult)→SetParameter(Intパラメータに代入)
3.プロファイラで確認すると、
Calculator.OnGetParameter()
Parameter.add_onChanged()
Delegate.Combine()
MulticastDelegate.CombineImpl() GC Alloc 176B
が発生していることを確認。

また再現できなかったのですが、手持ちのプロジェクトでは以下も同時に発生していました。
Calculator.UnwatchParameters()
Parameter.remove_onCHanged()
Delegate.Remove()
MulticastDelegate.RemoveImpl() GC Alloc 184B

Re: パラメータをCalculatorで参照するとき、Calculator.OnGetParameter()やCalculator.UnwatchParameters()で毎回GC Allocが発生する場合がある

Posted: 2023/10/28 06:37
by caitsithware
ご報告ありがとうございます。
Calculatorが演算されるたびに参照しているパラメータの変更監視の解除と登録が行われることで発生しているようですね。
あまり良いとは言えないので対応いたします。

暫定対処方法
  1. Assets/Plugins/Arbor/Internal/Scripts/Calculator.csを開く
  2. 324行目のUnwatchParameters()呼び出しを削除
[影響範囲]
プレイ中に参照しているパラメータを変更した場合、変更前に参照していたパラメータの値変更が行われたときに再演算が発生します。

Re: パラメータをCalculatorで参照するとき、Calculator.OnGetParameter()やCalculator.UnwatchParameters()で毎回GC Allocが発生する場合がある

Posted: 2023/10/28 07:24
by ooee
暫定対処方法を手持ちのプロジェクトに適用したところ、GC Allocは発生しなくなりました。
確認ありがとうございます。