﻿# V4001\. Unity Engine\. Boxing inside a frequently called method may decrease performance\.

Анализатор обнаружил операцию упаковки внутри часто выполняемого метода\. Упаковка является дорогим процессом, требующим выделения памяти в управляемой куче\. Как следствие, большое количество операций упаковки может негативно сказаться на производительности приложения\.

Рассмотрим пример:

```cpp
Vector3 _value;
....
void OnGUI()
{
  GUILayout.Label(string.Format(...., _value)); 
}
```

В проектах, использующих игровой движок Unity, функция 'OnGUI' используется для отрисовки интерфейса и обработки связанных с ним событий\. Она вызывается как минимум один раз за кадр, то есть её код выполняется достаточно часто\.

В этом примере вызывается метод 'string\.Format', последним аргументом которого является поле значимого типа \('Vector3'\)\. При таком вызове используется перегрузка 'string\.Format\(string, object\)'\. Так как ожидается аргумент типа 'object', значение '\_value' будет упаковано\.

Упаковки можно избежать, вызвав у поля '\_value' метод 'ToString':

```cpp
Vector3 _value;
....
void OnGUI()
{
  GUILayout.Label(string.Format(...., _value.ToString()));
}
```

Рассмотрим ещё один пример:

```cpp
struct ValueStruct { int a; int b; }

ValueStruct _previousValue;

void Update()
{
  ....
  ValueStruct newValue = ....
  ....
  if (CheckValue (newValue)
  ....
}

bool CheckValue(ValueStruct value)
{
  ....
  if(_previousValue.Equals(value))
  ....
}
```

Метод 'Update' также широко используется в проектах на Unity\. Его код выполняется каждый кадр\.

В коде 'Update' вызывается метод 'CheckValue'\. В нём происходит неявная упаковка, так как значение 'value' передаётся в метод 'Equals' \(параметр стандартного 'Equals' имеет тип 'object'\)\.

Одним из вариантов решения может быть добавление к типу 'ValueStruct' метода 'Equals', принимающего параметр типа 'ValueStruct':

```cpp
struct ValueStruct
{
  int a;
  int b;

  public bool Equals(ValueStruct other)
  {
    ....
  }
}
```

В таком случае в методе 'CheckValue' будет использоваться перегрузка 'Equals\(ValueStruct\)', что позволит избежать упаковки\.