Вы можете использовать идеальный по пикселям подбор, который очень хорошо масштабируется до огромного количества объектов (и имеет преимущество в качестве идеального по пикселям).
По сути, вы визуализируете свою сцену, используя уникальный цвет для каждого объекта. Затем вы превращаете backbuffer в текстуру и возвращаете данные текстуры, наконец, вы можете просто проверить пиксель под мышью и выяснить, на каком объекте находится мышь.
Вы можете быть умным в отношении информации, которую вы получаете, вы можете запросить только один пиксель, над которым находится мышь.
Color[] pixel = new Color[1];
texture.GetData(pixel, mousePosition.Y * texture.Width + mousePosition.x, 1);
//pixel[0] == colour of the item the mouse is over. You can now look this up in a dictionary<Color, item>
Вы должны быть осторожны, чтобы не остановить конвейер, выполняя это (заставляя ЦП ждать, пока ГП выполнит рендеринг). Лучший способ сделать это - поменять местами 2 цели рендеринга и всегда GetData из цели рендеринга, которую вы использовали в последнем кадре. Это означает, что данные устарели, но ни у одного человека нет быстрых реакций, чтобы заметить это.
Добавление в ответ на ваш комментарий.
Чтобы назначить уникальный цвет каждому объекту, просто увеличьте байт для каждого объекта. Когда этот байт переполняется, инкремент увеличивается, а когда этот переполняется, увеличивается другой; Затем вы можете использовать эти три байта как красный, зеленый и синий. Помните, чтобы держать альфа на максимальном значении, вы не хотите, чтобы сквозь объекты!
Чтобы разрешить задний буфер немного изменен в XNA4. Теперь вы должны выполнить рендер-объект и разрешить его. Сделать это довольно просто, и обрисовано в общих чертах Шоном Харгривзом здесь