Toistaa ruudulla kaunista lumisadekuviota, aivan kuten sinun televisiosi. Varoitus! Ohjelma vaatii väh. Windows 95, ja se käyttää directdrawia
#include <windows.h> #include <ddraw.h> #include <mmsystem.h> HWND hWnd; LPDIRECTDRAW lpDD; LPDIRECTDRAWSURFACE surf; DDSURFACEDESC ddsd; unsigned int *dBuffer; #define WIDTH 320 #define HEIGHT 240 #define MAX 320*240 inline static void* __cdecl ALLOC(unsigned int cb) { return HeapAlloc(GetProcessHeap(),0,cb); } inline unsigned int fastrand() { static int seed=0xcafebabe; return (unsigned)(seed=seed*0x97654321+1)>>17; } inline unsigned int rgb(short r, short g, short b) { return ((r<<16)+(g<<8)+b); } //kääntäjän juttuja #if defined(__cplusplus) extern "C" { #endif extern const int _fltused = 1; #if defined(__cplusplus) } #endif void mainCRTStartup() { hWnd = CreateWindowEx(WS_EX_TOPMOST, "STATIC", 0, WS_POPUP | WS_VISIBLE, 0, 0, WIDTH, HEIGHT, 0, 0, 0, 0); ShowCursor(FALSE); ShowWindow(hWnd,SW_SHOW); DirectDrawCreate(NULL,&lpDD,NULL); lpDD->SetCooperativeLevel(hWnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN); lpDD->SetDisplayMode(WIDTH,HEIGHT,32); ddsd.dwSize=sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount = 1; ddsd.ddsCaps.dwCaps = DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY | DDSCAPS_PRIMARYSURFACE; lpDD->CreateSurface(&ddsd,&surf,NULL); dBuffer=(unsigned int*)ALLOC(320*240*4); bool done=false; while(!done) { static float kak; kak+=0.10f; for(int c=0;c<MAX;c++) { int ja=fastrand()%255; dBuffer[c]=rgb(ja,ja,ja); } surf->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); int w=ddsd.dwWidth; int h=ddsd.dwHeight; int bpl=ddsd.lPitch; int bpp=32; char *dest = (char *) ddsd.lpSurface; char *src = (char *)dBuffer; _asm { mov edi,dest mov esi,src mov eax,w shl eax,2 mov ebx,bpl sub ebx,eax mov eax,w mov ecx,h looppi: mov edx,ecx mov ecx,eax rep movsd add edi,ebx mov ecx,edx loop looppi } surf->Unlock(NULL); if(GetAsyncKeyState(VK_ESCAPE) & 0x8000) { done=true; } } DestroyWindow(hWnd); }
Joo.. Tästähän voi opetella DirectDraw-ohjelmointia :-)
lainaus:
Varoitus! Ohjelma vaatii väh. Windows 95, ja se käyttää directdrawia
Heh! Aika hyvä huomio tuo sana varoitus.
Vaan en nyt tiedä mitä tuo inline-asm varsinaisesti tekee, mutta eikö se nyt olisi parempi toteuttaa C:llä kun nyt kerran tämä on niinkuin esimerkki. Tietysti ehkä nopeus kärsii. Ehkä. En tiedä.
Koodi on tarkoitettu ripattavaksi, eikä siitä kannata oppia mitään. Siksi tarjoankin Teille talon parasta, inline asm koodia. Sen avulla kyllä pikselit hyrräävät ruudulla kuin kiimaiset koirat :)
Inline-assyn käyttö on ihan järjetöntä tuollaisissa paikoissa (ja melkein kaikissa muissakin paikoissa). Koodin ymmärrettävyys lähenee nollaa ja vaikutus nopeuteen on todennäköisesti negatiivinen. Kyllä ne nykykääntäjät tuottavat aivan riittävän hyvää koodia ja todennäköisesti tuo sinunkin pätkäsi toimisi vain nopeammin, jos antaisit kääntäjän tehdä optimoinnit.
Enkä tiedä DirectX-ohjelmoinnista paljonkaan, mutta täytyykö siinä tosiaankin manuaalisesti itse kopioida surfacen data? Luulisi että siellä on joku blit-funktio, joka tekisi täsmälleen saman ja paljon nopeammin.
Ei lumisadekuvio oo kaunista eikä minulla oo televisioo :< virheellinen kuvaus :<
Aihe on jo aika vanha, joten et voi enää vastata siihen.