2

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);
}
4

1 に答える 1

2

スクリーンショットだけでなく、実際のコードを確認するのもよいでしょうが、描画するたびに新しい頂点配列を生成しているように見え、この直後に失敗します...

これらの頂点配列を実際に削除しているのではなく、十分な時間が与えられていると、リソースが不足していて、呼び出しが失敗しているのではないかと思います。エラーをチェックしないと、クラッシュしてしまいます。

実際には、必要な場合を除いてアレイを再生成しないでください。再生成する場合は、必ず古いアレイを削除してください。

于 2013-01-22T21:02:08.707 に答える