Bagikan melalui


Pemecahan masalah (Direct3D 9)

Topik ini mencantumkan kategori masalah umum yang mungkin Anda temui saat menulis aplikasi Direct3D, dan cara mencegahnya.

Pembuatan Perangkat

Jika aplikasi Anda gagal selama pembuatan perangkat, periksa kesalahan umum berikut.

  • Pastikan Anda memeriksa kemampuan perangkat, terutama kedalaman render.
  • Periksa kode kesalahan. D3DERR_OUTOFVIDEOMEMORY selalu dimungkinkan.
  • Gunakan pustaka tautan dinamis (DLL) DirectX debug dan tinjau pesan output di bawah debugger.

Menggunakan Simpul Menyala

Aplikasi yang menggunakan simpul menyala harus menonaktifkan mesin pencahayaan Direct3D dengan mengatur status render D3DRS_LIGHTING ke FALSE. Secara default, ketika pencahayaan diaktifkan, sistem mengatur warna untuk puncak apa pun yang tidak berisi vektor normal ke 0 (hitam), bahkan jika verteks input berisi nilai warna bukan nol. Karena simpul menyala tidak, berdasarkan sifatnya, mengandung puncak normal, informasi warna apa pun yang diteruskan ke Direct3D hilang selama penyajian jika mesin pencahayaan diaktifkan.

Jelas, warna puncak penting untuk aplikasi apa pun yang melakukan pencahayaannya sendiri. Untuk mencegah sistem menerapkan nilai default, pastikan Anda mengatur D3DRS_LIGHTING ke FALSE.

Jika aplikasi Anda berjalan tetapi tidak ada yang terlihat, periksa kesalahan umum berikut.

  • Pastikan segitiga Anda tidak berdegenerasi.
  • Pastikan segitiga Anda tidak dimusnahkan.
  • Pastikan transformasi Anda konsisten secara internal.
  • Periksa pengaturan viewport untuk memastikan pengaturan tersebut memungkinkan segitiga Anda terlihat.

Awakutu

Men-debug aplikasi Direct3D bisa menjadi tantangan. Cobalah teknik berikut, selain memeriksa semua nilai pengembalian - saran yang sangat penting dalam pemrograman Direct3D, yang tergantung pada implementasi perangkat keras yang sangat berbeda.

  • Beralih ke DEBUG DLL.
  • Paksa perangkat khusus perangkat lunak, matikan akselerasi perangkat keras bahkan ketika tersedia.
  • Paksa permukaan ke dalam memori sistem.
  • Buat opsi untuk dijalankan di jendela, sehingga Anda dapat menggunakan debugger terintegrasi.

Opsi kedua dan ketiga dalam daftar ini dapat membantu Anda menghindari kunci Win16 yang dapat menyebabkan debugger Anda macet.

Selain itu, coba tambahkan entri berikut ke Win.ini.

[Direct3D] 
debug=3 
[DirectDraw] 
debug=3 

Inisialisasi Floating-Point Borland

Kompilator dari Borland melaporkan pengecualian floating-point dengan cara yang tidak kompatibel dengan Direct3D. Untuk mengatasi masalah ini, sertakan penanganan pengecualian _matherr seperti berikut ini:

// 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
}

Validasi Parameter

Untuk alasan performa, versi debug dari run time Mode Langsung Direct3D melakukan lebih banyak validasi parameter daripada versi ritel, yang terkadang tidak melakukan validasi sama sekali. Ini memungkinkan aplikasi untuk melakukan penelusuran kesalahan yang kuat dengan komponen run-time debug yang lebih lambat sebelum menggunakan versi ritel yang lebih cepat untuk penyetelan performa dan rilis akhir.

Meskipun beberapa metode Mode Langsung Direct3D memberlakukan batasan pada nilai yang dapat mereka terima, batas ini sering kali hanya diperiksa dan diberlakukan oleh versi debug dari run time Mode Langsung Direct3D. Aplikasi harus sesuai dengan batas ini, atau hasil yang tidak dapat diprediksi dan tidak diinginkan dapat terjadi saat berjalan pada versi ritel Direct3D. Misalnya, metode IDirect3DDevice9::D rawPrimitive menerima parameter (PrimitiveCount) yang menunjukkan jumlah primitif yang akan dirender metode. Metode ini hanya dapat menerima nilai antara 0 dan D3DMAXNUMPRIMITIVES. Dalam versi debug Direct3D, jika Anda meneruskan lebih dari primitif D3DMAXNUMPRIMITIVES, metode gagal dengan baik, mencetak pesan kesalahan ke log kesalahan, dan mengembalikan nilai kesalahan ke aplikasi Anda. Sebaliknya, jika aplikasi Anda membuat kesalahan yang sama saat berjalan dengan versi ritel run time, perilaku tidak terdefinis. Untuk alasan performa, metode ini tidak memvalidasi parameter, yang mengakibatkan perilaku yang tidak dapat diprediksi dan sepenuhnya situasional ketika tidak valid. Dalam beberapa kasus, panggilan mungkin berfungsi, dan dalam kasus lain dapat menyebabkan kesalahan memori di Direct3D. Jika panggilan yang tidak valid secara konsisten bekerja dengan konfigurasi perangkat keras tertentu dan versi DirectX, tidak ada jaminan bahwa panggilan tersebut akan terus berfungsi pada perangkat keras lain atau dengan rilis DirectX yang lebih baru.

Jika aplikasi Anda mengalami kegagalan yang tidak dapat dijelaskan saat berjalan dengan file run-time Direct3D ritel, uji terhadap versi debug dan perhatikan dengan cermat kasus di mana aplikasi Anda melewati parameter yang tidak valid. Gunakan applet panel kontrol DirectX, beralihlah ke runtime debug jika perlu, dan centang opsi "Putuskan pada D3DError". Opsi ini akan memaksa runtime untuk menggunakan metode Windows DebugBreak untuk memaksa aplikasi berhenti ketika bug aplikasi terdeteksi.

Tips Pemrograman