Poi*_*ull 45 android hardware-acceleration android-3.0-honeycomb
我正在尝试在Honeycomb中启用hw加速,并在Canvas上显示一些Bitmaps.一切正常,但对于大位图(一维> 2048),我在日志中得到错误:
OpenGLRenderer:位图太大而无法上传到纹理中
我知道这是因为hw限制,并且可以通过减少最大位图大小来解决它,如果启用了hw加速(由View.isHardwareAccelerated()检查).
我的问题是:如何轻松确定硬件可用于位图绘制的最大纹理大小.2048似乎是对我的设备的限制,但它可能在不同的设备上有所不同.
编辑:我不是创建OpenGL应用程序,只是普通的应用程序,它可以利用hw加速.因此我根本不熟悉OpenGL,我只是在日志中看到OpenGL相关的错误,并期待解决它.
Rom*_*Guy 65
目前最小限制是2048px(即硬件必须支持纹理至少2048x2048.)在ICS中,我们将在Canvas类中引入一个新的API,它将为您提供以下信息:
Canvas.getMaximumBitmapWidth()和Canvas.getMaximumBitmapHeight().
Pkm*_*mte 16
获得最大允许大小的另一种方法是遍历所有EGL10配置并跟踪最大尺寸.
public static int getMaxTextureSize() {
    // Safe minimum default size
    final int IMAGE_MAX_BITMAP_DIMENSION = 2048;
    // Get EGL Display
    EGL10 egl = (EGL10) EGLContext.getEGL();
    EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
    // Initialise
    int[] version = new int[2];
    egl.eglInitialize(display, version);
    // Query total number of configurations
    int[] totalConfigurations = new int[1];
    egl.eglGetConfigs(display, null, 0, totalConfigurations);
    // Query actual list configurations
    EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
    egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
    int[] textureSize = new int[1];
    int maximumTextureSize = 0;
    // Iterate through all the configurations to located the maximum texture size
    for (int i = 0; i < totalConfigurations[0]; i++) {
        // Only need to check for width since opengl textures are always squared
        egl.eglGetConfigAttrib(display, configurationsList[i], EGL10.EGL_MAX_PBUFFER_WIDTH, textureSize);
        // Keep track of the maximum texture size
        if (maximumTextureSize < textureSize[0])
            maximumTextureSize = textureSize[0];
    }
    // Release
    egl.eglTerminate(display);
    // Return largest texture size found, or default
    return Math.max(maximumTextureSize, IMAGE_MAX_BITMAP_DIMENSION);
}
从我的测试来看,这非常可靠,并且不需要您创建实例.性能方面,我在Note 2上执行了18毫秒,在G3上只执行了4毫秒.
如果您想要动态了解设备的纹理大小限制(因为它的更改取决于设备),您必须调用此方法:
int[] maxTextureSize = new int[1];
gl.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
并且不要忘记,对于某些设备(例如Nexus One),纹理大小必须是2的幂!
我知道我的答案在上一次更新这个主题后很长一段时间...抱歉
| 归档时间: | 
 | 
| 查看次数: | 27118 次 | 
| 最近记录: |