ZString
プロジェクトにZStringを導入することで、文字列のフォーマット処理をゼロアロケーション化することができます。
ZStringをPackage Managerから導入した場合は、自動で内部の処理がZStringを使用したものに置き換えられます。unitypackage等で導入した場合は、Project Settings > Player > Scripting Define Symbols
にLITMOTION_ZSTRING_SUPPORT
を追加する必要があります。
BindToTextのゼロアロケーション化
BindToText()
の引数にstring format
を渡した場合、LitMotionは内部でstring.Format()
を使用します。これはobjectを引数にとるため、ボックス化によるアロケーションが発生します。
TMP_Text text;
LMotion.Create(0, 100, 2f)
.BindToText(text, "{0:0}"); // フレーム毎にGCアロケーションが発生する
BindToText()
の内部実装は以下のようになっています。
// BindToText()のコードの一部
builder.Bind(text, format, (x, target, format) =>
{
...
target.text = string.Format(format, x); // ここでボックス化によるアロケーションが発生
});
ZStringを導入することで、LitMotionはこれをZString.Format()
を使用した処理に置き換えます。これによって余計なボックス化のアロケーションを削減できます。
builder.Bind(text, format, (x, target, format) =>
{
...
target.text = ZString.Format(format, x); // ゼロアロケーションでFormatが可能
});
さらに対象がTMP_Text
の場合、ZString.Format()
の代わりにZStringの拡張メソッドであるSetTextFormat()
を使用します。これは内部でTMP_Text.SetText()
を使用するため、完全にゼロアロケーションでフォーマットの処理を行うことが可能になります。
builder.Bind(text, format, (x, target, format) =>
{
...
target.SetTextFormat(format, x);
});