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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

06.12.2007, 20:18

directdraw flackert...

irgendwie flimmert bei mir die anwendung..

folgender code blittet eine surface die ein bitmap geladen hat auf den backbuffer, dieser blittet auf die primary surface welche dann flippt und alles anzeigt.. aber es flimmert wie irre..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void Display::render (Surface *sface)
{
    RECT rect;
    SetRect(&rect, 50, 50, 300, 300);

    switch(m_bFullscreen)
    {
    case true:
        m_pddsBackBuffer->Blt(&rect, sface->GetSurface(), NULL, DDBLT_WAIT, NULL);
        m_pddsPrimary->Blt(&rect, m_pddsBackBuffer, NULL, DDBLT_WAIT, NULL);

        m_pddsPrimary->Flip(NULL, DDFLIP_WAIT);


    case false:
        // noch nicht behandelt..


    default:
        return;
    }
}



weiss jemand woran das liegt und wie ich das ausbessern kann?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

2

07.12.2007, 00:33

Re: directdraw flackert...

Lass die Zeile mal weg:

C-/C++-Quelltext

1
m_pddsPrimary->Blt(&rect, m_pddsBackBuffer, NULL, DDBLT_WAIT, NULL);

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

3

07.12.2007, 08:10

bin jetz im moment nicht daheim, aber ich glaub ich weiss bereits warum ich das weglassen muss ^^

vermutlich weil Flip() sowieso den BackBuffer zuerst auf PrimarySurface blittet, oder? ^^

danke für die antwort!
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

4

07.12.2007, 15:13

hab die zeile rausgenommen, es kommt genau dasselbe raus..
flackert wie irre..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Display::render (Surface *sface)
{
    RECT rect;
    SetRect(&rect, 0, 0, 124, 39);

    switch(m_bFullscreen)
    {
    case true:
        m_pddsBackBuffer->Blt(&rect, sface->GetSurface(), NULL, DDBLT_WAIT, NULL);
        while(m_pddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK);

    case false:
        // noch nicht behandelt..


    default:
        return;
    }
}



hilfe... :cry:
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

5

07.12.2007, 16:03

Zitat von »"$nooc"«

bin jetz im moment nicht daheim, aber ich glaub ich weiss bereits warum ich das weglassen muss ^^

vermutlich weil Flip() sowieso den BackBuffer zuerst auf PrimarySurface blittet, oder? ^^

danke für die antwort!


genau so sollte es funktionieren ^_^

Ich bin mir nicht sicher, ob es daran liegt, aber das:

C-/C++-Quelltext

1
while(m_pddsPrimary->Flip(NULL, DDFLIP_WAIT) != DD_OK); 


ist glaub ich auch nicht so das wahre. DDFLIP_WAIT gibt der Funktion ja an, das, falls die Buffer grad nicht getauscht werden können, gewartet werden soll, bis dies möglich ist. also while würde ich da weg lassen.
ansonsten ist alles richtig.

Ansonsten würde ich noch empfehlen Flip nur einmal pro Frame aufzurufen, falls du das nicht sowieso schon machst.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

6

07.12.2007, 16:16

auch ohne die while() funktioniert es nicht..
und das bild wird auch nur 1mal pro frame gerendert und angezeigt..

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// [...]


    while(run)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        ulRenderTime = GetTickCount();

        pDsp->render(sface);

        ulRenderTime = GetTickCount() - ulRenderTime;
        if(ulRenderTime < 30)
            Sleep(30 - ulRenderTime);
    }

// [...]


oh man.. woran kann das bitte liegen?

also nur so als nebeninfo:
ich hab gemerkt dass ich die rechte und linke maustaste betätigen kann, dann steht das programm still (also wenn ich die rechte oder linke maustaste gedrückt halte..)

je nach timing sehe ich dann das bild so wies angezeigt werden soll, oder aber auch nur das fenster selbst (weiss gezeichnet)..

wo könnte der fehler den ursprung haben..
es kommt mir so vor als würde der modus zwischen fullscreen und windowed nach jedem durchlauf wechseln, aber so ist es nicht..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

07.12.2007, 16:24

als erstes solltest du mal die zeile mit sleep weglassen. ist nicht unbedingt der fehler, aber schonmal besser, weil das programm nicht ausgebremst wird.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

8

07.12.2007, 16:25

boah .. jetz hab ich was lustiges gemacht..

pDsp->render(sface);

ist der aufruf fürs rendern..

wenn ich es wirklich nur 1mal aufrufe, dann ist das bild richtig dargestellt..

C-/C++-Quelltext

1
pDsp->render(sface);


wenn ich es 2mal aufrufe, dann seh ich nur ein weisses, leeres fenster

C-/C++-Quelltext

1
2
pDsp->render(sface);
pDsp->render(sface);


beim 3ten mal isses wieder richtig, beim 4ten mal wieder falsch..

also irgendwas wechselt da dauernd, aber ich kann beim debuggen nichts sehen..
er geht immer einfach nur rein in die funktion, macht was es soll und geht wieder raus, ohne irgendwelche umwege..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

9

07.12.2007, 16:33

Zitat von »"$nooc"«

boah .. jetz hab ich was lustiges gemacht..

pDsp->render(sface);

ist der aufruf fürs rendern..

wenn ich es wirklich nur 1mal aufrufe, dann ist das bild richtig dargestellt..

C-/C++-Quelltext

1
pDsp->render(sface);


wenn ich es 2mal aufrufe, dann seh ich nur ein weisses, leeres fenster

C-/C++-Quelltext

1
2
pDsp->render(sface);
pDsp->render(sface);


beim 3ten mal isses wieder richtig, beim 4ten mal wieder falsch..

also irgendwas wechselt da dauernd, aber ich kann beim debuggen nichts sehen..
er geht immer einfach nur rein in die funktion, macht was es soll und geht wieder raus, ohne irgendwelche umwege..


pDsp->render(sface); ist sicherlich die methode, die oben steht,oder?
wenn du das in der Nachrichten Schleife mehrmals aufrufst, dann tauschst du die Buffer auch mehrmals pro frame. ;)

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

10

07.12.2007, 16:40

nein ich rufe das in einer while schleife in der WinMain() auf..
also pro durchlauf nur 1mal

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
26
27
28
29
30
31
32
33
34
35
36
37
38
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrecInstancen, LPSTR lpCmdLine, int iCmdShow)
{
    // [...] <- Fenster initialisierung


    pDsp    = new Display(hwnd);
    Bitmap  bmp;

    if(!bmp.loadBitmap(TEXT("Bitmap1.bmp")))
        return 1;
    
    pDsp->CreateFullScreenDisplay(1024, 768, 32);

    pDsp->CreateSurfaceFromBitmap(&sface, bmp);

    unsigned long ulRenderTime;
    while(run)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        ulRenderTime = GetTickCount();

        pDsp->render(sface);

        ulRenderTime = GetTickCount() - ulRenderTime;
        if(ulRenderTime < 30)
            Sleep(30 - ulRenderTime);
    }

    ptrDelete(pDsp);
    ptrDelete(sface);

    return static_cast<int>(msg.wParam);
} // WinMain()



edit:
ja, pDsp->render(sface); ist die methode die oben steht
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige