| Zobrazit předchozí téma :: Zobrazit následující téma |
| Autor |
Zpráva |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 17. srpen 2007, 15:41:44 Předmět: |
|
|
a este. "zadny" SDL_Surface do ktoreho kreslis nemusis pouzivat. mozes pouzit aj prehadzovanie bufrov.
| kód: |
Blit Blit Blit//kreslime
SDL_Flip(screen);//hodime na obrazovku. |
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
| Návrat nahoru |
|
 |
dadajax
Založen: 29. 07. 2007 Příspěvky: 26
|
Zaslal: 17. srpen 2007, 16:22:47 Předmět: |
|
|
| Weny Sky napsal: |
| a pouzivas debuger, aby si zjistil, jestli se ti vubec dostalo rizeni programu do te tve podminky? |
jj, všechno probíhá nádherně, až na to vykreslování
| Weny Sky napsal: |
Dynamickou alokaci 2D pole naprikal 10x20 provedes takto. Nez to ale "tupe" opsat je lepsi si predstavit co to vlastne reprezentuje
| kód: |
int** pole;
pole = new int*[10];
for(int i = 0; i < 10; i++)
pole[i] = new int[20];
|
|
Takže pokud to chápu dobře, tak to pole je ukazatel na pole ukazatelů? Jesli jo, tak se bude muset uvolnit paměť nějak takhle, ne?:
| kód: |
for (int i = 0; i < 10; i++)
delete pole[i];
delete pole;
|
| nou napsal: |
| a este. "zadny" SDL_Surface do ktoreho kreslis nemusis pouzivat. mozes pouzit aj prehadzovanie bufrov. |
Nevím jesli jsem tě dobře pochopil, ale přehazování buferů používám, jen to volám v jiné funkci. Jen mě teď napadá jesli to používám dobře...nejdříve vše nakreslím na screen, a potom vyvolám SDL_FLip(screen), má to tak být, že?
EDIT: mi už to dneska vůbec nemyslí, když napíšu tohle:
| kód: |
for (int i = 0; i < kamera->w; i++)
if ((mapa[i/16] == 1)&&(i%16 == 0))
{
temp->x = i;
temp->y = 0;
SDL_BlitSurface(zed, NULL, screen, temp);
};
|
tak to vykresluje v tom cyklu přímo na obrazovku, a funguje to. Jen jsem teď z toho tak domotaný že už ani nevím, jestli ten pomocný surface vůbec potřebuju, možná to bude stačit takhle 
Naposledy upravil dadajax dne 17. srpen 2007, 16:32:37, celkově upraveno 2 krát |
|
| Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 17. srpen 2007, 16:26:55 Předmět: |
|
|
ano ma. to vykreslovanie do docasneho surface je zbytocne. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
| Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 17. srpen 2007, 16:41:11 Předmět: |
|
|
| dadajax napsal: |
Jesli jo, tak se bude muset uvolnit paměť nějak takhle, ne?:
| kód: |
for (int i = 0; i < 10; i++)
delete pole[i];
delete pole;
|
|
Jo ale musis pouzit: delete [] _________________ AMD Open Source Graphics Driver Developer |
|
| Návrat nahoru |
|
 |
dadajax
Založen: 29. 07. 2007 Příspěvky: 26
|
Zaslal: 20. srpen 2007, 16:21:48 Předmět: |
|
|
Zase jsem trošku pokročil ve vývoji. Teď jsem na tom tak, že dokážu vykreslit mapu o zadaných rozměrech a podle pohybu (zatím pomyslného) hráče se mapa pohybuje. Co mě ale nemile překvapilo je rychlost vykreslování. Komp mám docela výkonný, ale už i u menších map je sekání dost výrazné. Hodím sem kód vykreslování, skuste se na to prosím podívat, jestli tam neuvidíte něco, co zbytečně žere výkon a dalo by se to udělat jinak (lépe).
| kód: |
for (int v =0; v < screen->h; v++)
{
for (int s = 0; s < screen->w; s++)
{
x = (s + LookAt.x - (screen->w/2))/16; //urci pozici x na mape
y = (v + LookAt.y - (screen->h/2))/16; //urci pozici y na mape
xm = (s + LookAt.x - (screen->w/2))%16; //o kolik px je treba obrazek posunout
ym = (v + LookAt.y - (screen->h/2))%16;
if ( x >= sirka || y >= vyska)
continue;
if ( y < 0 || x < 0)
continue;
temp->x = s; //souradnice na ktere se bude vykreslovat(na screen)
temp->y = v;
ttemp->x = xm; //urcuje pocatecni souradnice, od kterych se budou
ttemp->y = ym; //zobrazovat jednotlive obrazky
//a nakonec samotne vykreslovani, podle hodnoty v poli mapa
if (mapa[y][x] == 1)
SDL_BlitSurface(zed, ttemp, screen, temp);
if (mapa[y][x] == 0)
SDL_BlitSurface(zem, ttemp, screen, temp);
};
}; |
Jako obrázky používám zatím provizorně modrý png obrázek velikosti 16x16px a pro podlahu bíly obrázek té samé velikosti.
Zkoušel jsem upravit parametry při inicializaci SDL, změnil jsem bitovou hloubku(nebo jak se tomu říká) na 8, předtím jsem tam měl 0, což dosadí nejspíše hodnotu jakou používá aktuálně systém - takže 32. Rozdíl byl celkem znát, hýbe se to trochu svižněji, ale pořád to není ono.
Proto bych se chtěl zeptat, jak se dá ještě vylepšit výkon SDL aplikací?
A co ta bitová hloubka? Jaká hodnota je ideální na hry?
Jelikož grafiku dodělám až bude hra hotová (no spíše doufám že najdu někoho kdo ji pro mě udělá, jelikož mé grafické nadání je silně pod bodem mrazu), zajímá mě, jesli je velikost políček 16x16 vhodná, jesli není lepší zvolit něco trošku většího? Ještě dodatek: hra by měla být viděna z pohledu zvrchu. |
|
| Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 20. srpen 2007, 16:54:29 Předmět: |
|
|
Co se týče velikosti políček, když si zavedeš konstanty FIELD_WIDTH a FIELD_HEIGHT, nastavíš je na 16 a budeš je všude používat místo těch 16, pak bude změna velmi jednoduchá. V opačném případě to bude docela fuška. _________________ Mám strach |
|
| Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1051
|
Zaslal: 20. srpen 2007, 18:05:32 Předmět: |
|
|
1. vykreslovat iba to co je vidiet. to myslim robis.
2. v SetVideoMode dat SDL_HWSURFACE inak uz neviem, pretoze tamten cyklus pokial vynechas Blit ti spravi primerny comp aj stotisickrat za sekundu.
a skus pocitat FPS.
| kód: |
fps++;
if(SDL_GetTicks()-fpstime > 1000)
{
sprintf(Title,"FPS: %d",fps);
SDL_WM_SetCaption(Title, NULL);
fpstime=SDL_GetTicks();
fps=0;
} |
_________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
| Návrat nahoru |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 20. srpen 2007, 18:28:39 Předmět: |
|
|
no tvuj hlavni problem je, ze to mas uplne cele od zakladu spatne a snazil jsem se ti to naznacit uz minule.
Kdyz se zamyslis nad tim, co delas, tak pri rozliseni 1024x768 potrebujes vykreslit cca 3500 policek (3072 + ty co presahuji), tedy potrebujes do toho cyklu vstoupit presne 3500 krat. Jenze kdyz se podivu na tvuj kod, tak tam vstoupis 1024 * 768 == 786 432!!! Doufam, ze si uvedomujes ten rozdil mezi 3500 a 800 000!
Zadruhe ty ctyri vypocty na zacatku cyklu jsou naprosto zbytecne, protoze tyto data muzes mit uz castecne ulozene predpocitane!
Takze ted ti lehce nastinim, jak bych si predstavoval reseni.
Cykly budou optimalizovane a budou prochazet pouze oblast, ktera je opravdu videt. Tedy cykly budou mit zadane maximalni a minimalni meze a pujdou primo po policcich mapy ne po pixelech obrazovky!
| kód: |
int bound_x_min, bound_x_max, bound_y_min, bound_y_max;
bound_x_min = LookAt.x / 16;
bound_x_max = bound_x_min + screen->w / 16 + 1;
bound_y_min = LookAt.y / 16;
bound_y_max = bound_y_min + screen->h / 16 + 1;
for(int x = bound_x_min; x < bound_x_max; x++)
{
for(int y = bound_y_min; y < bound_y_max; y++)
{
// aktualni pozice policka
ttemp->x = x*16-LookAt.x;
ttemp->y = y*16-LookAt.y;
/*prikazy pro vykresleni*/
}
}
|
|
|
| Návrat nahoru |
|
 |
dadajax
Založen: 29. 07. 2007 Příspěvky: 26
|
Zaslal: 20. srpen 2007, 19:22:32 Předmět: |
|
|
Weny Sky: Ten tvůj kód nefunguje, vykreslí jen jedno políčko na souřadnici [1,1] a při jakékoliv změně pozice nenávratně zmizí. Nicméně chápu jak to myslíš (teda alespoň doufám), takže už to nějak vykutím.
To jakou dělám blbost jsem si uvědomil až když jsem si přečetl ty čísla které jsi srovnával, je to fakt velký rozdíl a mohlo mě to napadnout. Už chápu proč to jelo tak pomalu. Ale ten pocit, když se mi podařilo tu mapu vykreslit správně, to se snad ani nedá popsat
EDIT: Tááák, konečně už to jde! Hned to šlape rychleji, teď jdu uklidit v kódu, začínám tam mít bordel, ještě doladím pár věcí, a vrhnu se na změně vykreslování, aby nebylo závislé na počtu snímku za sekundu, takže očekávejte brzo mé další blbé dotazy
Díky moc za všechny rady |
|
| Návrat nahoru |
|
 |
|