Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp worden veelvoorkomende categorieën problemen beschreven die kunnen optreden bij het schrijven van Direct3D-toepassingen en hoe u deze kunt voorkomen.
Apparaat maken
Als uw toepassing mislukt tijdens het maken van het apparaat, controleert u op de volgende veelvoorkomende fouten.
- Zorg ervoor dat u de mogelijkheden van het apparaat controleert, met name de renderdiepten.
- Bekijk de foutcode. D3DERR_OUTOFVIDEOMEMORY kan altijd mogelijk zijn.
- Gebruik de DirectX Dynamic Link-bibliotheken (DLL's) voor foutopsporing en controleer uitvoerberichten onder het foutopsporingsprogramma.
Verlichte Hoekpunten gebruiken
Toepassingen die gebruikmaken van verlichte hoekpunten moeten de Direct3D-verlichtingsengine uitschakelen door de D3DRS_LIGHTING weergavestatus in te stellen op ONWAAR. Wanneer verlichting is ingeschakeld, stelt het systeem standaard de kleur in voor een hoekpunt dat geen normale vector bevat op 0 (zwart), zelfs als het invoerpunt een niet-nulkleurwaarde bevat. Omdat lichthoeken niet, door hun aard, een hoekpunt normaal bevatten, gaan alle kleurinformatie die aan Direct3D wordt doorgegeven verloren tijdens het weergeven als de verlichtingsmotor is ingeschakeld.
Uiteraard is hoekpuntkleur belangrijk voor elke toepassing die zijn eigen verlichting uitvoert. Als u wilt voorkomen dat het systeem de standaardwaarden oplegt, moet u D3DRS_LIGHTING instellen op ONWAAR.
Als uw toepassing wordt uitgevoerd, maar er niets zichtbaar is, controleert u op de volgende veelvoorkomende fouten.
- Zorg ervoor dat uw driehoeken niet degenereren.
- Zorg ervoor dat uw driehoeken niet worden verwijderd.
- Zorg ervoor dat uw transformaties intern consistent zijn.
- Controleer de viewport-instellingen om ervoor te zorgen dat uw driehoeken zichtbaar zijn.
Fouten opsporen
Het kan lastig zijn om fouten in een Direct3D-toepassing op te sporen. Probeer de volgende technieken, naast het controleren van alle retourwaarden- een bijzonder belangrijk advies in Direct3D-programmering, die afhankelijk is van zeer verschillende hardware-implementaties.
- Schakel over naar foutopsporings-DLL's.
- Dwing een alleen-softwareapparaat af, waardoor hardwareversnelling wordt uitgeschakeld, zelfs wanneer deze beschikbaar is.
- Dwing oppervlakken in het systeemgeheugen.
- Maak een optie om in een venster uit te voeren, zodat u een geïntegreerd foutopsporingsprogramma kunt gebruiken.
Met de tweede en derde opties in deze lijst kunt u de Win16-vergrendeling vermijden, die anders kan ervoor zorgen dat uw foutopsporingsprogramma vastloopt.
Voeg ook de volgende vermeldingen toe aan Win.ini.
[Direct3D]
debug=3
[DirectDraw]
debug=3
Borland Floating-Point Initialisatie
Compilers van Borland rapporteren floating-point uitzonderingen op een wijze die niet compatibel is met Direct3D. Neem een _matherr uitzonderingshandler op als volgt om dit probleem op te lossen:
// 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
}
Parametervalidatie
Vanwege prestatieredenen voert de debug-versie van de Direct3D Immediate Mode-runtime meer parametervalidatie uit dan de handelsversie, die soms helemaal geen validatie uitvoert. Hierdoor kunnen toepassingen robuuste foutopsporing uitvoeren met het tragere runtime-onderdeel voor foutopsporing voordat ze de snellere handelsversie gebruiken voor het afstemmen van prestaties en definitieve release.
Hoewel verschillende Direct3D Immediate Mode methoden limieten opleggen aan de waarden die ze kunnen accepteren, worden deze limieten vaak alleen gecontroleerd en afgedwongen door de debugversie van de Direct3D Immediate Mode runtime. Toepassingen moeten voldoen aan deze limieten, of onvoorspelbare en ongewenste resultaten kunnen optreden wanneer ze worden uitgevoerd op de handelsversie van Direct3D. De methode IDirect3DDevice9::D rawPrimitive accepteert bijvoorbeeld een parameter (PrimitiveCount) die het aantal primitieven aangeeft dat door de methode wordt weergegeven. De methode kan alleen waarden tussen 0 en D3DMAXNUMPRIMITIVES accepteren. In de foutopsporingsversie van Direct3D, als u meer dan D3DMAXNUMPRIMITIVES primitieven doorgeeft, mislukt de methode probleemloos, drukt u een foutbericht af naar het foutenlogboek en retourneert u een foutwaarde naar uw toepassing. Als uw toepassing daarentegen dezelfde fout maakt wanneer deze wordt uitgevoerd met de handelsversie van de uitvoeringstijd, is het gedrag niet gedefinieerd. Om prestatieredenen valideert de methode de parameters niet, wat resulteert in onvoorspelbaar en volledig situatiegedrag wanneer ze niet geldig zijn. In sommige gevallen kan de aanroep werken en in andere gevallen kan dit een geheugenfout veroorzaken in Direct3D. Als een ongeldige aanroep consistent werkt met een bepaalde hardwareconfiguratie en DirectX-versie, is er geen garantie dat deze blijft functioneren op andere hardware of met latere versies van DirectX.
Als uw toepassing onverklaarbare fouten ondervindt bij het uitvoeren met het Direct3D-runtimebestand van de consumentenversie, test u de debugversie en let u goed op gevallen waarin uw toepassing ongeldige parameters doorgeeft. Gebruik de DirectX-configuratiescherm-applet, schakel indien nodig over naar de debug runtime en schakel de optie "Break on D3DError" in. Met deze optie wordt afgedwongen dat de runtime de Windows DebugBreak-methode gebruikt om ervoor te zorgen dat de toepassing stopt wanneer er een fout in de toepassing wordt gedetecteerd.
Verwante onderwerpen