我使用Code :: Blocks(C++)和MinGW在Windows上的OpenGL中製作遊戲。所有的繪圖和邏輯都很好,遊戲完美無缺。直到突然,它沒有。經過一些隨機時間量,遊戲Segfaults。像GL段錯誤一樣,堆棧跟蹤是無益的。我唯一得到的是segfault發生在供應商的OpenGL實現中。我已經在不同廠商的多個顯卡上測試過了,他們都是這樣做的,所以問題就在我身上。glDrawArrays上的OpenGL Segfaulting
我通過gDEBugger運行程序並得到了相同的無用堆棧跟蹤。大聲笑。我也使用了GLIntercept,但沒有跳出來對我。所以我開始尋找手動方式的段錯誤(BuGLe拒絕編譯...),並基本上將跟蹤消息寫入日誌。我已經縮小到一次調用glDrawArrays。我在互聯網上做了大量的嘗試,並嘗試了很多我找到的修復方法。
因爲這個遊戲沒有爲便攜性編碼,我一直猶豫在葡萄酒和valgrind中運行它。在我開始討論這個奇妙的混亂之前,如果你能看看我的代碼並找到錯誤,我會很感激。 (我敢肯定,這東西很明顯...)
(注:爲便於閱讀,我已經刪除了所有我的跡線中)
void PlayerShip::Render()
{
glPushMatrix(); //Save the current state
glTranslatef(m_PosX, m_PosY, 0);
glRotatef(vect.Rotation - 90, 0, 0, 1); //Matrixes are applied in reverse order
double xl = m_SizeX/2, yl = m_SizeY/2; //Get values to add/subract to the midpoint for the corners
glEnable(GL_TEXTURE_2D); //Redundant
TextureManager::Inst()->BindTexture(TexIDs::Playership01); //Bind the texture
glEnableClientState(GL_VERTEX_ARRAY); //These enables and disables are redundant here
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
GLdouble* Verts;
Verts = new GLdouble[12] { -xl, -yl, -.5, xl, -yl, -.5,
xl, yl, -.5, -xl, yl, -.5}; //Calculate quad vertices
GLdouble* Texs;
Texs = new GLdouble[8] {0, 0, 1, 0, 1, 1, 0, 1}; //Calculate texture vertices
glVertexPointer(3, GL_DOUBLE, 0, Verts);
glTexCoordPointer(2, GL_DOUBLE, 0, Texs);
glDrawArrays(GL_QUADS, 0, 12);
delete [] Verts;
delete [] Texs;
glPopMatrix();
}
有趣的是,此代碼的工作...一段時間。我打印了所有變量的值,它們都是正確的,指針不爲null,整個代碼中的glGetError調用總是返回NO_ERROR。坦率地說,我不知所措。
任何人建議我做一些不同的事情:我需要使用頂點數組來支持傳統的(1.4)GL實現,並且我將我的數組聲明爲指針,以便我可以(將來)重用它們用於一次繪製多個圖元(例如,從船上排出廢氣)
哇。我覺得我好笨。任何想法爲什麼它渲染一段時間,然後seg'd? – Xcelled194
如果在嘗試訪問的內存區域中存在其他內容,則可能只有段錯誤。如果它是可用空間,則內存邊界檢查可能沒有注意到它。這可以解釋它的隨機性。 – Tim
有道理,因爲它在內存較少的系統上會更快地發生故障......感謝你,我至少可以睡到今天晚上。 – Xcelled194