我正在使用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()时,游戏不再崩溃。唯一的缺点是性能下降。

将glewExperimental和glewInit()放在main()函数或display()回调函数中也不起作用。该应用将在崩溃前的前2分钟内编译并正常运行。

如果是GLEW错误,如何解决此问题? (无需在游戏开始时预先渲染圆圈)。

用于绘制圆的代码片段:
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);
}

最佳答案

看到实际的代码,而不只是看屏幕快照,将是很不错的,但是看起来您每次绘制时都在生成一个新的顶点数组,但是在此之后它会失败...

我怀疑您实际上并没有删除这些顶点数组,并且给定足够长的时间,您将耗尽资源并且调用失败。如果不检查错误,最终将导致崩溃。

确实,除非有必要,否则您不应该重新生成该阵列,如果需要,请确保删除旧阵列。

关于c++ - 动态生成对象的glewInit()错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14467810/

10-09 03:09