 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dr. Best Senior JLI'ler

Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 31.10.2006, 22:11 Titel: Direct 3D 8.1 Anwendung verursacht VPU Recover |
|
|
Hallo alle miteinander,
mich hält seit Freitag ein wirklich nerviger Fehler davon ab bei meiner Direct 3D 8.1 basierten Engine ordentlich voran zu kommen. Hatte das ja auch schonmal beilfäufig im Nachtschwärmer erwähnt. Google konnte mir nicht weiterhelfen. Liegt allerdings auch daran, dass es mir schwer fällt ordentliche Suchbegriffe zu finden, wo ich doch selbst nicht so genau weiß was den Fehler eigentlich verursacht. Daher wende ich mich jetzt mal an euch. Vielleicht weiß ja der ein oder andere etwas darüber.
Ich schätze der Übersicht halber ist es besser wenn ich die Symptome des Fehlers in chronologischer Reihenfolge aufliste:
- Das Programm startet normal und rendert genau einen Frame (den es auch anzeigt).
- Das Programm durchläuft die Renderfunktion (mit BeginScene, verschiedenen DrawPrimitive aufrufen und EndScene) erneut erfolgreich.
- Beim zweiten erreichen des Aufrufs von Present friert der komplette Bildschirm ein (das Programm läuft im Fenstermodus). Nur der Mauscursor bewegt sich noch, doch die anderen Grafischen Elemente reagieren nicht auf ihn (z.B. der Startmenubutton).
- Nach einigen Sekunden wird der Bildschirm kurz schwarz, wie wenn man die Auflösung wechselt. Dann läuft das Programm abgesehen von der Tatsache, dass es nur noch Schwarz anzeigt völlig normal weiter und es lässt sich normal beenden. Mein ATI-Treiber zeigt eine VPU-Recover Meldung an.
- Jedes mal wenn das passiert führt es dazu, dass andere Programme mit Grafikausgabe, z.B. Trillian, alle Grafiken fehlerhaft anzeigen.
- Ist der Fehler ein paar mal in Folge aufgetreten kann meine Anwendung kein D3D Device mehr erstellen und DX Diag behauptet ich hätte keine Direct3D unterstützung mehr. Dies läßt sich nur durch einen Neustart beheben.
Auf meiner Suche nach der Quelle dieses Fehlers habe ich mal systematisch Objekte rausgeworfen mit folgendem Ergebnis:
- Wird nur der Hintergrund (eine Sky-box) und ein einzelnes Objekt mit Vertex Tweening gerendert, läuft das Programm.
- Wird eine beliebige Menge an Objekten ohne Vertex Tweening gerendert, läuft das Programm.
- Wird ein einzelnes Objekt mit Vertex Tweening und zwei Dreiecke mit DrawPrimitiveUP oder alternativ ein Objekt mit Shadereffekt gerendert, stürzt das Programm ab.
Die Vermutung liegt also nahe, dass das Fixed Function Pipeline Vertex Tweening, das ich verwende, irgendwie mit dem Fehler zusammenhängt. Allerdings wirds noch schwieriger. Wenn ich Vertex Tweening deaktiviere tritt der Fehler immernoch auf. Erst wenn ich das FVF so umstelle, dass es nicht für Vertex Tweening ausgelegt ist tritt der Fehler nicht mehr auf.
Ich habe bereits alle möglichen Teile des Programms auskommentiert und haufenweise Debugsessions gemacht, ohne Erfolg. Hier ist die vollständige Debugausgabe. Ich kann darin nichts ungewöhnliches entdecken. Die Stelle an der das Programm einfriert dürfte ungefähr bei der zwanzigsten Warnung wegen unnötigen Texture Stage Änderungen sein.
Die verwendeten Indexbuffer und die zugehörigen Parameter für die DrawPrimitive Funktionen habe ich gecheckt, die Device Capabilities hab ich auch überprüft (wegen Vertex Tweening) und auch sonst hab ich alles was mir als mögliche Ursache in den Sinn gekommen ist überprüft. Alles Erfolglos.
Hier ist nochmal ein bisschen was von dem Code den ich zum Rendern von Objekten mit Vertex Tweening verwende (alles was nicht direkt damit zu tuen hat hab ich rausgelöscht, wäre sonst zu lang). Wenn ich manchmal pGlobal, statt lpD3DDevice schreibe liegt das daran, dass die Klasse CGlobal inline Funktionen beinhaltet, die den Kram, der der Device übergeben wurde speichern. Das ist sehr hilfreich um Vertex Shader Konstanten zu erhalten.
CPP: | // Render the object
void CObject::Render(){
LPDIRECT3DDEVICE8 lpD3DDevice=pGlobal->lpD3DDevice;
// Set up the transformation of the object
pGlobal->SetTransform(D3DTS_WORLD,&Transformation);
// If vertex tweening should be used it needs to be enabled
if(VertexTweening){
lpD3DDevice->SetRenderState(D3DRS_TWEENFACTOR,FToDW(static_cast<float>(CurrentFrame-static_cast<int>(CurrentFrame))));
lpD3DDevice->SetRenderState(D3DRS_VERTEXBLEND,D3DVBF_TWEENING);
}
// Render each material (this loop has the highest order because changing textures
// takes longer than changing stream data)
for(UINT i=0;i<nMaterial;i++){
// Set up the shaders
pGlobal->SetVertexShader(FVF); // Mehr Informationen zu dem hier verwendeten Shader weiter unten
pGlobal->SetPixelShader(NULL);
// Render each mesh
for(UINT j=0;j<nMeshsPerFrame;j++){
UINT Mesh=GetMeshIndex((UINT)CurrentFrame,j,iUsedLOD);
// If the mesh uses vertex tweening and the current material
if(VertexTweening && ppMesh[Mesh]->pMaterialOffset[i+1]-ppMesh[Mesh]->pMaterialOffset[i]!=0){
// Render the parts of the mesh that use the current material using
// fixed function pipeline vertex tweening
UINT Mesh2=GetMeshIndex((static_cast<UINT>(CurrentFrame)+1)*(static_cast<UINT>(CurrentFrame)+1<nFrame),j,iUsedLOD);
lpD3DDevice->SetStreamSource(0,ppMesh[Mesh]->pD3DVBuffer,ppMesh[Mesh]->VertexSizeFloat*sizeof(float));
if(ppMesh[Mesh]->VertexSizeFloat2>0){ // Dieses if-statement ist im Zusammenhang mit dem Problem immer wahr
lpD3DDevice->SetStreamSource(1,ppMesh[Mesh]->pD3DTBuffer,ppMesh[Mesh]->VertexSizeFloat2*sizeof(float));
}
lpD3DDevice->SetStreamSource(2,ppMesh[Mesh2]->pD3DVBuffer,ppMesh[Mesh2]->VertexSizeFloat*sizeof(float));
lpD3DDevice->SetIndices(ppMesh[Mesh]->pD3DIBuffer,0);
lpD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
ppMesh[Mesh]->pMaterialFirstVertex[i],
ppMesh[Mesh]->pMaterialLastVertex[i]-ppMesh[Mesh]->pMaterialFirstVertex[i]+1,
ppMesh[Mesh]->pMaterialOffset[i]*3,
ppMesh[Mesh]->pMaterialOffset[i+1]-ppMesh[Mesh]->pMaterialOffset[i]);
}
}
}
// If vertex tweening has been used it gets disabled now
if(VertexTweening){
lpD3DDevice->SetRenderState(D3DRS_VERTEXBLEND,D3DVBF_DISABLE);
pGlobal->SetVertexShader(D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1);
lpD3DDevice->SetStreamSource(1,NULL,0);
lpD3DDevice->SetStreamSource(2,NULL,0);
}
}
|
Und hier ist der Code mit dem das oben verwendete FVF erstellt wird:
CPP: | DWORD pFVFDeclaration[9];
pFVFDeclaration[0 ]=D3DVSD_STREAM(0);
pFVFDeclaration[1 ]=D3DVSD_REG(D3DVSDE_POSITION,D3DVSDT_FLOAT3);
pFVFDeclaration[2 ]=D3DVSD_REG(D3DVSDE_NORMAL,D3DVSDT_FLOAT3);
pFVFDeclaration[3 ]=D3DVSD_STREAM(1);
pFVFDeclaration[4 ]=D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2);
pFVFDeclaration[5 ]=D3DVSD_STREAM(2);
pFVFDeclaration[6 ]=D3DVSD_REG(D3DVSDE_POSITION2,D3DVSDT_FLOAT3);
pFVFDeclaration[7 ]=D3DVSD_REG(D3DVSDE_NORMAL2,D3DVSDT_FLOAT3);
pFVFDeclaration[8 ]=D3DVSD_END();
if(FAILED(pGlobal->lpD3DDevice->CreateVertexShader(&pFVFDeclaration[0],NULL,&FVF,NULL))){
Error("Failed to create a vertex shader for vertex tweening.");
} |
Wenn irgendwer auch nur die geringste Ahnung haben sollte wie ein so hamloser Code so fatale Fehler verursachen kann soll er sich bitte melden. Wahrscheinlich stellt sich am Ende wieder raus, dass ich an irgendeiner Stelle versehentlich j statt i geschrieben hab, dadurch eine unbemerkte Access Violation verursacht wurde und diese dann (wie Access Violations das halt so machen) zufällig meine D3D Device gefreakt hat . Aber desto mehr ich auskommentiere, desto schwerer fällt es mir daran zu glauben. Auf dem Computer meines Bruders läuft das Programm übrigens.
Für jeden Hinweis im voraus schonmal Danke,
mfG
Dr. Best |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 01.11.2006, 00:14 Titel: |
|
|
Ein VPU Recover tritt normalerweise nur auf wenn die Grafikkarte nicht mehr auf Befehle reagieren kann oder kritische Fehler aufgetreten sind, daher würde ich spontan folgende Dinge als Fehlerquelle ansehen um hauptsächlich die erste Variante einzukreisen:
- kapute/inkompatible/alte Grafikkartentreiber
- kapute/inkompatible/alte Chipsatztreiber
- kapute/inkompatible/alte Chipsatztreiber
- kaputte DirectX installation
- kaputte DirectX SDK installation
Variante 2 könnte ebenfalls unter diesen Kategorien fallen, aber auch möglich sind folgende Dinge:
- du nutzt DX Features die nicht oder nur teilweise von deiner Grafikkarte unterstützt werden, dies sollte aber von DirectX selbst abgefangen werden können
Möglich wären auch folgende Extremfälle:
- Grafikkarte kaputt
- Grafikkarte leidet unter Strommangel
- Grafikkarte erleidet Hitzeschock
- Grafikkartenslot verunreinigt/defekt
- andere hardwareseitige Probleme
Ebenso könnten Treiberprobleme auf etwas sonderbarer art bestehen, versuche zB mal die Treiber downgraden.
Auch den VPU Recover kannst du deaktivieren:
START > Control Panel > Display > Settings
tab > Advanced > VPU Recover > Enable VPU Recover
Als finalen Abschluss kannst du auch den Grafikkartenhersteller anschreiben oder diverse andere Leute.
mfg Mark _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Dr. Best Senior JLI'ler

Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.11.2006, 02:02 Titel: |
|
|
Danke für die schnelle Antwort .
Die ganzen Möglichkeiten, die du jetzt aufgezählt hast wollte ich bis jetzt nicht in Betracht ziehen, da es irgendwie so "billig" ist zu behaupten der Grafikkartentreiber wäre schuld sobald irgendetwas schief läuft. Aber ich glaube du hast Recht. Die Anzeichen dafür häufen sich.
Mein Treiber ist der aktuellste, der für meine Grafikkarte verfügbar ist (ist übrigens eine ATI Power Color 9250). Am Freitag, als ich das Problem zum ersten mal bemerkt habe hatte ich allerdings noch eine etwas ältere Version drauf. Da war VPU Recover auch standardmäßig deaktiviert, was aber auch nix genützt hat. Die Symptome waren die gleichen, bloß die VPU Recover Meldung fehlte und das Ganze wirkte sich noch etwas heftiger auf andere Anwendungen aus. Ich werde mal ausprobieren ob es vielleicht mit einem noch älteren Treiber klappt. Vom DirectX SDK hatte ich als der Fehler zum ersten mal auftrat auch noch eine ältere Version drauf. Jetzt hab ich ganz frisch die Oktober 06 Version installiert.
Die device capabilities habe ich wie gesagt schon alle ausgetestet, daran kann es eigentlich nicht liegen.
In Sachen Abwärtskompatiblität von Grafikkartentreibern habe ich schonmal eine recht unschöne Erfahrung gemacht. Die (High-End-)Grafikkarte meines Bruders ignorierte einfach eine implizite Anweisung in einem meiner Pixelshader. Und fixed function pipeline vertex tweening ist wirklich nicht das verbreitetste Feature. Das dumme ist nur immer, dass man wenn man es umgehen will gleich die komplette T&L mit Shadern nachbasteln muss.
Gerade habe ich noch ein Experiment gemacht, dass ich schon früher mal hätte machen sollen. Ich habe meine Anwendung eine Device mit Software Vertex Processing erstellen lassen und siehe da, es funktioniert einwandfrei. Ein Hardwaredefekt kann es allerdings nicht sein. Auf nem anderen Computer mit der gleichen Grafikkarte tritt der Fehler auch auf.
Ich schätze mein weiteres Vorgehen wird jetzt sein, dass ich morgen nochmal ein Treiberdowngrade ausprobiere. Sollte der Fehler danach nicht mehr auftreten, werde ich den Crashreport, der beim VPU Recover erstellt wird mal als Anhang in eine Email packen, in der ich den ATI Leuten mein Problem erläutere und um eine Rückmeldung bitte. Außerdem werde ich beim Beta release meiner Engine bitten mir über ähnliche Probleme zu bereichten.
Vielen Dank nochmal für die Ratschläge. Hätte mich aus Eigeninitiative wohl kaum dazu durchgerungen das Problem auf einen fehlerhaften Treiber zurückzuführen.
MfG
Dr. Best |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|