В своем стремлении создать 0 мусора при процедурном создании точек я столкнулся с проблемой производительности при сравнении значений с другими значениями, хранящимися в словарях.
Изначально я использовал списки и массивы, но недавно пересмотрел код, чтобы избежать генерации мусора. Также я решил использовать словари вместо массивов / списков, потому что это кажется полезным для доступа к определенному ключу в словаре.
Я использую словари следующим образом:
-Каждый ключ - это сетка в моей игре
-Каждое значение представляет собой массив вершин или треугольников
-Каждый массив содержит сотни вершин или треугольников
Dictionary<int, Vector3[]> exampleVerticesDictionary;
Dictionary<int, int[]> exampleTrianglesDictionary;
Моя процедурная система выполняет следующие действия:
1. Takes an initial random value (int or float).
2. Loops through all the items in the arrays of the 1st Dictionary.
3. If the value matches any value on any of the arrays, continue on the next loop.*
4. Loops through all the items in the arrays of the 2nd Dictionary.
5. If the initial value matches again, continue on next loop.
6. Loops through all the items in the arrays of the 3rd Dictionary.
7. If the initial value matches again, create a 3D point.
Я получаю доступ и сравниваю элементы в словарях следующим образом:
if (exampleVerticesDictionary[key][index] == 1)
Проблема: Это вызывает заметные всплески производительности. Профилировщик указывает, что это вызвано многочисленными вызовами ( десятки тысяч ) этих методов:
Dictionary.get_Item()
GenericEqualityComparer.Equals()
Int32.Equals()
GenericEqualityComparer.Equals()
Int32.GetHashCode()
Вопросы:
-Почему производительность сильно падает при использовании словарей для сравнения?
-Мне лучше использовать массивы массивов вместо словарей массивов?
-Можно ли использовать другой способ доступа и сравнения элементов в словарях?
Заранее спасибо! Кодирование - не моя сильная сторона, и я немного заблудился в этом вопросе ...