我有大约 2 GiB 的未压缩 RGBA 8888 格式的纹理(都是 256x256 瓦片)(RGB 565 纹理格式不是一个选项,因为有很多平滑的渐变和灰色阴影,它们具有 565 格式的绿色色调)。所以我按需加载它们,当它们应该变得可见并删除旧的时。问题是,当我将它们上传到 OpenGL 时,会出现令人讨厌的 FPS 下降。当前使用 OpenGL ES 1.1。
我在一个单独的线程中解码纹理(即 BitmapFactory.decodeStream(...)),然后将位图发送到 GL 线程并将其作为纹理上传。发生这种情况时,GL 线程有时会因为此上传而变慢一点。我测量了纹理上传时间,大部分时间在 1-8 毫秒之间,平均约为 2 毫秒。但有时它是 40-70 毫秒。什么会导致这种下降?
我还在 GPU 上生成 mipmap(禁用 mipmap 不会影响此行为),这是所有纹理参数:
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_MIN_FILTER, GLES11.GL_LINEAR_MIPMAP_NEAREST);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_MAG_FILTER, GLES11.GL_LINEAR);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_WRAP_S, GLES11.GL_CLAMP_TO_EDGE);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_TEXTURE_WRAP_T, GLES11.GL_CLAMP_TO_EDGE);
GLES11.glTexParameterf(GLES11.GL_TEXTURE_2D, GLES11.GL_GENERATE_MIPMAP, GLES11.GL_TRUE);
GLES11.glTexEnvx(GLES11.GL_TEXTURE_ENV, GLES11.GL_TEXTURE_ENV_MODE, GLES11.GL_MODULATE);
GLUtils.texImage2D(GLES11.GL_TEXTURE_2D, 0, GLES11.GL_RGBA, bmp, 0);
我怎样才能做得更好?例如,当他们需要每秒加载和显示许多帧时,Open GL 视频播放器是如何完成的?还是当前将页面呈现为图块的网络浏览器?EGL_image 是一个值得一看的好选择吗?OpenGL ES 2.0 会有所不同吗?
编辑: 加载速度变慢是因为 GL 线程上的 GC-ing。