freeglutとglewを使ってConnect4ゲームを作っています。これが私のゲームの見た目です。円(白/赤/青)は、display()関数のすべてのコールバックでレンダリングされる唯一のオブジェクトでした。
Circle * ChessPiece = new Circle(0.08f);
アプリを約2分間放置すると、次のエラーメッセージが表示されてクラッシュしたことを除いて、すべてが正常に機能しました。
この問題を解決する方法は、glGenVertexArrays()のすぐ上にこれらの2行を追加することでした。
glewExperimental = GL_TRUE;
glewInit();
これはうまくいきました。ただし、パフォーマンスが低下しました(円がレンダリングされるたびに、display()がコールバックされるたびに、glewInit()が呼び出されたため)。
パフォーマンスを向上させるために、display()コールバック関数内にglewExperimentalとglewInit()を配置しようとしましたが、2分間実行してもアプリがクラッシュしました。
もう1つの回避策は、最初にすべての円を事前にレンダリングし、ゲームの進行に合わせて色を変更することでした。これもうまくいきました。ただし、ゲームの開始時ではなく、ゲームの進行中に動的にサークルを生成したいと思います。
だから、私の質問は:
これは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);
}