Я не могу предложить больше ничего с точки зрения деталей, кроме того факта, что есть около 1 тыс. Экземпляров, которые довольно часто запускают свои ContainsKey()
и ToString()
.
Местоположение - только моя личная замена для Vector3
Unity, чтобы соответствовать моим потребностям:
[Serializable] public struct Location
{
public double X;
public double Y;
public double Z;
public Location(double x, double y, double z) : this()
{
X = x;
Y = y;
Z = z;
}
public override string ToString()
{
return String.Format("{0}, {1}, {2}", X, Y, Z);
}
}
(я знаю, что нарушаю какое-то правило с Structs
.. просто не знаю, как удовлетворить мои потребности другим способом.)
Вот скриншот запущенного Profiler:
Как вы можете видеть, для большей части временной шкалы она стабильна, затем внезапно после того, как мои экземпляры достигают около 1 КБ (количество), (они начинаются около 100-250), ЦП и Память становятся дикими из-за того, что кажется быть распределением GC. Я пытался найти то, что я могу почистить немного лучше, но все, что я вижу, это даже вызывает ЛЮБОЕ выделение GC, это когда я запускаю:
if (_dictionary.ContainsKey(key)) {...}
и при переименовании Unity GameObjects с помощью:
part.name = "Part: " + part.Location.ToString();
Если это относится только к неизбежному времени, которое требуется для поиска, то есть ли альтернативы Dictionaries
, которые имеют тенденцию функционировать еще медленнее, но вызывают меньшее выделение GC, и есть более эффективный способ override
ToString()
метод?
Добавление: Мой словарь является ключевым: (моя личная структура) Местоположение, значение: экземпляр класса.