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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

17.07.2006, 20:07

Flimmernder Backbuffer

Hi, ich habe in mein Programm nun einen Backbuffer eingebaut um das Flimmern zu vermeiden. Das Ergebnis war das Gegenteil :( . Irgendwas muss ich falsch gemaxht haben, finde nur nicht was.

Hier mal der Code, der mit dem Backbuffer zu tun hat:

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
void CreateBackbuffer()
{
    HDC     hDChWnd;
    RECT    rc;
    HGDIOBJ hGdiObj;
    
    GetClientRect(hWnd,&rc);

    hDChWnd = GetDC(hWnd);

    hDCBackBuffer = CreateCompatibleDC(hDChWnd);

    hBackBufferBmp = CreateCompatibleBitmap(hDChWnd,rc.right,rc.bottom);

    hGdiObj = SelectObject(hDCBackBuffer,hBackBufferBmp);

    ReleaseDC(hWnd,hDChWnd);
}

//#####################################################################


void Flip()
{
    HDC     hDCRenderTarget;
    RECT    rc;
    
    GetClientRect(hWnd,&rc);            
    hDCRenderTarget = GetDC(hWnd);          
    
    BitBlt(hDCRenderTarget,0,0,rc.right,rc.bottom,hDCBackBuffer,0,0,SRCCOPY);   

    ReleaseDC(hWnd,hDCRenderTarget);
}
//#####################################################################


void DrawBackground()
{
    HBITMAP hBackground = (HBITMAP)LoadImage(NULL, "bild.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE); 

    HDC hDChWnd = GetDC(hWnd); 

    HDC hDCBackground    = CreateCompatibleDC(hDChWnd); 

    SelectObject(hDCBackground, hBackground); 

    RECT rc; 
    
    GetClientRect(hWnd,&rc); 

    TransparentBlt(hDChWnd,0,0,rc.right,rc.bottom,hDCBackground,0,0,400,400,RGB(254,254,254));
    
    ReleaseDC(hWnd, hDChWnd);
    DeleteDC(hDCBackground);
    DeleteObject(hBackground);
}

//###################################################################


void InitGame()
{
    CreateBackbuffer();
    DrawBackground();
    DrawFlower();
    DrawBlock();
}

//######################################################################


void RenderFrame()
{
    DWORD   dwRenderTime;

    dwRenderTime = GetTickCount();
    
    DrawBackground();
    DrawFlower();
    DrawBlock();
    Flip();
    
    dwRenderTime = GetTickCount() - dwRenderTime;

    if(dwRenderTime < 33)
        Sleep(33 - dwRenderTime);   
}


Wo muss ich RenderFrame(); denn hinsetzten? Habe es momentan in der Main-Schleife:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[..] InitGame();
    
    while(TRUE)
    {
        RenderFrame();

        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE) == TRUE)
        {
            if(msg.message == WM_QUIT)
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return msg.wParam;


mfg spacegaier

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

17.07.2006, 20:20

hä wo isn da der Backbuffer? Du malst in beiden Fällen

C-/C++-Quelltext

1
2
3
4
void Flip()  ....
    hDCRenderTarget = GetDC(hWnd);           
   
    BitBlt(hDCRenderTarget,0,0,rc.right,rc.bottom,hDCBackBuffer,0,0,SRCCOPY); 


C-/C++-Quelltext

1
void DrawBackground()  .... TransparentBlt(hDChWnd,0,0,rc.right,rc.bottom,hDCBackground,0,0,400,400,RGB(254,254,254));



auf das Fenster, nix da mit Backbuffer.
Nur Flip darf aber vom Backbuffer auf das Fenster zeichnen.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

17.07.2006, 20:23

Ich habe ClearBackbuffer druch DrawBackground ersetzt, weil es ja unsinnig wäre rst den Backbuffer wieder mit einer Farbe vollzumalen und dann darüber wieder den Hintergrund zu pinseln. Oder ist dieser Ansatz unsinnig?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

17.07.2006, 20:24

normalerweise wird sowas mit einer Farbe gemacht.

keine schöne Flip Funktion - es müssen noch überprüfungen rein
bei den anderen DrawFunktionen, immer in den Backbuffer blitten!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void Flip (::HDC RenderTarget, ::HDC Backbuffer)
{
    RECT    rc;
   
    GetClientRect(hWnd,&rc);    

    // Wenn wir NULL angeben dann nehmen wir das Fenster (hWnd global!)

    if(!RenderTarget)
      RenderTarget = GetDC(hWnd);           
   
    BitBlt(RenderTarget,0,0,rc.right,rc.bottom,Backbuffer,0,0,SRCCOPY);   
}

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

5

17.07.2006, 20:26

Okay, werd es ändern, aber daran liegt ja das flimmern (leider) nicht. Woher könnte das rühren?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

17.07.2006, 20:30

^---------------

Zitat


hä wo isn da der Backbuffer? Du malst in beiden Fällen auf das Fenster


p.s. dem Backbuffer ist das nahezu wurst mit was du da reinmalst, langsam ist nur das Blitten auf das Fenster, das vorher ist alles rasend schnell

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

7

17.07.2006, 20:35

Oh, ja wie peinlich :oops: . Sorry, wenn ich mich mal wieder blöd anstelle (gilt für alle Beiträge von mir). Des kann ich super. Je mehr Mühe ich mir gebe umso schlimmer wird es :( .

Sagt es ruhig, wenn ich nerve, dann weiß ich woran ich bin und kann mich (erneut) versuchen zu ändern.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

17.07.2006, 20:36

Schon ok, is jedem mal so gegangen ^^

Werbeanzeige