Определите размер вашего окна отображения и просматривайте только те блоки, которые находятся внутри него.
final int tile_size = 30;
final RectangleType displayWindow = Forgotten.getDisplayWindow ();
final int left = displayWindow.getLeft () / tile_size - 1;
final int right = displayWindow.getRight () / tile_size + 1;
final int top = displayWindow.getTop () / tile_size - 1;
final int bottom = displayWindow.getBottom () / tile_size + 1;
for (int y = top; y < bottom; ++y)
for (int x = left; x < right; ++x)
canvas.drawImage (LevelGen.getBlockAt (x,y).getTexture (),
x * tile_size, y * tile_size);
Вы также можете выяснить, какие области холста на самом деле хотят рисовать, и вместо этого оставить список «грязных прямоугольников» для перерисовки областей. Всякий раз, когда плитка изменяется или когда спрайт / частица / что-либо проходит через ее пространство, добавьте эту плитку в прямоугольник. Даже если вы просто используете один грязный прямоугольник, который увеличивается, чтобы охватить все обновления в течение кадра, если в вашей игре фактически не происходит "что-то происходящее" во всех точках на дисплее все время, частота кадров в среднем будет выше ( но страдают от масштабных эффектов)
с учетом этого:
public class Map {
private Rectangle dirtyRect = null;
public void dirty (Rectangle areaAffected) {
if (null == dirtyRect) {
dirtyRect = areaAffected; return;
}
dirtyRect = new Rectangle ( Math.min (dirtyRect.getLeft (),
areaAffected.getLeft () ),
Math.min (dirtyRect.getTop (),
areaAffected.getTop () ),
Math.max (dirtyRect.getRight (),
areaAffected.getRight () ),
Math.max (dirtyRect.getBottom (),
areaAffected.getBottom () ));
}
Затем используйте грязный прямоугольник вместо displayWindow
для нормального рисования, и вы можете проверить if (null == getDirtyRectangle ()) return;
, чтобы вообще пропустить рисование, если ничего не изменилось.