Вы можете распределить нагрузку для этой операции по времени, сохранив еще два массива, один для строк пикселей и один для столбцов пикселей, поэтому для этапа 800x600 у вас будет массив xBounds из 800 элементов и массив yBounds из 600 элементов.
Каждый элемент каждого массива будет массивом ссылок на все спрайты, у которых есть граница, попадающая на этот пиксель (или ноль, если ни один не использует этот столбец / строку). Таким образом, каждый спрайт будет иметь две записи в каждом массиве; один для минимального х связанного, один для макс.
Каждый раз, когда вы перемещаете, изменяете размер, поворачиваете или иным образом изменяете границы спрайта, вам придется обновлять эти списки, удаляя старые значения min и max из каждого из ваших двух списков и добавляя их в на новых позициях.
Таким образом, ваши общие границы для всех спрайтов на экране - это просто самые низкие и самые высокие используемые индексы в каждом из этих двух массивов.
Для дополнительной скорости вы, скорее всего, также захотите сохранить минимальное и максимальное значения для x и y и изменять их только в том случае, если действие спрайта изменит их. Таким образом, если спрайт помещен ниже минимума или выше максимума, вы можете обновить значение простым присваиванием нового минимума или максимума; и если спрайт был единственным элементом в массиве для текущего минимального столбца и был перемещен выше, то вы должны выполнить цикл от старого минимума до новой позиции спрайта и установить новый минимум для первого занятого элемента массива (и то же самое, но напротив столбца max).
Используя массивы, это решение будет использовать пару килобайт памяти, и иногда требуется зацикливание на части массива. Более оптимально, вы можете заменить массивы классом «отсортированный список»: вероятно, не стоит времени разработчика / сопровождающего для дополнительной сложности, но использование некоторой формы самобалансирующегося двоичного дерева может добавить небольшую скорость и сэкономить немного памяти, что может иметь значение, если у вас много спрайтов, часто перемещающихся, с большим экраном, медленным процессором и небольшим объемом памяти.
В любом случае, обязательно обработайте случай, когда массивы пусты, потому что спрайты не отображаются.