私は基本的な 2D タイル ゲームの作成に取り組んできましたが、1 秒または 2 秒ごとに約 100 ~ 200 ミリ秒続く顕著な一時停止の原因を特定できませんでしたが、アプリをプロファイリングしたときのように GC が一時停止しているように見えます。各ゲーム ループは60 fps のターゲットで約 4 ミリ秒かかります。これは、必要な制限 (16 ミリ秒) 内で十分に実行されていることを意味します。
私が知る限り、オブジェクト変数をそれらを使用する関数の外に移動したので、オブジェクト変数は範囲外に出ないようになったため収集されませんが、まだ一時停止しています。
各ゲーム ループでは、タイルは単純に 1 ピクセル左に移動され (ゲーム フレームの滑らかさを示すため)、それとは別に、呼び出されるのはこの描画マップ関数だけです: (注: これらの関数は、私のエンジン オブジェクトの一部として定義されています。起動時にこれらの関数が作成されず、呼び出されるたびに収集されるのは本当ですか?)。
engine.map.draw = function () {
engine.mapDrawMapX = 0;
engine.mapDrawMapY = 0;
// Just draw tiles within screen (and 1 extra on both x and y boundaries)
for (engine.mapDrawJ = -1; engine.mapDrawJ <= engine.screen.tilesY; engine.mapDrawJ++) {
for (engine.mapDrawI = -1; engine.mapDrawI <= engine.screen.tilesX; engine.mapDrawI++) {
//calculate map location (viewport)
engine.mapDrawMapX = engine.mapDrawI + engine.viewport.x;
engine.mapDrawMapY = engine.mapDrawJ + engine.viewport.y;
engine.mapDrawTile = (engine.currentMap[engine.mapDrawMapY] && engine.currentMap[engine.mapDrawMapY][engine.mapDrawMapX]) ? engine.currentMap[engine.mapDrawMapY][engine.mapDrawMapX] : '';
engine.tile.draw(engine.mapDrawI, engine.mapDrawJ, engine.mapDrawTile);
}
}
};
そして、各タイルを描画するために呼び出されるメソッドは次のとおりです。
engine.tile.drawTile = new Image(0,0);
engine.tile.draw = function (x, y, tile) {
if ('' != tile) {
engine.tile.drawTile = engine.tile.retrieve(tile); //this returns an Image() object
engine.context.drawImage(engine.tile.drawTile,
x * TILE_WIDTH + engine.viewport.offsetX,
y * TILE_HEIGHT + engine.viewport.offsetY,
TILE_WIDTH, TILE_HEIGHT);
} else {
engine.context.clearRect(x * TILE_WIDTH, y * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
}
};
リクエストに応じて、ストアとリトリーブ関数は次のとおりです。
engine.tile.store = function (id, img) {
var newID = engine.tile.images.length;
var tile = [id, new Image()];
tile[1] = img;
engine.tile.images[newID] = tile; // store
};
engine.tile.retrieveI;
engine.tile.retrieve = function (id) {
//var len = engine.tile.images.length;
for (engine.tile.retrieveI = 0; engine.tile.retrieveI < engine.tile.images.length; engine.tile.retrieveI++) {
if (engine.tile.images[engine.tile.retrieveI][0] == id) {
return engine.tile.images[engine.tile.retrieveI][1]; // return image
}
}
//return null;
};