(Direct3D 9) 疑難排解
本主題列出您在撰寫 Direct3D 應用程式時可能會遇到的常見問題類別,以及如何防止它們。
裝置建立
如果您的應用程式在裝置建立期間失敗,請檢查下列常見錯誤。
- 請務必檢查裝置功能,特別是轉譯深度。
- 檢查錯誤碼。 D3DERR_OUTOFVIDEOMEMORY一律可行。
- 使用偵錯 DirectX 動態連結程式庫 (DLL) ,並檢閱偵錯工具下的輸出訊息。
使用 Lit 頂點
使用光線頂點的應用程式應該藉由將D3DRS_LIGHTING轉譯狀態設定為 FALSE來停用 Direct3D 光源引擎。 根據預設,啟用光源時,系統會將不包含一般向量的任何頂點色彩設定為 0 (黑色) ,即使輸入頂點包含非零色彩值也一樣。 由於光頂點本質上不包含頂點常態,因此如果已啟用光源引擎,則傳遞至 Direct3D 的任何色彩資訊都會在轉譯期間遺失。
很明顯地,頂點色彩對於執行自己的光源的任何應用程式而言很重要。 若要防止系統強制使用預設值,請確定您已將D3DRS_LIGHTING設為 FALSE。
如果您的應用程式執行但看不到任何內容,請檢查下列常見錯誤。
- 請確定您的三角形不會變質。
- 請確定您的三角形不會被擷取。
- 請確定您的轉換在內部保持一致。
- 請檢查檢視區設定,以確定它們允許看到您的三角形。
偵錯
對 Direct3D 應用程式進行偵錯可能很困難。 除了檢查所有傳回值之外,請嘗試下列技術,這是 Direct3D 程式設計中特別重要的建議,這相依于非常不同的硬體實作。
- 切換至偵錯 DLL。
- 強制僅限軟體的裝置,即使有可用的硬體加速,也會關閉硬體加速。
- 強制表面進入系統記憶體。
- 建立選項以在視窗中執行,讓您可以使用整合偵錯工具。
此清單中的第二個和第三個選項可協助您避免 Win16 鎖定,否則會導致偵錯工具停止回應。
此外,請嘗試將下列專案新增至 Win.ini。
[Direct3D]
debug=3
[DirectDraw]
debug=3
Borland Floating-Point初始化
Borland 的編譯器會以與 Direct3D 不相容的方式報告浮點例外狀況。 若要解決此問題,請包含_matherr例外狀況處理常式,如下所示:
// Borland floating point initialization
#include <math.h>
#include <float.h>
void initfp(void)
{
// Disable floating point exceptions
_control87(MCW_EM,MCW_EM);
}
int _matherr(struct _exception *e)
{
e; // Dummy reference to catch the warning
return 1; // Error has been handled
}
參數驗證
基於效能考慮,Direct3D 即時模式執行時間的偵錯版本會執行比零售版更多的參數驗證,有時完全不會執行任何驗證。 這可讓應用程式使用較慢的偵錯執行時間元件執行強固偵錯,再使用較快速的零售版本進行效能微調和最終發行。
雖然數個 Direct3D 即時模式方法會對可接受的值施加限制,但這些限制通常只會由 Direct3D 即時模式執行時間的偵錯版本檢查並強制執行。 應用程式必須符合這些限制,或在 Direct3D 的零售版上執行時,可能會發生無法預期且不想要的結果。 例如, IDirect3DDevice9::D rawPrimitive 方法接受一個參數 (PrimitiveCount) ,指出方法將呈現的基本類型數目。 方法只能接受介於 0 到 D3DMAXNUMPRIIVES 之間的值。 在 Direct3D 的偵錯版本中,如果您傳遞超過 D3DMAXNUMPRIMITIVES 基本類型,此方法會正常失敗、將錯誤訊息列印至錯誤記錄檔,並將錯誤值傳回至您的應用程式。 相反地,如果您的應用程式在以執行時間零售版執行時發生相同的錯誤,則行為是未定義的。 基於效能考慮,此方法不會驗證參數,因此當參數無效時,會產生無法預期且完全的情況行為。 在某些情況下,呼叫可能會運作,而在其他情況下,可能會造成 Direct3D 中的記憶體錯誤。 如果不正確呼叫一致適用于特定硬體組態和 DirectX 版本,則不保證它會繼續在其他硬體或更新版本的 DirectX 上運作。
如果您的應用程式在使用零售 Direct3D 執行時間檔案執行時遇到未探索失敗,請針對偵錯版本進行測試,並仔細查看您的應用程式通過無效參數的情況。 使用 DirectX 控制台小程式、視需要切換至偵錯執行時間,並勾選 [D3DError 中斷] 選項。 此選項會強制執行時間使用 Windows DebugBreak 方法,以強制應用程式在偵測到應用程式錯誤時停止。
相關主題