我正在使用 freeglut 和 glew 制作 Connect4 游戏。这就是我的游戏的外观。圆圈(白色/红色/蓝色)是在每次调用 display() 函数时呈现的唯一对象。
Circle * ChessPiece = new Circle(0.08f);
一切都很好,除了如果我让应用程序静置约 2 分钟,它会崩溃并显示以下错误消息:
我解决这个问题的方法是在 glGenVertexArrays() 正上方添加这两行
glewExperimental = GL_TRUE;
glewInit();
这行得通。但是,它会导致性能下降(因为 glewInit() 每次渲染一个圆圈时都会调用一次 display() 回调)。
我尝试将 glewExperimental 和 glewInit() 放在 display() 回调函数中,希望提高性能,但应用程序在运行 2 分钟后仍然崩溃。
另一种解决方法是在一开始就预渲染所有圆圈,然后随着游戏的进行更改颜色。这也有效。但是,我更喜欢在游戏过程中动态生成圆圈,而不是在游戏开始时。
所以,我的问题是:
这是一个 GLEW 错误吗?或者这是我的代码问题?我之所以认为它是一个 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);
}