【发布时间】:2018-10-11 04:47:34
【问题描述】:
我从 Google Play 商店收到了我使用 LibGDX 创建的一个 Android 应用程序的崩溃报告。
Huawei MediaPad T3 7 (hwbg2), Android 6.0
java.lang.IllegalStateException:
at com.badlogic.gdx.graphics.glutils.GLFrameBuffer.build (GLFrameBuffer.java:233)
at com.badlogic.gdx.graphics.glutils.GLFrameBuffer.<init> (GLFrameBuffer.java:87)
at com.badlogic.gdx.graphics.glutils.FrameBuffer.<init> (FrameBuffer.java:51)
at com.badlogic.gdx.graphics.glutils.GLFrameBuffer$FrameBufferBuilder.build (GLFrameBuffer.java:474)
at com.badlogic.gdx.graphics.glutils.FrameBuffer.createFrameBuffer (FrameBuffer.java:72)
at com.badlogic.gdx.graphics.glutils.FrameBuffer.createFrameBuffer (FrameBuffer.java:56)
at MY_PACKAGE.editor.Backup.<init> (Backup.java:21)
at MY_PACKAGE.editor.EditingImage.<init> (EditingImage.java:277)
at MY_PACKAGE.screens.EditingScreen.<init> (EditingScreen.java:227)
at MY_PACKAGE.screens.Screens.<init> (Screens.java:42)
at MY_PACKAGE.MAIN_CLASS$2.run (MAIN_CLASS.java:121)
at MY_PACKAGE.screens.SplashScreen.render (SplashScreen.java:93)
at com.badlogic.gdx.Game.render (Game.java:46)
at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame (AndroidGraphics.java:495)
at android.opengl.GLSurfaceView$GLThread.guardedRun (GLSurfaceView.java:1599)
at android.opengl.GLSurfaceView$GLThread.run (GLSurfaceView.java:1295)
GLFrameBuffer.java:233 处的代码
if (result == GL20.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
throw new IllegalStateException("frame buffer couldn't be constructed: incomplete attachment");
EditingImage.java如下
class EditingImage{
public static final int pixmapWidth = 1024;
public EditingImage{
frameBuffer = FrameBuffer.createFrameBuffer(Pixmap.Format.RGB888,pixmapWidth,pixmapWidth,false);
....
for (int i = 0; i < 50; i++){
final Backup backup = new Backup(pixmapWidth);
availableBackups.add(backup);
}
}
}
Backup.java如下
Backup(int width){
frameBuffer = FrameBuffer.createFrameBuffer(Pixmap.Format.RGB888, width, width, false);
....
}
在创建 FrameBuffer 时,应用程序在 Backup.java 中崩溃了(我不知道循环了多少次)。
如您所见,在 EditingImage 中创建的 FrameBuffer 没有崩溃,并且在实例化 Backup 对象之前已经执行。
在我的手机(华为 Y6II)上可以正常使用。也在一些三星手机上进行了测试。
请帮忙!
【问题讨论】:
-
所以您要创建 51 个帧缓冲区?你需要这么多吗?系统可能资源不足。
-
该应用程序是一个着色应用程序。每次用户着色时,我都会使用主 FrameBuffer 将备份复制到备份 FrameBuffer,以便用户可以“撤消”和“重做”。由于有 50 个备份帧缓冲区,用户可以撤消 50 次。
-
@Columbo 如果我将备份减少到 20,那么它会正常工作吗?我没有应用崩溃的设备来测试这个。
-
不确定 - 如果您减少到 20,我希望它很有可能工作。也许您应该捕获异常,并使用它来限制可用撤消缓冲区的数量。另一种方法是尝试重新编写代码,以便您的每个备份都不是帧缓冲区,它们只是纹理,甚至是保存到应用程序临时文件夹中的图像。我对 libgdx 一点也不熟悉,所以无法提供太多关于如何实现这一点的指导。
-
检查桌面版本的内存使用情况。 IE。在 Windows、Mac 或您进行开发的任何地方运行您的应用程序,打开一些任务管理器并检查您的应用程序正在分配的内存。它是不断增长(您有一些内存泄漏)还是处于恒定水平(预期行为)。
标签: java android opengl-es libgdx opengl-es-2.0