私は現在、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;
}