JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8859f0b049ee94a97301db3147a0d922Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Direct 3D 8.1 Anwendung verursacht VPU Recover

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 31.10.2006, 22:11    Titel: Direct 3D 8.1 Anwendung verursacht VPU Recover Antworten mit Zitat

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 Evil or Very Mad . 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 01.11.2006, 00:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.11.2006, 02:02    Titel: Antworten mit Zitat

Danke für die schnelle Antwort Very Happy .

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum