Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

17.08.2010, 19:05

device ist immer lost

ich habe ein kleines problem, ich weiß wie ich mit dem Fehler D3DERR_DEVICELOST umgehe, doch ich weiß nicht, warum das Device einfach immer lost ist, auch nach dem initialisieren schon.
ich initialisiere das ganze so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//get the Direct3D interface
    mD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(mD3D != NULL) CEngineLog::Get()->Write(LOG_SUCCESS, "The Direct3D Interface has been created!");
    else CEngineLog::Get()->Write(LOG_ERROR, "The Direct3D Device could not be created!");

    //set the presentation parameters
    ZeroMemory(&mPParams, sizeof(mPParams));
    mPParams.SwapEffect         = D3DSWAPEFFECT_DISCARD;
    mPParams.hDeviceWindow      = pWindow;
    mPParams.Windowed           = !pFullscreen;
    mPParams.BackBufferWidth    = pResolutionWidth;
    mPParams.BackBufferHeight   = pResolutionHeight;
    mPParams.BackBufferFormat   = D3DFMT_X8R8G8B8;

    //creating the device
    if(FAILED(mD3D->CreateDevice(   D3DADAPTER_DEFAULT,
                                    D3DDEVTYPE_HAL,
                                    pWindow,
                                    D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                    &mPParams,
                                    &mD3DDevice)))
    {
        CEngineLog::Get()->Write(LOG_ERROR, "The Direct3D Device could not be created. Resolution: %ix%i Fullscreen: %i", pResolutionWidth, pResolutionHeight, pFullscreen);
    }
    else CEngineLog::Get()->Write(LOG_SUCCESS, "The Direct3D Device has been created successfully! Resolution: %ix%i Fullscreen: %i", pResolutionWidth, pResolutionHeight, pFullscreen);


ich überprüfe jetzt jeden frame, ob das device lost ist, mit dieser funktion:

C-/C++-Quelltext

1
2
3
4
5
6
bool CDirect3D::IsLost()
{
    HRESULT DeviceStatus = mD3DDevice->TestCooperativeLevel();
    if(DeviceStatus == D3DERR_DEVICELOST || DeviceStatus == D3DERR_DEVICENOTRESET) return true;
    else return false;
}


das device rendert vernünftig, allerdings behauptet es gleichzeitig lost zu sein...oO

2

17.08.2010, 19:11

Jetzt mal ne ganz dumme Frage: Wie fragste den Rückgabewert von IsLost ab? Sicher dass du auf True und nich auf False prüfst ?

3

17.08.2010, 20:01

eigentlich schon:

C-/C++-Quelltext

1
2
3
4
5
if(D3D.IsLost())
        {
            D3D.ResetIfPossible();
            continue;
        }

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

17.08.2010, 20:02

Und was macht dein ResetIfPossible()?

5

17.08.2010, 20:06

die dürfte eigentlich garnicht aufgerufen werden, so direkt am anfang des programm, aber die sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
inline void CDirect3D::ResetIfPossible()
{
    if(mD3DDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET)
    {
        mD3DDevice->Reset(&mPParams);
    }
}


es gibt noch keine anderen resourcen die ich resetten müsste, nur ein einfaches surface.

EDIT: oO jetzt bin ich verwirrt, wenn ich das surface nicht erstellen lasse, resettet er vernünftig...
also eigentlich hab ich das problem gelöst, ich frage mich nurnoch, warum er direkt beim starten das device resettet. Das Fenster ist schon erstellt, hat seine nachrichten schon verarbeitet und das device wurde erzeugt. kann es sein, dass einige fensternachrichten sehr lange brauchen um anzukommen?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »newby« (17.08.2010, 20:12)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

17.08.2010, 20:13

Einfach nur Reset aufrufen ist auch nicht genug. Du musst vorher sämtliche Ressourcen die in POOL_DEFAULT liegen freigeben. Mehr dazu hier: http://msdn.microsoft.com/en-us/library/…4(v=VS.85).aspx

7

17.08.2010, 20:14

das ist mir klar, aber wieso muss ich überhaupt resetten? das fenster hat den fokus garnicht verloren...

8

17.08.2010, 21:16

ok, ich hab das problem gefunden, der fehler lag ganz woanders, nämlich bei der erstellung des fensters...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

17.08.2010, 21:20

Und was genau war da das Problem? Mir ist dieses Verhalten nämlich auch schonmal wo aufgefallen, würd mich daher interessieren.

10

17.08.2010, 22:46

ich muss gestehen, so ganz genau weiß ich das auch nicht, ich weiß nur, dass ich beim erstellen des fensters erst keinen cursor angegeben hab, weshalb ich immer die sanduhr, die noch von vc++ kam hatte, als ich dann einen standard cursor geladen habe, wollte er auch nicht mehr resetten... sehr seltsam finde ich das mal

Werbeanzeige

Ähnliche Themen