5

キャンバスを使用してゲームのメニュー システムを実装しています (特定のパフォーマンス上の理由から、HTML/CSS を使用してメニューを作成することはできません)。JSON を使用して構成されたメニューがあり、menuComponent オブジェクトがそれぞれのプロパティ (x、y、幅、高さ、imagePath など) で作成されます。コンポーネント オブジェクトを反復処理し、componentObjects の draw メソッドを呼び出すメニュー ローダーがあります (もちろん、すべての画像は onload イベントが最初に発生するのを待ちます)。

とにかく、正しい順序で重なり合うように、描画メソッドが呼び出された順序で画像が描画されることを期待しています。ほとんどの場合、この動作は正しいですが、時折間違った順序で描画されることがあります。

私の質問は - Canvas が画像に対して drawMethod が呼び出された順序で画像を描画することを信頼できますか? たとえば、10MBの画像Aと10kbの画像Bがあるとします。画像 A を描画してから画像 B を描画すると、小さい画像であるため、画像 B が最初に読み込まれる可能性はありますか?

私はコードを賢くしようとしていました (コンポーネント オブジェクト内にネストされたコンポーネントを持ち、描画メソッドを再帰的に呼び出す) ため、コードに競合状態が存在する可能性があります。上記の動作が正しいことを確認したいだけです。準備完了フラグが設定されるまでオブジェクトを強制的に待機させるロジックを追加すると、動作するように見えます。しかし、残念ながら、メニューの読み込み時間が遅くなります。

4

2 に答える 2

0

男私は同じ問題に直面し、約3日間立ち往生しています。そして、私は1つの興味深いことを考え出しました。このコード スニペットをよく見て、それについての考えを教えてください。

final ResourceManager rm = new ResourceManager(1000, 1000);
rm.loadImgResource(LandCardResources.INSTANCE.getMeadow(), "meadow", 0, 0);
rm.loadImgResource(LandCardResources.INSTANCE.getHellHorseKnight(), "knight", 150, 150);

リソース マネージャーは、コンテキスト内のすべての画像を保持する BackBufferCanvas を表すオブジェクトです (単純な画像スプライトのように)。コンストラクターは、この Backbuffer を RootPanel に追加する役割も担っているため、すべてが期待どおりに機能したことを確認できます。その後、メインのキャンバスをルートに追加して、完全に機能する ResourceManager インスタンスを使用して backBufferCanvas から描画しようとしています。

canvas.setWidth(500 + "px");
canvas.setHeight(500 + "px");
canvas.setCoordinateSpaceWidth(500);
canvas.setCoordinateSpaceHeight(500);
RootPanel.get().add(canvas);
rm.drawImageFromMetaDb(ctx, 0, 0, 100, 100, 0, 0, 100, 100);
rm.drawImageFromMetaDb(ctx, 150, 150, 100, 100, 50, 50, 100, 100);

そして、それは決して機能しません。しかし、たとえば、rm.drawImage..... を担当するハンドラを使用して Button を rootPanel に追加すると、この Button をクリックすると完全に機能します。mainCanvas の前に backBufferCanvas がアタッチされているため、ロジックが既に遅延している必要があるため、これがなぜ起こっているのか本当に理解できません。

于 2015-08-27T09:08:45.510 に答える