我正在使用freeglut和glew制作Connect4游戏。这就是我的游戏外观。圆圈(白色/红色/蓝色)是display()函数每次回调时呈现的唯一对象。
Circle * ChessPiece = new Circle(0.08f);
每件事情都运行良好,但如果我让应用程序停留约2分钟,它会崩溃,并显示以下错误消息:
我解决这个问题的方法是在glGenVertexArrays()上方添加这两行
glewExperimental = GL_TRUE;
glewInit();
这很有用。但是,它导致性能下降(因为每次显示一个圆圈时都会调用glewInit(),在每次display()回调时都会调用。
我试图将glewExperimental和glewInit()放在display()回调函数中,以期提高性能,但应用程序在运行2分钟后仍然崩溃。
另一种解决方法是在开始时预渲染所有圆圈,然后随着游戏的进行改变颜色。这也有效。但是,我宁愿在游戏进程中动态生成圆圈,而不是在游戏开始时。
所以,我的问题是:
这是一个GLEW错误吗?或者这是我的代码问题?我之所以认为它是一个疯狂的错误,是因为当我在glGenVertexArrays()之前添加glewExperimental和glewInit()时,游戏不再崩溃。唯一的缺点是巨大的性能损失。
在main()函数或display()回调函数中放置glewExperimental和glewInit()也不起作用。该应用程序将在崩溃前的前2分钟编译并运行正常。
如果是GLEW错误,我该如何解决这个问题? (无需在游戏开始时预先渲染圆圈。)
用于绘制圆圈的代码snipet:
void Circle::draw(float x, float y, float z)
{
//Codes to generate circle vertices
//These stop the app from crashing after 2 minutes, but I don't want to use them
//glewExperimental = GL_TRUE;
//glewInit();
glGenVertexArrays(1, &vertexArray_Circle);
glBindVertexArray(vertexArray_Circle);
glGenBuffers(1, &vertexBuffer_Circle);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer_Circle);
glBufferData(GL_ARRAY_BUFFER, (sizeof(Circle_vertices)/sizeof(float))*sizeof(GLfloat), Circle_vertices, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
//Draw circle
glBindVertexArray(vertexArray_Circle);
glVertexAttrib3f((GLuint)1, RED, GREEN, BLUE);
glDrawArrays(GL_TRIANGLE_FAN, 0, index/3);
glDisableVertexAttribArray(0);
}
答案 0 :(得分:2)
很高兴看到实际的代码,而不仅仅是它的屏幕截图,但看起来你每次绘制时都会生成一个新的顶点数组,并且它在此之后就会失败... < / p>
我怀疑你实际上并没有删除那些顶点数组,并且给定时间足够长,你的资源已经耗尽而且调用失败了。在不检查错误的情况下,您最终会崩溃。
除非必要,否则你不应该重新生成数组,如果是,请确保删除旧数组。