D3DERR_DEVICELOST-woran kanns liegen?
-
also, ich hab mir eine einfache render funktion geschrieben, und bekomm nun wenn ich die anwendung gestartet hab nen weissen screen(farbe des fensters) und später in meiner log steht D3DERR_DEVICELOST,und ich wollte mal fragen, woran das liegen kann, da mir die hilfe auch nich sonderlich viele infos gegeben hat, ausser dem was eigentlich aus der fehler meldung ansich erkennbar ist
-
Bei welchem Ereignis schreibt denn dein Programm "D3DERR_DEVICELOST" in die Log oder wo werden Fehler abgefangen? Scheint wohl Fehler bei der Initialisierung von DX zu geben. Zeig doch mal deinen Initialisierungscode + Renderfunktion
-
ok,der fehler kommt bei der renderfunktion, und ich glaub inzwischen auch,dass es an der initialisierung liegt,mmit code hab ich mich bewusst zurückgehalten, da das letzte mal statt hilfe eigentlich nur kam: mach das doch so, und wieso machst du das so..aber beim fehler kann ich dir nich helfen
aber unter der prämisse, dass ihr euch an der fehlermeldung haltet, poste ich hier mal den code, ich weiß nämlich, dass er nicht perfekt ist.
bei bedarf poste ich noch mehr^^die renderfunktion
int renderImage(){ //DREIECKE vertex Dreieck[3]; Dreieck[0].position.VecSet(0,1,0); Dreieck[1].position.VecSet(1,1,0); Dreieck[2].position.VecSet(-1,-1,0); Dreieck[0].color=(DWORD)(Color(1,0,0)); Dreieck[1].color=(DWORD)(Color(0,1,0)); Dreieck[2].color=(DWORD)(Color(0,0,1)); //matritzen Matrix rotation; Matrix translation; Matrix world; //weltmatrixberechnung rotation=rotation.MrotationZ(40); translation=translation.Mtranslation(0,0,2); world=rotation*translation; g_pD3DDevice->SetTransform(D3DTS_WORLD,(D3DMATRIX*)(&world)); //bildbuffer leeren g_pD3DDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,0),1.0f,0); //szene zeichnen g_pD3DDevice->BeginScene(); g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,Dreieck,sizeof(vertex)); g_pD3DDevice->EndScene(); HRESULT hresult; if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,hwnd,NULL))){ MessageBox(NULL,DXGetErrorString9(hresult),"fehlgeschlagen",MB_OK); } return 0; }
die initialisierung
if(FAILED(g_pD3D->CreateDevice(DirectXParameter.iAdapter,D3DDEVTYPE_HAL,hwnd,D3DCREATE_PUREDEVICE|D3DCREATE_HARDWARE_VERTEXPROCESSING, DirectXParameter.parameter,&g_pD3DDevice))){ MessageBox(NULL,"Directx konnte nicht initialisiert werden","Fehler",MB_OK|MB_ICONINFORMATION); }
die parameter struktur
D3DPRESENT_PARAMETERS* CardCaps::checker(D3DFORMAT* mode){ D3DPRESENT_PARAMETERS* var=NULL; if(this->bildpuffer1024==true||this->bildpuffer800==true){ D3DPRESENT_PARAMETERS* D3DPARAM=new D3DPRESENT_PARAMETERS; int zaehler=0; while(zaehler<4&&D3DPARAM->MultiSampleType!=D3DMULTISAMPLE_4_SAMPLES){ if(this->Anti_Aliasing[zaehler]==true){ if(this->bildpuffer1024==true||this->bildpuffer800==true){ ZeroMemory(D3DPARAM,sizeof(D3DPRESENT_PARAMETERS)); if(this->bildpuffer1024==true){ D3DPARAM->BackBufferWidth=1024; D3DPARAM->BackBufferHeight=768; D3DPARAM->FullScreen_RefreshRateInHz=this->refresh1024; } else { D3DPARAM->BackBufferWidth=800; D3DPARAM->BackBufferHeight=600; D3DPARAM->FullScreen_RefreshRateInHz=this->refresh800; } D3DPARAM->BackBufferFormat=D3DFMT_X8R8G8B8; D3DPARAM->BackBufferCount=1; D3DPARAM->MultiSampleType=D3DMULTISAMPLE_4_SAMPLES; D3DPARAM->MultiSampleQuality=Quality[zaehler]; D3DPARAM->SwapEffect=D3DSWAPEFFECT_DISCARD; D3DPARAM->hDeviceWindow=hwnd; D3DPARAM->Windowed=false; D3DPARAM->EnableAutoDepthStencil=true; D3DPARAM->AutoDepthStencilFormat=mode[zaehler]; D3DPARAM->PresentationInterval=D3DPRESENT_INTERVAL_DEFAULT; var=D3DPARAM; } } else { zaehler++; } } if(var==NULL){ delete[] D3DPARAM; } } return var; }
-
aber wo erstellst du die logfile? gar nicht? benutzt du ne fertige Engine?
-
logs rausgestrichen, nur ne messagebox drin behalten,würd den code zu sehr aufblähen...
-
aber schau doch mal an welcher stelle im code der fehler in die log geschrieben wird...stochern im nebel ist so nicht mehr nötig
-
hresult=g_pD3DDevice->Present(NULL,NULL,hwnd,NULL)<-----da
-
lass mal bei present das hwnd weg und ersetz es mit NULL, so mach ichs auch
Kevin
-
selbes ergbnis, NULL hatte ich da vorher drin, habs aber dann durch die var ersetzt als ich auf fehlersuche war^^
vielleicht sollten wir uns erstmal klarwerden, wann die device verloren geht, dann kann ich nämlich nach dem fehler suchen, da ich mich mit meinem code bestimmt besser auskenne als ihr
-
du wirst ihn ja wohl kaum vorm rendern wieder freigeben oder? hast du alles selbst gemacht oder dich nach einem tutorial gerichtet?
-
sagen wirs mal so: halb selbergemacht, 1/4buch 1/4 tut
und nein, ich release die schnittstelle nich vorher(das würde eh in nem parse error enden,von wegen unknown objekt "g_pD3DDevice" oder so^^)
-
Hi,
Device_Lost deutet an, dass das Device verloren gegangen ist. Das passiert i.d.R. wenn man in einem Fullscreen-Programm ALT+TAB drückt und eine andere Anwendung die Grafikkarte übernimmt.Danach schlagen alle Methoden fehl, melden aber ein Okay zurück.
Schau Dir mal die IDirect3DDevice9::Reset Methode an.
Ciao,
Stefan
-
ok, hab das jetzt mal gemacht, aber das problem ist, dass ich ja in keinem meiner vielen versuche alt+tab gedrückt hab, dementsprechend glaub ich nich, dass es daran liegt
der neue code
if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); hresult=g_pD3DDevice->Reset(DirectXParameter.parameter); writetolog("versuch die device wiederherzustellen"); writetolog(DXGetErrorString9(hresult)); if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); } }
der log dazu
D3DERR_DEVICELOST
versuch die device wiederherzustellen
D3DERR_DEVICELOST
D3DERR_INVALIDCALL
-
also läuft dein programm von anfang bis ende in fullscreen durch ohne dass du nen breakpoint im code hast oder sonst etwas, was den fullscreen deines programms unterbricht?
rapso->greets();
-
jep, direct x wird gestartet, vollbild wird erzeugt, ab dann startet sofort die logic und dann die renderfunktion^^
btw: kanns vielleicht an falschen daten für die createdevice methode liegen? das war nämlich schon immer der knackpunkt *g*
oder kanns vielleicht an falschen berechnungen/matritzen(also falsches format) liegen? ich hab nämlich auch alle berechnungsfunktionen selber geschrieben, und matritzen waren da das problem^^
-
Für Matrizenberechnungen gibts doch wunderschöne D3DX-Funktionen...
-
*schulterzuck* kenn ich net^^ und ich bin mir doch schon sehr sehr sicher, dass meine matrix klasse astrein gecodet ist,operatoren, drehungen, translationen,skalierungen, projektionsmatrix, alles drin
-
Hi,
ALT+TAB war nur *ein* Beispiel
Wenn der Reset fehlschlägt prüfe den Rückgabewert bzw. den Status des Devices. Wenn es immer noch lost oder unresettet ist dann gehst Du einfach in der Schleife weiter bis sich das Device wiederherstellen lässt. Nach einem Lost geht das i.d.R. nicht sofort wieder. Beachte auch, dass Du unmanaged Ressourcen neu erstellen musst.
Ciao,
Stefan
-
Es gibt einen Device State, der nennt sich irgendwo DEVICE_NOTRESET oder so. Der sagt, dass du das Device jetzt wiederherstellen kannst.
-
so, hab das mal auf ne schleife umgestellt:
if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); while(FAILED(hresult=g_pD3DDevice->Reset(DirectXParameter.parameter))){ writetolog("versuch die device wiederherzustellen"); writetolog(DXGetErrorString9(hresult)); } if(FAILED(hresult=g_pD3DDevice->Present(NULL,NULL,NULL,NULL))){ writetolog(DXGetErrorString9(hresult)); } }
und hier mal das complette logbuch
parameterliste erfolgreich erstellt
S_OK
S_OK
S_OK
D3DERR_DEVICELOST//ab hier wirds wichig
versuch die device wiederherzustellen
D3DERR_DEVICELOSTnoch irgendwelche tipps?^^
-
hmm, würde er die device verlieren, wenn ich mir bei der adapter/caps auswahl einen groben patzer geleistet hätte?