2

我有大约 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。

4

2 回答 2

1

除了确保 GC 不会启动之外,您还可以在单​​独的线程上进行所有位图生成和纹理上传,如我对类似问题的回答中所述:Threading textures load process for android opengl game

当上传本身需要很长时间时,这将防止您出现小丢帧。

于 2013-11-02T10:37:41.830 回答
0

最后我解决了它,但不是使用本机代码,也不是使用 EGL_image,而是感谢这个视频。幸运的是,我几乎拥有 256x256 的所有纹理,并且我的目标是 Android 3.2 及更高版本,因此对于这种情况,有一个简单的解决方案:

BitmapOptions.inBitmap将为每个新图块重用一个Bitmap,因此不再有 furios GC-ing。我不得不放大几个小于 256x256 的位图。

于 2013-02-05T11:12:34.847 回答