- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在开发过程中,我注意到一个奇怪的“错误”,它只能在 Android 模拟器上重现。我正在使用具有 GPU 加速功能的 x86 版本。请查看以下代码:
public class TestRenderer implements GLSurfaceView.Renderer {
private static final int COUNT = 1000;
private static final int BYTES_PER_FLOAT = 4;
private static final float[] QUAD_VERTICES = new float[] { -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, -0.5f, 0.0f };
private static final int COORDS_PER_QUAD = QUAD_VERTICES.length;
private int fps;
private long startTime = SystemClock.uptimeMillis();
private float[] vertices;
private FloatBuffer vertexBuffer;
private int vertexBufferId;
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
vertices = new float[COUNT * COORDS_PER_QUAD];
vertexBuffer = FloatBuffer.wrap(vertices);
int[] bufferId = new int[1];
GLES20.glGenBuffers(1, bufferId, 0);
vertexBufferId = bufferId[0];
}
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}
@Override
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBufferId);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertices.length * BYTES_PER_FLOAT, vertexBuffer, GLES20.GL_STATIC_DRAW);
/** FPS **/
fps++;
long afterTime = SystemClock.uptimeMillis();
if (afterTime - startTime >= 10000) {
Log.d("FPS", "Renderer FPS: " + fps / 10);
startTime = afterTime;
fps = 0;
}
}
}
这仅用于说明目的。当然什么也不会显示。
此渲染器由 Activity 中的 GLSurfaceView 使用。每一帧,渲染器都会创建一个新的数据存储,其中包含 1000 个四边形顶点的数据。如果模拟器在大约一分钟内保持不变,帧速率开始从 60 FPS 下降到 1 FPS,最终 Activity 挂断。
问题:是我的错还是模拟器有问题?实际设备上不会出现问题。
最佳答案
首先,glBufferData(...)
每次调用它时都会完全重新分配 GPU 上的存储空间。如果你在每一帧都向你的 VBO 提供新数据,你应该考虑分配一次缓冲区,使用标志:GL_DYNAMIC_DRAW
然后调用 glBufferSubData (...)
每一帧。这将限制每帧复制新数据的次数,而不是删除旧的 VBO 内存、分配新内存然后复制数据。
删除和重新创建缓冲区对象在某些实现上可能非常昂贵,并且 VBO 分配的内存实际上将保留在原地,直到所有需要它的未决 OpenGL 操作都从管道中刷新。内存不足可能只是因为您为多个帧缓冲了命令。
glBufferSubData (...)
将强制进行隐式同步,也就是说,它无法覆盖任何尚未完成的命令的数据。它将等待前一帧完成或分配一个临时缓冲区,但无论哪种情况,驱动程序都会根据可用内存量知道哪个操作是合适的。这种行为可能是可取的,即使它可能会对性能产生一些轻微的影响。
关于android - 为什么反复调用 glBufferData 会使模拟器崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20318180/
我有一个小心理障碍:我有一个 html 中的 javascript 函数,可以在按下某个键时写入键码。我已经将它连接到一个函数,该函数可以准确地告诉我按下了什么字符和键码(不包括在内)。 我的问题是如
我上网已经有一段时间了,现在正试图解决这个问题。可以找到正在发生的事情的视频: https://i.gyazo.com/59fc489b6099b513c41aedeed482b8d2.mp4 $(d
我有一个 Python 程序,其中一个函数导入另一个脚本并运行它。但是脚本仅在第一次函数被调用时运行。 def Open_Generator(事件): 导入密码生成器 有什么建议吗? *该函数在 tk
我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防
我在 IBM BlueMix 中的 Node Red 应用程序反复崩溃 - 每小时一次 - 除了“exited with status: 1.”之外没有任何真正的错误消息 如何解决此问题? 是否有来自
我是一名优秀的程序员,十分优秀!