Thread: DirectDraw buffer zelf gebruiken
-
26-03-2005, 22:42 #1Member
- Registered
- 16/01/03
- Location
- Sint-Amandsberg
- Posts
- 44
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
DirectDraw buffer zelf gebruiken
Hallo!!
Ik ben net begonnen met een hoop tutorials over DirectX te bekijken. Ik zou graag een 2D-spelletje maken. Nu, in al die tutorials wordt gezegd hoe je een bitmap moet blitten op het scherm, hoe met sprites werken enzovoort enzovoort.. (met DirectDraw)
(Met d3d9 kan ik nu ook driehoekjes enzovoort op het scherm toveren, maar dat heb ik niet onmiddellijk nodig)
Wat ik dus wél nodig heb, is de volledige controle over mijn scherm. Waarbij ik dus bijvoorbeeld de buffer van DirectDraw (het stuk in het videogeheugen dat in de backbuffer zit) rechtstreeks kan manipuleren om dan te flippen. Misschien dat ergens een beginadres van deze buffer gedefinieerd is waar ik niet van weet?
Ik heb een voorbeeld gezien waarbij PutPixel de pixels één voor één op het scherm zet met directx, maar vanaf dat je een scherm van 640*480 wil vullen, zit je al een halve seconde bezig, dus da's ook geen oplossing.
Iemand die hier een oplossing voor kent/heeft, of een alternatief dat mij ook toelaat rechtstreeks in het geheugen te schrijven?
Veel dank bij voorbaat!P4 2.533 @533, 1024 DDR Ram, ati 9700pro
Core 2 Duo E6600, 2 gig OCZ @ 667, nVidia 7900 GS
Dell Inspiron 9300no votes
-
-
27-03-2005, 16:36 #2no votes
-
27-03-2005, 22:48 #3
render naar een texture, en bewerk die texture dan , en render die texture dan op uw scherm ?
(gokjeuuuh
)
Day by day photoblog: http://w.twwwo.be/no votes
-
28-03-2005, 01:37 #4Member
- Registered
- 13/11/04
- Posts
- 62
- iTrader
- 0
- Mentioned
- 0 Post(s)
no votes
-
28-03-2005, 03:12 #5
Je kan ook gewoon BitBlt ("blitten") via de Windows API. Maar of het aan je snelheidsverwachting voldoet weet ik niet.
[LifeIsDigital.net] - Mijn artikels, open source software en projecten!no votes
-
28-03-2005, 13:06 #6Member
- Registered
- 17/07/02
- Location
- PSPACE
- Posts
- 4,603
- iTrader
- 14 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/18
Moet je wel eerst een Direct Draw Surface Description struct opbouwen en die in de variabele ddsd stoppen, dan kan je dus via ddsd.lpSurface aan je pointer naar je surface (video geheugen) geraken.Code:lpddsprimary->Lock(NULL, &ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL))) USHORT *video_buffer = (USHORT *)ddsd.lpSurface;
Only art and science can and try to change the world, therefore paying millions to useless sportsmen is sheer idiocy.
The man, the legend: Dijkstrano votes
-
28-03-2005, 15:34 #7
Ook de standaard DirectX 9 oplossing (DirectDraw krijgt geen updates meer, DirectX Graphics is de enige grafische component van nieuwere DirectX versies, en is eigenlijk de opvolger van Direct3D). Je moet inderdaad terug naar DirectX 7 voor de oude stijl.
OpenGL heeft trouwens wel functies om direct van hoofd-RAM naar een back- of frontbuffer te kopiëren, maar die werden traditioneel nooit echt geoptimaliseerd in de drivers (toch niet op PC hardware, op SGI machines en in bepaalde software OpenGL renderers zijn de functies wel snel), daarom dat de kopie naar texture gevolgd door het gebruik van die texture standaard geworden is."If you have a right to respect, that means other people don't have a right to their own opinions."
Thomas Sowellno votes
-
28-03-2005, 22:08 #8Member
- Registered
- 16/01/03
- Location
- Sint-Amandsberg
- Posts
- 44
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
Ah bedankt! Ik zal het eens proberen.
En hoe werkt die oplossing in dx9 dan precies? Dan moet je op je texture schrijven, en hoe gebeurt dat precies? Ook via een adres naar de texture ofzo?
Bedankt alvast voor de replies!P4 2.533 @533, 1024 DDR Ram, ati 9700pro
Core 2 Duo E6600, 2 gig OCZ @ 667, nVidia 7900 GS
Dell Inspiron 9300no votes
-
28-03-2005, 23:55 #9Member
- Registered
- 16/01/03
- Location
- Sint-Amandsberg
- Posts
- 44
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
Yippie, na wat prutsen werkt het! Nu nog even uitzoeken of het snel genoeg gaat.
Ik moest wel nog die USHORT vervangen door een int, omdat een short toch niet groot genoeg is om een geheugenadres in op te slaan..?
En het alternatief in DX9 is nog steeds welkom, omdat ik nu met directdraw7 zit en dat wordt al een beetje verouderd niet?
Bedankt alvast!P4 2.533 @533, 1024 DDR Ram, ati 9700pro
Core 2 Duo E6600, 2 gig OCZ @ 667, nVidia 7900 GS
Dell Inspiron 9300no votes
-
29-03-2005, 11:01 #10
Reck, zie dat je in het vervolg op de juiste knopjes drukt
Uzghul, 70 Rogue; Tankghul, 70 Warrior; Uziuz, 70 Paladin; Skinny, 70 Priest; Darkrune, 70 Warlock; UniKorn, 60 Druid; Martinuz, 59 Hunter; Marceluz, 59 Mage; Flexy, 30 Rogue;no votes
-
29-03-2005, 13:00 #11Member
- Registered
- 17/07/02
- Location
- PSPACE
- Posts
- 4,603
- iTrader
- 14 (100%)
- Mentioned
- 0 Post(s)
- Reputation
- 0/18
Die USHORT gaf geen problemen bij mij hoor ... zo staat het trouwens in het boek "Tricks of the windows game programming gurus" beschreven.
Only art and science can and try to change the world, therefore paying millions to useless sportsmen is sheer idiocy.
The man, the legend: Dijkstrano votes
-
29-03-2005, 14:51 #12Member
- Registered
- 16/01/03
- Location
- Sint-Amandsberg
- Posts
- 44
- iTrader
- 0
- Mentioned
- 0 Post(s)
- Reputation
- 0/0
Bij mij crasht hij als ik het probeer met een ushort.. Vreemd

Amai, zo'n verschillen. Als ik het scherm gewoon vul met nulletjes haal ik zo'n 400 frames/seconde, vanaf dat ik zoiets doe:
unsigned int *p = video_buffer;
for( int i = 0; i < 600; i++ ) {
for( int j = 0; j < 800; j++ ) {
afstand = (int)sqrt( (double)i*i + j*j );
*p++ = 0xff000000 + (i%256) + (timer%256)<<8 + (afstand%256)<<16;
};
p+=(pitch_min_width);
};
(Met pitch_min_width de lengte van het stuk buffer dat niet gebruikt wordt.)
Dan heb ik nog maar 'n 30 frames meer over... En dan heb ik nog niet het spel zelf geprogrammeerd
(alhoewel de 'body' van het spel hoeft maar een 4-tal keer per seconde aangeroepen te worden).
Is het videogeheugen sneller of trager dan het ram? Anders maak ik een gigantische buffer (1024x600) (1024 is de pitch van het scherm) in het ram aan en memcpy ik gewoon heel het boeltje in m'n draw-functie..
Nog iemand die zoiets kan doen in directx 9? Misschien dat dat iets sneller gaat?P4 2.533 @533, 1024 DDR Ram, ati 9700pro
Core 2 Duo E6600, 2 gig OCZ @ 667, nVidia 7900 GS
Dell Inspiron 9300no votes
-
03-04-2005, 19:35 #13
OK, stel dat je een 3GHz processor hebt.
Delen door 30 fps -> 1e8 kloktikken per frame.
Delen door 800*600 geeft iets meer dan 200 kloktikken per pixel.
Vermits je conversies van int naar double en terug doet (vooral terug van double naar int is nogal traag in C), en dan nog naar videogeheugen schrijft (toch een beetje trager dan naar gewoon RAM) is dat eigenlijk nog wel normaal.
Type pointer zal uiteraard afhangen van het type surface - 16 of 32 bits (of 8, als je dat zou willen)."If you have a right to respect, that means other people don't have a right to their own opinions."
Thomas Sowellno votes
