IL2CPP スクリプティングバックエンド、どのように il2cpp.exe が C++ コードを生成するかを制御することができます。特に、C# 属性を使って以下のランタイムチェックを有効、または、無効にすることができます。
オプション | 説明 | デフォルト値 |
---|---|---|
Null checks | このオプションを有効にすると、IL2CPP によって生成された C++ コードに null チェックが加えられ、必要に応じて管理された NullReferenceException 例外が投げられます。 このオプションを無効にすると、生成された C++ コードに null チェックを加えません。プロジェクトのなかには、このオプションを無効にすると実行時のパフォーマンスが向上するものもあります。 ただし、生成されたコードで null 値へのアクセスは保護されておらず、誤った挙動を引き起こす可能性があります。通常、null 値への参照が解除された直後にゲームがクラッシュしますが、保証できません。 このオプションを無効にする場合は、慎重に行ってください。 |
有効 |
Array bounds checks | このオプションを有効にすると、IL2CPP によって生成された C++ コードに配列境界チェックが加えられ、必要に応じて管理された IndexOutOfRangeException 例外が投げられます。 このオプションを無効にすると、生成された C++ コードに配列境界チェックを加えません。プロジェクトのなかには、このオプションを無効にすると実行時のパフォーマンスが向上するものもあります。ただし、生成されたコードで無効なインデックスへのアクセスは保護されておらず、任意のメモリーロケーションから読み込んだり、書き込んだりするなど、誤った挙動を引き起こす可能性があります。大抵はこのようなメモリーアクセスによって性急な悪影響は発生せず、静かにゲームの状態を悪化させる場合があります。 このオプションを無効にする場合は、非常に慎重に行ってください。 | 有効 |
Divide by zero checks | このオプションを有効にすると、IL2CPP によって生成された C++ コードは整数の除算に対して 0 で割っていないかチェックを行い、必要に応じて管理された DivideByZeroException 例外を投げます。このオプションが無効になっていると、0 による除算チェックは整数の除算時に C++ コードで行われません。ほとんどのプロジェクトではこのオプションは無効にしてあるのが望ましいです。このチェックは実行時コストが高いため、有効にするのは必要な場合のみです。このオプションはデフォルトでは無効になっています。 | 無効 |
ランタイムチェックは、Il2CppSetOptions
属性を使って C#コードで有効、または、無効にすることができます。この属性を使用するには、コンピューターの Unity エディターインストールファイルの IL2CPP ディレクトリーの Il2CppSetOptionsAttribute.cs ソースファイル (Windows では Data\il2cpp、 OS X では Contents/Frameworks/il2cpp ) を見つけます。このソースファイルをプロジェクトの Assets フォルダーにコピーします。
では、属性を下の例で使用してみましょう。
[Il2CppSetOption(Option.NullChecks, false)]
public static string MethodWithNullChecksDisabled()
{
var tmp = new object();
return tmp.ToString();
}
Il2CppSetOptions
属性を型、メソッド、プロパティに適用できます。Unity はもっともローカルなスコープから属性を使用します。
[Il2CppSetOption(Option.NullChecks, false)]
public class TypeWithNullChecksDisabled
{
public static string AnyMethod()
{
// このメソッドで Null checks は無効になります
var tmp = new object();
return tmp.ToString();
}
[Il2CppSetOption(Option.NullChecks, true)]
public static string MethodWithNullChecksEnabled()
{
// このメソッドで Null checks は有効になります
var tmp = new object();
return tmp.ToString();
}
}
public class SomeType
{
[Il2CppSetOption(Option.NullChecks, false)]
public string PropertyWithNullChecksDisabled
{
get
{
// このメソッドで Null checks は無効になります.
var tmp = new object();
return tmp.ToString();
}
set
{
// このメソッドで Null checks は無効になります
value.ToString();
}
}
public string PropertyWithNullChecksDisabledOnGetterOnly
{
[Il2CppSetOption(Option.NullChecks, false)]
get
{
// このメソッドで Null checks は無効になります
var tmp = new object();
return tmp.ToString();
}
set
{
// このメソッドで Null checks は有効になります
value.ToString();
}
}
}