есть такая штука называет "рейтинг сортировки".
перед сортировкой он считается для статических объектов один раз, для динамических при передвижении пересчитывается.
работает например так:

Код:
static: rating = ( y << 9 ) | ( x << 1 ) | 0;
dynamic: rating = ( y << 9 ) | ( x << 1 ) | 1;
потом можно использовать код выше, только сортировать не по полям, х/у, а по полю ratang, которое у большинства объектов не меняется. таким образом все динамические объекты всегда будут поверх статических. ну ещё кучу оптимизаций к этому методу можно применить.