2

私は現在、Android上のOpenGL ES 1.0を介してビデオフレームを(ビットマップとして)表示するシステムに取り組んでいます。私の問題は、約10fpsを超えることができなかったことです。

いくつかのテストを行った結果、最大のボトルネックの1つは、ビットマップの幅と高さの両方を2の累乗にする必要があることであると判断しました。たとえば、640x480のビデオは1024x1024にスケールアップする必要があります。スケーリングなしでは、約40〜50 fpsを取得できましたが、テクスチャが白く表示されるだけで、うまくいきません。

OpenGL ES 2.0が2つのテクスチャの非パワーの使用をサポートしていることは知っていますが、シェーダー/2.0のその他の新しいものの経験はありません。

この問題を回避する方法はありますか?私が持っているものと比較して、他のビデオ再生はどのようにそのような良いパフォーマンスを得るのですか?参考のためにいくつかのコードを含めました。

private Bitmap makePowerOfTwo(Bitmap bitmap)
{
    // If one of the bitmap's resolutions is not a power of two
    if(!isPowerOfTwo(bitmap.getWidth()) || !isPowerOfTwo(bitmap.getHeight()))
    {
        int newWidth = nextPowerOfTwo(bitmap.getWidth());
        int newHeight = nextPowerOfTwo(bitmap.getHeight());

        // Generate a new bitmap which has the needed padding
        return Bitmap.createScaledBitmap(bitmap, newWidth, newHeight, true);
    }
    else
    {
        return bitmap;
    }
}

private static boolean isPowerOfTwo(int num)
{
    // Check if a bitwise and of the number and itself minus one is zero
    return (num & (num - 1)) == 0;
}

private static int nextPowerOfTwo(int num)
{
    if(num <= 0)
    {
        return 0;
    }

    int nextPowerOfTwo = 1;

    while(nextPowerOfTwo < num)
    {
        nextPowerOfTwo <<= 1; // Bitwise shift left one bit
    }

    return nextPowerOfTwo;
}
4

1 に答える 1