找出你的顯示窗口的大小,只迭代是在它內部的塊。
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;
跳過繪製在所有如果沒有什麼是改變。
預先加載了紋理/圖像嗎?或者,您是在每次繪製圖像時加載圖像? – eazimmerman 2011-12-20 21:33:21
所有紋理都已預加載 – 2011-12-20 21:35:56
「忘記」是如何知道您提供的座標是否「在遊戲窗口內?」 (例如,是什麼'Forgotten.isInsideGameWindow'辦?)如果它比較'x'和'y'您提供一些其他'x'和'y',然後an't你剛纔繪製圖像在其他'X '和'y'並且完全避免循環? – 2011-12-20 21:36:37