Page 1 of 1

ParameterContainerのパラメータでVector2Int実装の要望

Posted: 2020/09/29 08:25
by ooee
いつもお世話になっています。

ParameterContainerのパラメータでVector2Intを使用したいのですが実装されていないので、
Variable型を継承したVector2IntVariableクラスを定義して使っています。

使用する分の動作としてはこれで問題ないのですが、FlexibleField<Vector2Int>から値を取得したり、
AnyParameterReferenceで値を設定するときに、恐らくstructとobject型とのキャストが入るためGC Allocが毎回発生するのが気になっています。

もし可能でしたらVector2Intのパラメータを実装していただけると助かります。
非常に細かい点でお手数をおかけしますが、ご検討のほどよろしくお願いいたします。

Re: ParameterContainerのパラメータでVector2Int実装の要望

Posted: 2020/09/29 10:59
by caitsithware
ご要望ありがとうございます。

ParameterContainerにVector2Int追加ですね。
Vector3IntやRectIntも含め、追加する方向で検討いたします。

structからobjectへのボックス化によるGC Allocにつきましては、
現在、FlexibleField<T>に構造体を指定してパラメータ値を取得するとVariableに限らずボックス化がされる仕様となっておりますので、その点はご了承ください。
(FlexibleVector3などもFlexibleField<Vector3>を継承していますので、パラメータで実装されているかに関わらずボックス化が発生します)
今後の課題として、極力ボックス化を回避できないかもあわせて検討していきたいと思います。

現状での回避策としましては、Parameterを経由してVariableBaseを取得して直接中身を取り出すことでボックス化を回避できるかと思います。

Code: Select all

// フィールド宣言部
[SlotType(typeof(Vector2Int))]
public AnyParameterReference vector2IntParameter;

// Get/Setしたい箇所
var parameter = vector2IntParameter.parameter;
if (parameter == null || parameter.type != Parameter.Type.Variable) return;

var variable = parameter.variableBase as Vector2IntVariable;
if (variable == null) return;
var value = variable.value;
value.x += 10;
variable.value = value;
多少手間になってしまいますが、対応までの間このように対処していただくようお願いいたします。

【ボックス化に関する補足】
データフローやInvokeMethod/GetValue、List関連のスクリプトなどでもobject型を介すためボックス化が発生します。
この辺りは汎用的な組みやすさを取るかパフォーマンスを取るかのトレードオフになっておりますので、
パフォーマンスを重視しボックス化も極力回避したい場合は、なるべく自作スクリプトを作成しメンバーに直接アクセスするようお願いいたします。

Re: ParameterContainerのパラメータでVector2Int実装の要望

Posted: 2020/09/29 12:41
by ooee
ご返事ありがとうございます。

>(FlexibleVector3などもFlexibleField<Vector3>を継承していますので、パラメータで実装されているかに関わらずボックス化が発生します)
FlexibleVector3がGC Allocが発生しないPrimitive型と同等の実装をしていると勝手に勘違いしていました、申し訳ございません。
教えていただいた回避策で試してみたいと思います。
補足情報もありがとうございます。