В основном я пытаюсь сделать мозаичный движок в XNA 2D, и в настоящее время я использую большой список Tiles (мой класс, содержащий все данные для плитки) и выбрав те, которые находятся в диапазоне моего вида, а затем отображают их на экран.Самый эффективный способ выбора ряда классов из большого списка классов?
Проблема у меня есть, очевидно, чем больше мой общий список плиток становится больше лаг, который я испытываю при попытке выбрать Плитки в радиусе действия. Я в настоящее время использую Linq внутри для цикла, чтобы выбрать плитку, например, так:
//loop from the maximum view at the top of the screen to the maximum view at the bottom
for (int height = topView; height < bottomView; height++)
{
//loop from the maximum view to the left of the screen to the maximum view of the right
for (int width = leftView; width < rightView; width++)
{
//select the tile at this grid position
Tile t = tileList.Where(x => x.GridPosition == new Vector2(width, height)).FirstOrDefault();
if (t != null)
{
//calculate the screen position and add it to the list of local tiles within range
t.ScreenPosition = new Vector2(screenWidth * 30, screenHeight * 30);
localList.Add(t);
}
else
{
//the tile wasn't found, add a random blank one to fill the gap.
Tile brokenTile = new Tile(game, new Vector2(width, height), 9001);
brokenTile.ScreenPosition = new Vector2(screenWidth * 30, screenHeight * 30);
localList.Add(brokenTile);
}
//increment the screen width used to calculate the screen position
screenWidth++;
}
//increment the screen height used to calculate the screen position and reset the width
screenHeight++;
screenWidth = 1;
}
мне интересно, если есть способ сделать это более эффективно, в идеале сократить отставание опытной при увеличении общего размера «карты» и выбора этих плиток в радиусе действия.
Единственное, что я могу придумать, это как-то разбить общий список на «куски», когда карта загружена, и только смотреть в каждом куске, чтобы вытащить Плитки. Однако я не совсем уверен, как я 'd делать это, потому что это может быть проблемой, если мне нужно вытащить узлы из нескольких «кусков». Любая помощь по хорошему способу сделать это тоже будет здорово!
Спасибо большое! :)
Edit: вот несколько скриншотов: http://i.imgur.com/RJmSYYF.png по сравнению с http://i.imgur.com/LgwB8CJ.png
Подумайте о своем алгоритме, нужно ли быть O (N^3)? Можете ли вы кэшировать некоторые результаты? – oleksii