JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=630031279536d3a743b83a4ceea2c909Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Grafik-API mit Pixelzugriff
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Kovok
Mini JLI'ler


Alter: 35
Anmeldedatum: 06.07.2006
Beiträge: 8
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 17.07.2006, 14:31    Titel: Antworten mit Zitat

DD ist verdammt schnell wenn man weiß wie. Denn du bekommst einen zeiger auf den Backbuffer und kannst so sehr wohl direkt in die grafikkarte rein schreiben.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden AIM-Name MSN Messenger
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 17.07.2006, 14:55    Titel: Antworten mit Zitat

Hm, ich hab's über ein "älteres" Framework versucht, was ich sonst nie groß verwendet hab, weils ein wenig buggy ist, aber für mich in diesem Fall ausreichend Funktionalität bereit hielt.

Was meinst du mit Zeiger auf den Backbuffer? Ich kenn nur den "klassischen" Weg über das DD-Objekt einen Backbuffer zu erzeugen, diesen zu locken, Pixel für Pixel zu schreiben, zu unlocken und zu guter Letzt zu flippen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 17.07.2006, 14:58    Titel: Antworten mit Zitat

Man kann AFAIK beim erstellen des Devices festlegen das der erzeugte BackBuffer lockbar ist. In der DX Doku sollte das unter anderem drin stehen.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Kovok
Mini JLI'ler


Alter: 35
Anmeldedatum: 06.07.2006
Beiträge: 8
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 17.07.2006, 15:08    Titel: Antworten mit Zitat

exakt nur mache folgendes:

1. Device erstellen
2. Zeiger auf Backbuffer
3. Backbuffer locken
4. alle Berechnungen durchführen
5. Rasterizer, clipping
6. Buffer entsperren
7. flippen

Das geht so schnell, dass du selbst 3D Spiele damit schreiben kannst, auch wenn es stärkere Limitierungen gibt
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden AIM-Name MSN Messenger
GreveN
JLI Master


Alter: 37
Anmeldedatum: 08.01.2004
Beiträge: 901
Wohnort: Sachsen - Dresden
Medaillen: Keine

BeitragVerfasst am: 17.07.2006, 16:14    Titel: Antworten mit Zitat

Ok, ich hab oben Mist gelabert, bisher hatte ich nie direkt in den Backbuffer geschrieben, weil man zum locken ein 'DDSURFACEDESC2'-Objekt der jeweiligen Surface benötigt, komischerweise wird das aber bei dem Backbuffer sonst nie benötigt (man erzeugt den Backbuffer ja nicht mittels 'CreateSurface') und demzufolge nie initialisiert. Nun hatte ich versucht das Problem so zu lösen, dass ich einfach 'GetSurfaceDesc' vom Backbuffer anwende und das damit erhaltene Objekt beim Locken verwende. Locken und unlocken klappt auch, aber sobald ich auf den Speicher zugreifen will, schmiert die Anwendung ab. Ich hatte das Problem immer gelöst, indem ich in eine externe Surface schreibe, und vor dem Flip diese Surface in den Backbuffer blitte.

Hier mein Testsource:
CPP:
    ::IDirectDraw7* ddraw = NULL;                 // device

    ::DDSURFACEDESC2       fb_surfdesc;           // frontbuffer
    ::IDirectDrawSurface7* frontbuffer = NULL;    // -"-

    ::DDSCAPS2 caps;                              // backbuffer
    ::IDirectDrawSurface7* backbuffer = NULL;     // -"-




    // device erzeugen
    ::DirectDrawCreateEx(NULL, reinterpret_cast<void**>(&ddraw), IID_IDirectDraw7, NULL);
    ddraw->SetCooperativeLevel(wnd.handle(), DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
    ddraw->SetDisplayMode(640, 480, 16, 0, 0);


    // frontbuffer erzeugen
    ::ZeroMemory(&fb_surfdesc, sizeof(fb_surfdesc));
    fb_surfdesc.dwSize            = sizeof(fb_surfdesc);
    fb_surfdesc.dwFlags           = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
    fb_surfdesc.ddsCaps.dwCaps    = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
    fb_surfdesc.dwBackBufferCount = 1;

    ddraw->CreateSurface(&fb_surfdesc, &frontbuffer, NULL);


    // backbuffer erzeugen
    ::ZeroMemory(&caps, sizeof(caps));
    caps.dwCaps = DDSCAPS_BACKBUFFER;
    frontbuffer->GetAttachedSurface(&caps, &backbuffer);




    while(msg.message!=WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            ::DDSURFACEDESC2 bb;
            backbuffer->GetSurfaceDesc(&bb);

            unsigned long pitch = bb.lPitch;
            unsigned short* data = reinterpret_cast<unsigned short*>(bb.lpSurface);

            backbuffer->Lock(NULL, &bb, DDLOCK_WAIT, NULL);

            for(int y=0; y<480; ++y)
                for(int x=0; x<640; ++x)
                    data[x + y * pitch] = 0;

            backbuffer->Unlock(NULL);
        }
    }



    if(backbuffer)
    {
        backbuffer->Release();
        backbuffer = NULL;
    }


    if(frontbuffer)
    {
        frontbuffer->Release();
        frontbuffer = NULL;
    }


    if(ddraw)
    {
        ddraw->Release();
        ddraw = NULL;
    }


Ist das 'DDSCAPS_VIDEOMEMORY'-Flag, welches man mit in die Caps-Strukur packen kann hinsichtlich der Performance eine Betrachtung wert, oder wird ein Backbuffer eventuell immer automatisch im Videospeicher angelegt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Yahoo Messenger MSN Messenger
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 17.07.2006, 17:23    Titel: Antworten mit Zitat

GreveN hat Folgendes geschrieben:
Ist das 'DDSCAPS_VIDEOMEMORY'-Flag, welches man mit in die Caps-Strukur packen kann hinsichtlich der Performance eine Betrachtung wert, oder wird ein Backbuffer eventuell immer automatisch im Videospeicher angelegt?

Ja, soweit ich weiß, wird er sowieso im Videospeicher angelegt. Insofern macht es in dem Fall wohl mehr Sinn, tatsächlich ein eigenes Surface im Systemspeicher anzulegen. Wenn es tatsächlich im Systemspeicher liegt, dann sollte das ganze auch recht fix gehen.
Falls du vorhast, irgendwelche anderen Sprites in den Pseudo-Backbuffer zu kopieren, musst du allerdings aufpassen, in welchem Speicher du diese Sprites anlegst.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum