Я хочу знать, что является самым быстрым способом найти индекс элемента в списке. Причина, по которой я хочу знать, заключается в том, что я делаю рендеринг XNA, но я начал получать исключения из памяти на более крупных моделях, когда я использовал только буфер вершин, поэтому теперь я применил систему индексных буферов. Моя проблема в том, что теперь мне приходится постоянно сканировать список, содержащий все мои Vector3s, для индекса того, который я хочу разместить дальше в моем индексном буфере. Я в настоящее время сканирования для индексов, как это:C# Самый быстрый способ найти индекс элемента в списке
for (int i = 1; i < circleVect.Length; i++)
{
indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i]));
indices.Add(vertices.FindIndex(v3 => v3 == circleVect[i - 1]));
indices.Add(vertices.FindIndex(v3 => v3 == middle));
}
Это прекрасно работает для того, что это довольно медленно, за исключением. Для расчета одного цилиндра требуется почти 1 секунда, и у меня их более 70 000 в моей большой модели. Поэтому я смотрю экран загрузки более 20 минут при загрузке моей более крупной модели и все еще не завершен. Это, к сожалению, просто неприемлемо. Если я попробую загрузить мою меньшую модель, это займет более 5 минут, тогда как неиндексированный загрузчик займет всего секунду или около того.
У меня нет абсолютно никакого формального обучения на C# и даже меньше в XNA, поэтому я знаю, что это, вероятно, очень неэффективный способ расчета индексов, поэтому я бы поэтому его оценил, если бы кто-нибудь из вас мог помочь мне в создании более эффективного импортера ,
PS. При необходимости я могу изменить список на массив, но это будет последний вариант, потому что он потенциально может нанести нагрузку на системную память (вызывая исключение) и будет означать для меня совсем немного кодирования.
Если вершины отсортированы, самым быстрым способом будет использование двоичного поиска. Изменение между списком и массивом ничего не изменит (если вы не используете связанный список). Вы должны опубликовать то, что вы пытаетесь выполнить, а не «как я могу сделать это быстрее», так как я не думаю, что вы можете получить гораздо быстрее, чем то, что у вас есть сейчас, но то, что у вас сейчас, не идеально, и вы, вероятно, должны быть глядя на другие структуры данных. –
Что именно вы хотите знать? Я в основном читаю из формата, который содержит много строк, которые представляют цилиндры. Затем я вычисляю квадрат (на данный момент) на концах бота и четыре квадроцикла для их соединения. Вершины для двух квадратов и их центров добавляются в список, а остальные затем вычисляются, как показано выше, путем определения вектора 3, поиска его индекса и добавления его в список. – Gerharddc
Вы просто пытались использовать IndexOf вместо FindIndex? Определенно накладные расходы связаны с прохождением лямбды для каждой находки. Не сказать, что это ответ, но я думаю, что это может многое помочь. –