1

それぞれ最大 150 個の全画面表示、480x800、フレーム、圧縮 JPEG を含む複数のフレームごとのアニメーションを作成する必要があります。

AnimationDrawable は、最初の 10 フレーム程度で vm 予算を超えてハングします。

タイマーで新しいビットマップをロードする SurfaceView では、フレームレートがかなり遅くなり、おそらく 5 fps 未満になります。

私は OpenGL を初めて使用するので、私の状況で正しい方法であるかどうかを尋ねたかったのですか?

ありがとう!:)

編集:

jpgesの読み込み

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    BitmapFactory.decodeResource(getResources(), R.drawable.y1).compress(Bitmap.CompressFormat.JPEG, 80, stream);
    byeArr.add( stream.toByteArray() );

    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    BitmapFactory.decodeResource(getResources(), R.drawable.y2).compress(Bitmap.CompressFormat.JPEG, 80, stream);
    byeArr.add( stream.toByteArray() );

... and so on.

と遊んで

@Override
public void onTick(long millisUntilFinished) {

    if ( i < byeArr.size() )
    {
    bitMap = BitmapFactory.decodeByteArray ( byeArr.get(i) , 0,  byeArr.get(i).length );
    }

それでも、25 フレームの読み込みには約 3 ~ 5 秒かかります。多分それをスピードアップする方法はありますか?また、空きメモリの量、つまりロードできるフレーム数を確認する方法はありますか?

ありがとう


edit2: 実験的に、配列に約 350 フレームを保持できることがわかりました。これは、約 2 つの完全なアニメーションに非常に適しています。今は、decodeResource がちょっと遅いので、この画像をバイトとして保存し、ほぼリアルタイムで読み込めるようにする方法を見つける必要があります。

edit3: edit 2 では、配列に約 350 フレームを格納できることを確認しました。これは、1 つのアニメーションには十分です。

そのため、現在のアニメーションに必要なフレームをバイト配列にロードして、アニメーションを再生できます。

それでも問題は、フレームを

ByteArrayOutputStream stream = new ByteArrayOutputStream();
BitmapFactory.decodeResource(getResources(), R.drawable.y1).compress(Bitmap.CompressFormat.JPEG, 80, stream);
byeArr.add( stream.toByteArray() );

時間がかかりすぎます。だから私はそれをスピードアップする方法を見つける必要があります。おそらく、すでに jpeg をバイト配列として res または assets に保存する必要があると思いますが、どう思いますか?

4

1 に答える 1

3

アニメーションをビデオ ストリームに変換することから始めて、 MediaMetadataRetriever.getFrameAtTimeを使用してフレームを取得します。適切なフレームを取得することが問題になる場合は、ffmpegなどのライブラリを使用する必要がある場合があります。こちらを参照してください。

別の解決策 - jpeg セットの合計割り当てサイズが十分に小さい場合 - jpeg をバイト配列としてメモリに保持し、必要なときにいつでもBitmapFactory.decodeByteArrayを介してデコードすることができます。これは、1) vm 予算 2) 遅いディスク アクセスに役立ちます。

以下のメソッドを使用して、リソースから生データを取得できます。

byte[] getBytesFromResource(final int res) {
    byte[] buffer = null;
    InputStream input = null;

    try {
        input = getResources().openRawResource(res);
        buffer = new byte[input.available()];
        if (input.read(buffer, 0, buffer.length) != buffer.length) {
            buffer = null;
        }
    } catch (IOException e) {
        buffer = null;
    } finally {
        if (input != null) {
            try {
                input.close();
            } catch (IOException e) {}
        }
    }

    return buffer;
}
于 2012-09-16T07:26:15.927 に答える