2

我目前正在开发一个通过 Android 上的 OpenGL ES 1.0 显示视频帧(作为位图)的系统。我的问题是我无法获得超过 10 fps 的速度。

在进行了一些测试之后,我确定最大的瓶颈之一是位图的宽度和高度都必须是 2 的幂。例如,必须将 640x480 视频放大到 1024x1024。在没有缩放的情况下,我能够获得大约 40-50fps,但纹理只是看起来是白色的,这对我没有好处。

我知道 OpenGL ES 2.0 支持使用两个纹理的非幂,但我对着色器/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

5

仅仅因为纹理必须是 2 的幂,并不意味着您的数据必须是 2 的幂。

您可以在初始化期间自由创建 1024x1024(或 1024x512)纹理,使用glTexImage用您的位图数据填充较低的 640x480 glTexSubImage,然后使用一些智能 texcoords 显示纹理的较低 640x480 (0,0) to (640/1024, 480/1024)。纹理的其余部分将只包含从未见过的空白空间。

于 2012-06-18T23:52:55.353 回答