Direct Draw 7.0



  • Nur den Code der in der Schleife steht!



  • Original erstellt von Netzwerk-Latenz:
    **Löscht den Backbuffer

    RECT    rect;
        DDBLTFX ddbltfx;
        ddbltfx.dwSize=sizeof(DDBLTFX);
        ddbltfx.dwFillColor=farbe;  
        SetRect(&rect,0,0,xoffset,yoffset);
        ddrval=lpDDSBack->Blt(&rect,NULL,&rect,DDBLT_COLORFILL|DDBLT_WAIT,&ddbltfx);
    

    Löscht den Frontbuffer

    RECT    rect;
        DDBLTFX ddbltfx;
        ddbltfx.dwSize=sizeof(DDBLTFX);
        ddbltfx.dwFillColor=farbe;  
        SetRect(&rect,0,0,xoffset,yoffset);
        ddrval=lpDDSPrimary->Blt(&rect,NULL,&rect,DDBLT_COLORFILL|DDBLT_WAIT,&ddbltfx);
    

    xoffset und yoffset == Auflösung

    farbe kann ein Wert sein für 16Bit WORD für 32Bit DWORD. Für 8 Bit 0-255.

    Ich glaube nicht das dein Problem damit gelöst ist.**

    Das Ganze färbt ja eben nur den Bildschirm, ist also imho eher dazu gedacht, Anzeigefehler (sprich: farbige "Flecken") zu vermeiden.

    Das Frame-Problem gab es bei mir mal, als ich versuchte, in jedem Frame eine Offscreen-Surface zu erstellen, auf die mit GDI (also jedes Mal DC holen und releasen) geschrieben wurde, und diese Surface dann in den BackBuffer geblittet habe.

    (Das hab' ich "damals" gemacht, um die Surface dann per ColorKey transparent zu machen und nur die Schrift zu haben -> Ich wusste nicht das man bei TextOut den Hintergrund auch transparent machen konnte 😃 🙄 , später habe ich dann - per Hand - sowas ähnliches wie die Text-Engine von Zerbie geschrieben.)



  • Gibt es eine möglichkeit front und backbuffer zu leeren

    Meine Antwort war schon richtig. Unter leeren verstehe ich den alten Inhalt zu entfernen. In dem man es mit einer einheitlichen Farbe überschreibt.

    Wie soll man sonst den den Front und Backbuffer leeren?

    Und wer bei jedem Frame den Backbuffer neu erzeug ist selber schuld 😉



  • ich bin info student und programmier seit 4 jahren alles mögliche ( c,java,ada,modula,php usw blabla )

    nun wollt ich mich mal wieder in dx reinarbeiten.
    ich erzeuge garantiert den backbuffer nich jedesmal neu....

    die funktion benutz ich ja auch mit dem füllen , nur muss ich doch bloss den backbuffer "füllen" um ihn zu löschen, da er danach ja eh geflippt wird.

    die bilder lad ich auch nit neu... benutze jedesmal ein und den selben hBitmap.
    An den releaseDC's kanns auch nicht liegen, die habe ich alle, selbst wenn ich von einem offscreen auf den back blitte ( ->Blt oder ->BltFast ) ändert das nix an der tatsache das die FPS sinken

    MFG Drill



  • Original erstellt von Drill:
    ich bin info student

    Na, das allein muss noch nix heissen...



  • Jopp muss es auch nicht.

    Aber es ist doch tatsache das man hier einiges lernt, das musst ich auch einsehen , auch wenn hier hässliche Sprachen benutzt werden ( zb Modula3 oder Ada ).

    Aber ich kenne mich gut mit Sprachen aus, da ich das letzte mal in DX7 allerdings vor 2 jahren was gemacht habe, habe ich absolut keine Ahnung woran das mit den buffern liegt.

    Hier mal die BltFunktion :

    void DrillsDX::BltFromOffToBack(LONG x,LONG y,LONG dx,LONG dy,LONG l,LONG o,LONG r,LONG u)
    {
        RECT DestRect;
        RECT SrcRect;
        ZeroMemory(&DestRect,sizeof(DestRect));
        ZeroMemory(&SrcRect,sizeof(SrcRect));
        SrcRect.left    = l;
        SrcRect.top     = o;    
        SrcRect.right   = l+r;
        SrcRect.bottom  = o+u;
        DestRect.left   = x;
        DestRect.top    = y;    
        DestRect.right  = x+dx;
        DestRect.bottom = y+dy; 
    
        if( (lpDDS_Back->IsLost()!=DD_OK)||(lpDDS_Offscreen->IsLost()!=DD_OK) )
        {
            lpDD7->RestoreAllSurfaces();
        };
        lpDDS_Back->Blt(&DestRect,lpDDS_Offscreen,&SrcRect,0,0);
    };
    

    und hier der Code um den Screen zu Färben (oder zu "löschen" ):

    void DrillsDX::FillBackBuffer()
    {
        if( lpDDS_Back->IsLost() != DD_OK )
        {
            lpDD7->RestoreAllSurfaces();
        };      
    
        DDBLTFX ddbltfx;
        ZeroMemory(&ddbltfx, sizeof(ddbltfx));
        ddbltfx.dwSize = sizeof(ddbltfx);
        ddbltfx.dwFillColor = 0;
        lpDDS_Back->Blt(NULL, NULL, NULL, DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
    };
    

    Also wenn jemand ne Idee hat worans liegt , bitte melden.
    Auf dem Offscreen Plain ist ein Image, das zum Programmstart draufgeblittet wird

    MFG Drill



  • Ich würde es so machen. Soll nur ein Vorschlag sein.

    void CopyRect(int left, int top, 
              int width, int height, 
              int x, int y, 
                  LPDIRECTDRAWSURFACE7 source, LPDIRECTDRAWSURFACE7 target)
    {   
        RECT temprect;
        int z=left+height;
        int w=top+width;
        SetRect(&temprect,left,top,w,z);
        target->BltFast(x, y,source,&temprect,NULL);
    }
    

    Diese Funktion sollte einen Bereich von Source (left,top,widht und height) an die Position x,y von target kopieren. Die Funktion sollte funktionieren.
    Wichtig! target sollte groß genug sein um den zu kopierenden Bereich aufnehmen zu können.

    PS: Ich bin kein Infostudent. Ich habe nur Hauptschule deshalb sind Fehler nicht ausgeschlossen.

    [ Dieser Beitrag wurde am 12.04.2003 um 14:24 Uhr von Netzwerk-Latenz editiert. ]



  • Lol 🙂

    Es wäre schon wenn Infostudenten keine Fehler machen würden (billi würde sich freuen ^^ )

    SetRect ist gut 🙂 werd ich einbauen.



  • Ob das dein Problem mit der fallenden Framerate löst?



  • Ich weiß nicht genau woran es liegt, da ich einiges geändert habe aber nun bleiben die frames konstant auf 75FPS 🙂

    (Die meisten Rects sind raus , da es auch anders ging)

    MFG Drill



  • Original erstellt von Drill:
    **Hier mal die BltFunktion :

    void DrillsDX::BltFromOffToBack(LONG x,LONG y,LONG dx,LONG dy,LONG l,LONG o,LONG r,LONG u)
    {
    [...]
        if( (lpDDS_Back->IsLost()!=DD_OK)||(lpDDS_Offscreen->IsLost()!=DD_OK) )
        {
            lpDD7->RestoreAllSurfaces();
        };
        lpDDS_Back->Blt(&DestRect,lpDDS_Offscreen,&SrcRect,0,0);
    };
    

    **

    Da sieht mans wieder, studieren macht nicht automatisch schlau ;).



  • Was soll das denn heißen (^^) klär mich mal auf ... ?
    (SetRect benutz ich ja nu 🙂 )

    Wie gesagt , arbeite mich seit 1 Woche wieder in C++ rein, hab das letzte mal vor 2 Jahren (!) was in C++ gemacht.

    Schlau wird man schon vom studieren, bloss is es nich so das man DX lernt ^^

    MFG Drill

    [ Dieser Beitrag wurde am 13.04.2003 um 14:39 Uhr von Drill editiert. ]



  • Ahh, ich wusste doch, das ich noch igendwo Antworten wollte.

    (also abgesehen von Namensgebungen u.Ä...)
    Es ist unsinning jedes mal das IsLost() zu überprüfen. Reicht einmal pro Frame an geeigneter Stelle (z.B. beim Flippen) den Rückgabewert zu überprüfen.

    Flags (Blitten mit Colorkey brauchte IMHO eines) können nicht angegeben werden.


Anmelden zum Antworten