1

preloadjs の LoadQueue クラスで使用するマニフェスト配列を設定しています。マニフェストでは、オーディオ ファイルと画像ファイルの両方のソースを参照しながら、それぞれに一意の ID を作成しています。これはすべてうまく機能していました。

ただし、音声/画像ファイルは CMS データベース (Wordpress カスタム投稿タイプ) から選択されているため、同じ音声が複数回選択される場合があります。つまり、同じオーディオ ファイルがマニフェストに複数回表示される場合があります。これが発生すると、結果の LoadQueue インスタンスの最後の IMAGE 参照が「未定義」を返す非常に奇妙なバグが発生します。マニフェスト配列のどこで重複したオーディオが発生しても問題ありません。それは常に、未定義を返す LoadQueue インスタンスの最後の IMAGE オブジェクトです。

重複したイメージ ファイルは問題を引き起こしません。

これは preloadjs のバグですか? (もちろん、同じ音声ファイルの複数のコピーをロードするのは無駄ですが、私の使用例では、小さなファイルと限られた数の投稿について話しています)

var manifest = [];

for (var i = 0; i < game_pieces_data.length; i++) {

    manifest.push({id: "sound" + i, src: game_pieces_data[i].audio_url});
    manifest.push({id: "image" + i, src: game_pieces_data[i].image_url});
}

preload = new createjs.LoadQueue();
preload.installPlugin(createjs.Sound);
preload.on("complete", handlePreloadComplete, this);
preload.loadManifest(manifest);

function handlePreloadComplete() {

    var bitmap;

    for (var i = 0; i < game_pieces_data.length; i++) {

        bitmap = new createjs.Bitmap(preload.getResult('image' + i));

        // bitmap.image.width <- will return undefined for last item of
        // the loop if one of the audio files is a duplicate?
    ...
    }
}

編集: LoadQueue の「完了」イベントは、最後の「fileLoad」イベント (最後の画像) が発生する前に発生していると判断しました。これが、「完了」イベントのハンドラーで要求されたときに最終的な画像が未定義になる理由です。繰り返しますが、これは重複したオーディオ ファイルがある場合にのみ発生します。

EDIT2: 問題をさらに絞り込むために、オーディオ ファイルのみをロードするマニフェストを作成し、「fileload」イベントと「complete」イベントをトレースしました。追加の複製オーディオ ファイルごとに、そのファイルに対して発生する「fileload」イベントの数が 1 ずつ増加します (2 回の重複 = そのファイルに対して fileload が 3 回発生し、3 回の重複 = そのファイルに対して fileload が 4 回発生するなど)。さらに、余分なコピーがファイルの LoadQueue インスタンス配列に追加されます (getResult によってアクセスされます)。

ただし、「完了」イベントはマニフェストの長さに達すると発生するため、完了イベントの後に追加の fileloaded イベントが発生します。これによる害は、ファイルが混在するマニフェストがある場合に発生します。私の場合、作成された余分な重複オーディオ ファイルによって、画像ファイルがキューの最後にプッシュされています。また、「完了」はマニフェストの長さの最後で正しく起動されるため、キューの最後にプッシュされた画像ファイルがロードされる前に起動され、キューの完了後にそれらのファイルがそこにあることを期待するコードでエラーが発生します。

オーディオ用と画像用の 2 つの LoadQueue インスタンスを作成することで、これを回避しています。オーディオ キューが「完了」すると、画像を作成し、別のマニフェストから読み込みます。ただし、メモリ内に複製されたオーディオ ファイルの無用な複製が複数あるように見えるため、これは考えではありません。そして、この数は、CMS で選択される複製が追加されるたびに指数関数的に増加します。

4

0 に答える 0