2011-04-12 30 views
0

我坐在Delphi 2009中的OpenGL 3.2應用程序中。使用定義了FullDebugMode的FastMM 4.97時,UBO無法正確獲取其數據。隨着FullDebugMode未定義,一切都像魅力一樣。在Delphi 2009中使用FastMM 4.97的OpenGL 3.2在FullDebugMode中使用UBO的問題

示例: 在渲染幀類中設置指向兩個私有整數字段FWidth和FHeight的視口尺寸。

glBufferSubData(GL_UNIFORM_BUFFER, VUniform.Offset, VUniform.Size, @FWidth); 

我一直在拉我的頭髮在這個問題上幾天,我真的不知道如何着手。我不希望在這裏完整的OpenGL支持,但希望有人能來基於在FullDebugMode,而不是運行之間已知的區別一些建議。

項目設置:

[Compiling] 
Optimization False 
Stack frames True 
Use debug .dcus True 
[Linking] 
Debug info  True 
Map file  Detailed 

操作系統是Windows 7 64位。編號: 找到它! 它有什麼都沒有做的OpenGL。在其他地方我們的代碼庫的函數返回的使用Result := @AnsiString(Object.Name)[1];這個工作大部分的時間,因爲內存才被釋放,但不變的正常運行PAnsiChar。在FullDebugMode中,數據在釋放時被$ 80序列覆蓋。

回答

0

您可能正在查看已被釋放的內存(通過您自己的應用程序)。

通常情況下,您仍然可以訪問舊值,直到它們被新分配+寫入覆蓋。即使您正在訪問內存的陳舊(釋放)部分,這也可以讓您的應用程序正常運行。

但是,在FullDebugMode中,釋放的內存填充了字節$ 80的序列。您可以輕鬆地檢查這個,如果你知道glBufferSubData,打破了確切的電話,只需看看在這一點上的內存。

+0

在我的示例中,發送到視頻內存的數據FWidth在調用glBufferSubData之前在行上設置。 'FWidth:= 400; glBufferSubData(GL_UNIFORM_BUFFER,VUniform.Offset,VUniform.Size,@FWidth);' 一個可能的解釋是數據在FullDebugMode中由FastMM在我的設置和OpenGL從內存傳輸到視頻內存之間清除。 此外,檢查在UBO片段着色器內與上傳的值時'如果(UViewDimensionX == 0)'它評估爲真。用$ 80序列填充的整數不應爲零。 – DelphiDabber 2011-04-12 20:58:16

+0

我只看到數據在GPU上側的緩衝設置。你的理論陳舊的記憶似乎似乎合理,但對於緩衝區被綁定和使用的代碼部分。在片段着色器中,對於緩衝區中的錯誤設置數據和緩衝區設置出錯的行爲將是相同的。我會進一步調查。 – DelphiDabber 2011-04-13 05:38:36