[C++] Snelste manier van tekenen

Pagina: 1
Acties:

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Ik heb mijn oude polygonen projectje (zie [rml][ 3d] Zelf een Z-Buffer bakken (?)[/rml]) weer opgepakt, en dit keer in C++ gegooit. Boel voordelen, vooral de snelheid. Nu is er één ding wat ik me afvraag (naja, wel meer, maar dit kan ik niet zelf): wat is nou het snelst om in te tekenen? Op het moment doe ik

C++:
1
2
3
    memhdc = CreateCompatibleDC(GetDC(0)); //GetDC mag ook NULL zijn
    membitmap = CreateCompatibleBitmap(GetDC(0),1400,1000);
    SelectObject(memhdc,membitmap);


dit om een memory DC te maken, en die blit ik aan het einde van mijn loopje naar de hdc van mijn window.

Nu blijkt dat de LineTo en de MoveToEx een behoorlijke vertraging introduceren. Zou het niet simpeler zijn om zelf in een array te werken en die te blitten? Zo ja, hoe?

(ow, en hoe krijg ik die memhdc weer SNEL leeg? Toch niet met BitBlt he?)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je kunt idd in een eigen array tekenen en deze naar de DC te kopieren met SetDIBitsToDevice (), of (en dat is nog beter) je kunt een memory DC maken die naar een eigen gemaakt stuk geheugen wijst met CreateDIBSection ()

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
Holy crap! Ik vond het maken van een eigen DC al moeilijk... Ik kom hier niet echt verder mee. MSDN geeft weinig info (alleen maar ERG cryptische meuk, en via Google kom ik ook niet veel tegen)

  • Krooswijk.com
  • Registratie: Mei 2000
  • Laatst online: 17-08-2024
offtopic:
wat betekent blitten? (suggestie: switchen tussen geheugen en scherm ofzo??)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Krooswijk.com schreef op 23 mei 2003 @ 14:54:
offtopic:
wat betekent blitten? (suggestie: switchen tussen geheugen en scherm ofzo??)
Blitten is het kopieren van vierkante stukken images naar ergens anders (meestal een, al dan niet offscreen, andere image). Ik geloof dat het voor BLock Image Transfer staat. Is een redelijk belangrijke operatie, de Amiga had er zelfs een aparte chip voor, de (roffel), jawel, Blitter :)

[ Voor 14% gewijzigd door Gerco op 23-05-2003 15:12 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
gebruik gewoon DirectX/OpenGL... wie schrijft er nu een software poly renderer (behalve als oefening). In Beide copy je gewoon naar een subtexture en verschijnt onmiddelijk op je display.

Een blit is erg snel maar als je telkens een memdc aanmaakt natuurlijk niet... zoals oisyn al zei is een CreateDIBSection erg leuk. Ik geloof dat in DirectDraw (nu gewoon onderdeel van Direct3D zover ik weet) je direct aan de video mem buffer geraakt (ie : 0xa000) en je ook nog lekker kun page-swappen zoals in de good-ole-days...

Kroos: blit is een mooi woord voor copy/paste :) alleen kan een blit ook puur inhardware gebeuren zonder een memcpy (ie DMA transfer), maar dat hangt af van je video driver niet van windows.

Eigenlijk zou je je GDI+ moeten gebruiken (aangezien deze in theorie veel sneller kan worden (is ie nog niet op mijn bakkie))....

Persoonlijk gebruik ik OpenGL (omdat ik vermoed dat de copy/paste via AGP gaat en dat is lekker snel) en je krijgt dan ineens een boel extra 'goodies' (ie Filtering, alpha, noem maar op)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gerco schreef op 23 May 2003 @ 15:10:
[...]

Blitten is het kopieren van vierkante stukken images naar ergens anders (meestal een, al dan niet offscreen, andere image). Ik geloof dat het voor BLock Image Transfer staat. Is een redelijk belangrijke operatie, de Amiga had er zelfs een aparte chip voor, de (roffel), jawel, Blitter :)
BitBLT staat voor Bit BLock Transfer. Het uitspreken van BLT als blit heeft een historische reden die ik nu even niet kan vinden :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
offtopic:
[quote].oisyn schreef op 23 mei 2003 @ 15:25:
[...]
BitBLT staat voor Bit BLock Transfer. Het uitspreken van BLT als blit heeft een historische reden die ik nu even niet kan vinden :)[/quote]

omdat ie dan als Bacon, Lettuce and Tomato zou worden uitgesproken ?

  • Battle Bunny
  • Registratie: Oktober 2001
  • Laatst online: 02-02 21:41
hobbit_be: Als ik wil klooien met matrices, ai, collision detection, etc pak ik wel D3D. Het gaat om het rekenwerk, wat ik allemaal zelf wil doen. Wat boeit het mij dat iemand het al eerder heeft gemaakt?

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
Battle_Bunny schreef op 23 May 2003 @ 15:57:
hobbit_be: Als ik wil klooien met matrices, ai, collision detection, etc pak ik wel D3D. Het gaat om het rekenwerk, wat ik allemaal zelf wil doen. Wat boeit het mij dat iemand het al eerder heeft gemaakt?
Fair enough - we kunnen hier toch niet weten of je met iets bezig bent dat 'af' moet zijn of gewoon 'playtime'? - toch zul je D3D moeten gebruiken in Windows (NT) voor aan de 'rauwe' framebuffer te geraken. Dat dit deel niet echt 3D is heeft er niets mee te maken. Het is gewoon de enige plek waar je aan het echte Video Memory geraakt. En OpenGL is heel simpel ook al teken je ALLES in software (ie het maakt toch niet uit wat de API is, je moet er toch een gebruiken). Waarom denk je dat de volgende Versie van windows dit ook gaat doen (en OS X dit al doet).
Pagina: 1