gpt4 book ai didi

android - OpenGL ES 2.0 顶点错误垃圾收集器 (Android)

转载 作者:行者123 更新时间:2023-11-30 02:54:43 27 4
gpt4 key购买 nike

我在 android 上使用 opengl-es 2.0 绘制一个简单的三角形(在 nexus4 上测试)。

在连续绘制模式下,我使用旋转矩阵旋转这个三角形,并在顶点着色器中设置 uMVPMatrix。

问题

我是 open gl 的新手,但这是非常基本的并且效果很好,但大约 30 秒后垃圾收集器开始工作:

05-05 19:12:23.359  26333-26357/com.x.app V/Renderer﹕ Surface created
05-05 19:12:23.369 26333-26357/com.x.app V/Renderer﹕ Changed surface width:1196 height: 768
05-05 19:12:59.307 26333-26357/com.x.app D/dalvikvm﹕ GC_FOR_ALLOC freed 436K, 5% free 9121K/9588K, paused 64ms, total 65ms
05-05 19:13:48.910 26333-26357/com.x.app D/dalvikvm﹕ GC_FOR_ALLOC freed 522K, 6% free 9105K/9664K, paused 31ms, total 31ms
05-05 19:14:39.144 26333-26357/com.x.app D/dalvikvm﹕ GC_FOR_ALLOC freed 512K, 6% free 9104K/9664K, paused 13ms, total 13ms

在第二轮 GC 之后,屏幕上出现了另一个矩形,有时是一条线。 Vertex bug after second garbage collector run Another image here

运行一两次垃圾收集器后,它又消失了,这种情况一遍又一遍地发生。

我猜着色器代码和 java 之间存在某种绑定(bind),但我犯了大错。

我的代码

我的三角形绘制方法:

 public void draw(float[] mMVPMatrix) {
GLES20.glUseProgram(mProgram);
int mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
GLES20.glDisableVertexAttribArray(mPositionHandle);
}

顶点缓冲区(三角形构造函数):

    ByteBuffer bb = ByteBuffer.allocateDirect(
triangleCoords.length * 4);
bb.order(ByteOrder.nativeOrder());
vertexBuffer = bb.asFloatBuffer();
vertexBuffer.put(triangleCoords);
vertexBuffer.position(0);
vertexCount=triangleCoords.length;

最佳答案

您应该使用 DDMS “开始跟踪”“获取分配” 按钮来跟踪内存分配。它会告诉你所有的分配。更多信息:http://developer.android.com/tools/debugging/ddms.html#alloc

查看您的代码,我强烈建议您在编译着色器并将这些值存储在 int 变量后立即调用 GLES20.glGetUniformLocation 一次。通过字符串标识符查找制服/属性非常耗时,我大胆猜测它还会分配一些内存(不多,但您每个帧都这样做)。不要在每次绘制调用时都这样做。

除此之外,这个问题与 OpenGL ES 无关,这是一个常见的垃圾回收问题,您可以在 DDMS 中轻松跟踪。

关于android - OpenGL ES 2.0 顶点错误垃圾收集器 (Android),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23478232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com