 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Kovok Mini JLI'ler
Alter: 36 Anmeldedatum: 06.07.2006 Beiträge: 8 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 17.07.2006, 14:31 Titel: |
|
|
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 |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 17.07.2006, 14:55 Titel: |
|
|
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 |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 17.07.2006, 14:58 Titel: |
|
|
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 |
|
 |
Kovok Mini JLI'ler
Alter: 36 Anmeldedatum: 06.07.2006 Beiträge: 8 Wohnort: Bonn Medaillen: Keine
|
Verfasst am: 17.07.2006, 15:08 Titel: |
|
|
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 |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 17.07.2006, 16:14 Titel: |
|
|
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 |
|
 |
The Lord of Programming Living Legend

Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 17.07.2006, 17:23 Titel: |
|
|
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 |
|
 |
|
|
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
|