[c++/d3d8] na fullscreen worden andere apps geresized?

Pagina: 1
Acties:

  • Jace / TBL
  • Registratie: Augustus 2001
  • Laatst online: 23-03-2023
Ik heb een simpel progje wat met Direct 3D (dx8.1) naar fullscreen gaat. Als mijn prog afsluit, heb ik soms dat andere windows (dus andere applicaties) geresized worden.

Bijvoorbeeld: m'n desktop is 1280x960, en msvc++6 (of outlook express, of photoshop7) staan open en maximized. Ik run m'n appje (die gaat met D3D naar fullscreen 640x480 en sluit ook weer netjes af), en vervolgens is m'n msvc (of outlook, of ..) window ineens 640 x 480 groot, maar nog steeds "maximized"! Ik moet zo'n window dan restoren en opnieuw maximizen om het te fixen.

Dit gebeurt zowel wanneer ik mijn progje vanuit msvc run, als wanneer ik het stand-alone uitvoer.

Er zijn ook zat programmas die ook fullscreen D3D doen en dit probleem niet hebben, dus ik denk dat ik iets fout doe. Alleen ik heb geen flauw benul wat, want ik doe haast niets:

- om naar fullscreen te gaan, create ik een window en doe IDirect3D8::CreateDevice

- bij het quitten doe ik eerst d3dDevice->Release en daarna destroy ik het window

What the heck kan ik hier fout aan doen... :?

  • ruuds
  • Registratie: Maart 2001
  • Laatst online: 13:54
dat is volgensmij normaal..... mijn irc wordt ook kleiner als ik een 640x480 proggel gestart heb.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Die applicaties resizen waarschijnlijk omdat als je de schermresolutie wijzigt er een message wordt gestuurd naar alle windows dat de resolutie is aangepast, maar dat doet ie alleen als je ook echt de resolutie aanpast. Als je alleen d3dDevice::Release() aanroept, verander je niet direct de schermresolutie, en dus wordt die message niet verstuurd.

Oplossing dus: onthoud je resolutie voordat je 'm de eerste keer verandert en verander m weer terug voordat je d3dDevice::Release() aanroept.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik heb hier dus helemaal geen last van... en het enige wat ik doe is gewoon Release () aanroepen...

mijn code:

C++:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
void shutdownD3D ()
{
    vertexBuffer.release ();
    if (indexBuffer)
        indexBuffer->Release ();
    if (d3d8d)
        d3d8d->Release ();
    if (d3d8)
        d3d8->Release ();

    timeEndPeriod (1);
}

bool setupD3D (HWND hWnd)
{
    atexit (shutdownD3D);

    d3d8 = Direct3DCreate8 (D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp; 
    memset (&d3dpp, 0, sizeof(d3dpp));

#if FS_FULLSCREEN
    d3dpp.BackBufferWidth = FS_WIDTH;
    d3dpp.BackBufferHeight = FS_HEIGHT;
    d3dpp.BackBufferFormat = FS_FORMAT;
    d3dpp.BackBufferCount = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = FS_DEPTH;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_ONE;
#else
    D3DDISPLAYMODE mode;
    d3d8->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &mode);
    
    d3dpp.BackBufferFormat = mode.Format;
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.EnableAutoDepthStencil = TRUE;
    d3dpp.AutoDepthStencilFormat = FS_DEPTH;
#endif

    HRESULT r = d3d8->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
        hWnd, D3DCREATE_MIXED_VERTEXPROCESSING, &d3dpp, &d3d8d);

    return true;
}


die 4 FS_* waarden zijn gewoon defines van mezelf, en ik heb ook de rest van de setup en errorchecking even eruit gegooid (is namelijk niet echt relevant enzo ;))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Met bepaalde games heb ik het ook (vooral tijdens debuggen met Red Alert 2), erg lastig. Is er geen DX voorbeeld dat hetzelfde doet? Als daar ook het probleem optreed is het niet jouw fout.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 31-08 15:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

ik neem aan dat je zowel het Direct3DDevice8 released als het Direct3D8 object zelf? (in je startpost heb je het namelijk alleen over het device)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Klopt. Vooral DirectDraw deed dit vroeger.

Je moet de objecten in omgekeerde volgorde releasen als ze gemaakt zijn.

Eventueel de DirectX SDK samples bekijken is misschien ook nog een idee.

  • Jace / TBL
  • Registratie: Augustus 2001
  • Laatst online: 23-03-2023
Thanks voor de reacties. Ik ben inmiddels iets verder: ik heb een vieze work around gemaakt, namelijk na het afsluiten van mijn prog alle openstaande windows die maximized zijn, restoren en opnieuw maximizen. In sommige gevallen helpt dit.
Xenophage schreef:
Die applicaties resizen waarschijnlijk omdat als je de schermresolutie wijzigt er een message wordt gestuurd naar alle windows dat de resolutie is aangepast, maar dat doet ie alleen als je ook echt de resolutie aanpast. Als je alleen d3dDevice::Release() aanroept, verander je niet direct de schermresolutie, en dus wordt die message niet verstuurd.

Oplossing dus: onthoud je resolutie voordat je 'm de eerste keer verandert en verander m weer terug voordat je d3dDevice::Release() aanroept.
Ja zoiets dacht ik eerst ook, maar ik verander zelf m'n resolutie helemaal niet.. Ik zeg alleen tegen D3D "create jij maar een fullscreen device in deze mode" en dan geef ik een resolutie mee (die uit de modelist van dat device komt), d3d gaat dan zelf naar die resolutie switchen. En op het eind zeg ik "okee, eruit maar weer", en d3d gaat dan zelf terug switchen.
OlafvdSpek schreef:
Is er geen DX voorbeeld dat hetzelfde doet? Als daar ook het probleem optreed is het niet jouw fout.
Ja, de standaard voorbeelden hebben hier ook last van. Het is ook een fout in DirectX / D3D denk ik, maar ik moet het wel op zien te lossen voor dit programma ;(
.oisyn schreef:
ik neem aan dat je zowel het Direct3DDevice8 released als het Direct3D8 object zelf? (in je startpost heb je het namelijk alleen over het device)
Ja, het d3d8 object zelf release ik uiteindelijk ook, maar zodra ik het device release vind het probleem al plaats. Of ik daarna nou wel of niet netjes mijn windows sluit en/of het d3d object release, heeft hier geen invloed op.

Thanks voor je source voorbeeld. Zo te zien doe ik ongeveer hetzelfde, dus dat jij het probleem niet hebt verbaast me. Doe jij nog iets speciaals als je je window create?

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Heb een klein ideetje.. als je fullscreen gaat, gebruik je dan dezelfde bitdepth als de desktop (32/16)? Zo niet, gebruik dan eens het formaat van de desktop.

Misschien helpt het, miscchien niet

  • Jace / TBL
  • Registratie: Augustus 2001
  • Laatst online: 23-03-2023
Heb een klein ideetje.. als je fullscreen gaat, gebruik je dan dezelfde bitdepth als de desktop (32/16)? Zo niet, gebruik dan eens het formaat van de desktop.
Jep, doe ik.. zowel m'n desktop als de D3D mode is 32bit. Heb ook ff 16bit geprobeerd, probleem blijft.

Ik wil nu iets anders proberen, namelijk gewoon alle windows minimizen voordat ik naar fullscreen ga. Dus zeg maar kunstmatig op windowkey+D drukken :) Weet iemand hoe dat fatsoenlijk moet?

Ik heb al vanalles geprobeerd met EnumWindows en daar dan alles minimizen wat normaal open of maximized is, GetForegroundWindow blijven doen en die minimizen totdat ik null krijg, enz enz. Maar ik krijg er altijd allerlei vieze win2k services bij waarvan de windows gewoon open lijken te staan (NetDDE agent, Program Manager, dat soort prut.. die windows staan niet echt open. maar IsWindow en IsWindowVisible en GetWindowPlacement enzo zeggen allemaal van wel.. kan ze niet onderscheiden van "normale" apps zeg maar)

In MSDN vind ik iets van Shell.MinimizeAll, alleen daar staat alleen de VBasic documentatie, en in C++ krijg ik die functie niet aangeroepen..??

  • Primal
  • Registratie: Augustus 2001
  • Laatst online: 07:40
Niet dat het een nuttige reactie is, maar goed :)

Ik heb dit probleem vroeger bij DX7 inderdaad ook wel eens gehad. Maar dit kwam heel onwillekeurig voor. Soms wel, soms niet. Bijvoorbeeld dat de MS Visual C++ applicatie niet meer maximized was, maar wat kleiner gemaakt. Dat kan erop duiden dat jij (ik in dit voorbeeld) iets fout doet in je code, maar het kan ook een probleem van de drivers zijn. Sinds ik DX8 gebruik en ook hogere versies drivers (GF2) heb ik dit probleem niet meer. Maar dat is natuurlijk een slappe bevestiging, want ik heb het verder niet getest. Helaas kan ik er ook niets anders van maken.

Toch zou ik proberen te doen wat Xenophage ook al schreef, het geforceerd herïnitialiseren van de resolutie bij het afsluiten van je applicatie. Ik weet niet of het helpt, maar het is wel zo netjes en ik doe het altijd wel in mijn code. Bij de programma's die ik schreef in DX7 maakte dit overigens niks uit, want de onwillekeurigheid bleef.

Ik zou dat alternatief van "andere windows weer in hun originele staat brengen" maar laten varen. Het werkt wel ben ik helemaal met je eens, maar ik kan niet onderdrukken dat ik het lelijk vind.
Ik heb al vanalles geprobeerd met EnumWindows en daar dan alles minimizen wat normaal open of maximized is, GetForegroundWindow blijven doen en die minimizen totdat ik null krijg, enz enz.
Ik heb wat jaren terug een keer aan een module gewerkt waarin o.a. Windows van applicaties ge-enumereerd moesten worden en nog veel meer maar dat doet er nu niet toe (het was overigens voor een OS low-level security applicatie). Ik zou er weer echt in moeten duiken om te kijken wat ik ook al weer deed om het onderscheid te kunnen maken tussen windows van 'normale' applicaties en andere waaronder services etc. Maar wat ik me zo vaag kan herinneren keek ik in ieder geval of een window de window-style => WS_VISIBLE had (op te vragen met GetWindowLong). Het is al lang geleden + dat de toepassing van de applicatie heel anders was.

[ Voor 0% gewijzigd door Primal op 26-09-2002 19:57 . Reden: Spelfout ]

"The fastest code, is the code that is never called."

Pagina: 1