Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
survik1
Založen: 22. 08. 2007 Příspěvky: 107
|
Zaslal: 8. září 2007, 18:34:04 Předmět: SDL a rotace |
|
|
Dobrý den. Chci se zeptat, jestli se dá s obrázkem nějak rotovat? Nechci ale k tomu použít OpenGL. |
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
|
Návrat nahoru |
|
|
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 8. září 2007, 19:47:17 Předmět: |
|
|
v tom threade odporucily pouzit SDL_gfx co problem rotacie riesi ale vystava problem ze sa to neda prilis pouzit v realnom case pretoze je to prilis narocne ny vykon. su tri riesenia.
1. pouzit OpenGL DX
2. predpripravit si natocene sprity bud v grafickom editore
3. alebo pri nacitavani pomocou SDL_gfx _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
tichy
Založen: 19. 12. 2007 Příspěvky: 3
|
Zaslal: 19. prosinec 2007, 16:56:47 Předmět: Re: SDL a rotace |
|
|
survik1 napsal: |
Dobrý den. Chci se zeptat, jestli se dá s obrázkem nějak rotovat? Nechci ale k tomu použít OpenGL. |
Čau, tendle problém jsem taky řešil, napsal jsem si nato vlastní funkci:
kód: |
void rotace (SDL_Surface *srcs,SDL_Surface *dsts,double uhel,double x, double y)
{
double i,j,UHEL,sinuhel,cosuhel,pricX,pricY,pocvyk,sinuheli,cosuheli;
double srcsw,srcsh;
Uint32 Px,Py,*barv,scp4,*pixpoz,pop4;
srcsw=srcs->w;
srcsh=srcs->h;
scp4=dsts->pitch/4;
pop4=srcs->pitch/4;
sinuhel=sin(uhel);
cosuhel=cos(uhel);
pricX=x-(sinuhel*((srcsw/2))-cosuhel*((srcsh/2)));
pricY=y-(cosuhel*((srcsw/2))+sinuhel*((srcsh/2)));
for (i=0;i<srcsw;i+=1)
{
sinuheli=sinuhel*i;
cosuheli=i*cosuhel;
for (j=0;j<srcsh;j+=1)
{
barv=(Uint32 *)srcs->pixels + ((Uint32)j)*pop4 + ((Uint32)i);
Px=(Uint32)(((sinuheli)-(j*cosuhel))+pricX);
Py=(Uint32)(((sinuhel*j)+(cosuheli))+pricY);
pixpoz=((Uint32 *)dsts->pixels +(Py*scp4 + Px));
*pixpoz=*barv;
*(pixpoz+1)=*barv;
}
}
} |
V programu pak:
rotace(zdroj_obr,kam_vykreslit,uhel,x,y)
Ale má to par omezeni:
Zdrojová i cílová surface musí bejt ve 32bit (dá se lehce upravit i pro jiné)
Do cilove oblasti se musi obrazek vejit, jinak program spadne
jinak nezapomeň si přidat knihovnu math.h pro sin a cos
Kdyby náhodou znal nikdo lepší funkci na rotaci obrázku, byl bych rád za každej nápad. Tudle funkci jsem poměrně slušně odladil, takže u malejch obr je poměrně rychlá.[/code] |
|
Návrat nahoru |
|
|
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 22. březen 2008, 20:03:40 Předmět: |
|
|
Opravdu neexistuje nějáká f-ce, která by využívala HW a byla rychlá? Nejrychlejší funkce, kterou jsem našel dokázala otočit 25 obrázků 70 × 70 bodů při 20fps
Vždyť i Game Maker umí realtime točit obrázky |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 22. březen 2008, 20:39:30 Předmět: |
|
|
OpenGL. Nezáleží, jestli tam s něčím točíš nebo ne, furt je to stejně rychlý. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 22. březen 2008, 21:01:57 Předmět: |
|
|
JJ, to vím, ale neexistuje nějáká už někde napsaná f-ce na to točení?OpenGl prozatím totiž moc neholduju... |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 23. březen 2008, 00:09:06 Předmět: |
|
|
Pokud to chceš HW akcelerované, musí se to provést ve videopaměti a pak to tam buď musí dočasně zůstat nebo se to zobrazí na display. Zpět na RAM by se to vracet nemělo, protože ty přesuny cpu<->gpu dost zpomalují, což je problém. SDL rotace myslím pracuje v softwaru na cpu, takže by sis moc nepomohl. A pokud vím, pohodlnější přístup k HW než přes GL a D3D není. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 23. březen 2008, 19:32:28 Předmět: |
|
|
Díky, ale OGL nebo DirectX se zatím učit nehodlám, no asi se bez toho budu muset obejít...
Tď mě ještě napadlo: Jde dostat SDL_Surface do chache procesoru? Potřeboval bych totiž rotovat malými obrázky(max 40 × 40px) a myslím, že by to ten proces možná urychlilo.... |
|
Návrat nahoru |
|
|
tichy
Založen: 19. 12. 2007 Příspěvky: 3
|
Zaslal: 23. březen 2008, 19:58:40 Předmět: |
|
|
yaqwsx napsal: |
Opravdu neexistuje nějáká f-ce, která by využívala HW a byla rychlá? Nejrychlejší funkce, kterou jsem našel dokázala otočit 25 obrázků 70 × 70 bodů při 20fps
Vždyť i Game Maker umí realtime točit obrázky |
Skoušel jsi tu mojí funkci co zmiňuju nahoře? teď si nejsem jistej jak moc je to rychlí (už je to docela dlouho co jsem to psal), ale myslim si že na mim 1,8 GHz to točilo s obr 640x480 nějakejch 30-40 Fps a těch tvejch 70x70 musí i ta nejhorší funkce utočit min 200 Fps
yaqwsx napsal: |
Tď mě ještě napadlo: Jde dostat SDL_Surface do chache procesoru? Potřeboval bych totiž rotovat malými obrázky(max 40 × 40px) a myslím, že by to ten proces možná urychlilo.... |
Když to vemeš 40x40, to máš 1600 pixelů , pokud bys to rotoval 30Fps tak dostaneš 48 000 pixelů, což je tak směšná hodnota pro procesor, co jsem skoušle na mim 1,8 GHz tak neni problém vykreslit bez HW akcelerace 5-8 milionu pixelů . |
|
Návrat nahoru |
|
|
yaqwsx
Založen: 25. 02. 2008 Příspěvky: 66
|
Zaslal: 23. březen 2008, 21:04:46 Předmět: |
|
|
Ja jsem jako test zkoušel točit 50 obrázků 100 × 100px na jeden krok a dostal jsem se k hodnotám 20 fps, a to nemám až zas tak špatné PC...
Jinak tady není problém v rychlosti procesoru(to je pro něj směšný úkol), ale v neustálém cestování dat CPU -> RAM a zpět
Asi zkusím udělat první návrh a pak uvidím, jak to s tou rychlostí bude... |
|
Návrat nahoru |
|
|
Weny Sky
Založen: 28. 07. 2007 Příspěvky: 241
|
Zaslal: 23. březen 2008, 21:14:56 Předmět: |
|
|
yaqwsx napsal: |
Tď mě ještě napadlo: Jde dostat SDL_Surface do chache procesoru?. |
pokud je ten surface ulozeny v systemove ram, tak to urcite pres cache jde
Ale jinak k tvemu problemu. To je takovy problem si ty sprity predpocitat treba po 6°, kdyz uz se tak branis OpenGL, kde napises jen glrotatef(...) a mas to orotovane |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 23. březen 2008, 22:17:37 Předmět: |
|
|
weny - dokonce jeste optimalnejsi reseni - nez to predpocitat najednou - pocitat to az je potreba - pri kazdem kresleni spritu ifnout do pole jeste tam je nebo neni NULL - pokud ne vim ze mam obrazek predrotovany - pokud je predpocitam ho a priste uz ho pouziju
ad pouziti cache - do cache ti to cpe sam optimalizer - nemel by ses mu do toho srat - nevis co vsechno ostatni se vali v cachi
a tvuj problem - snazis se resit neresitelne - pomalost RAM - misto abys tomu predpocitanim pomohl - resit SW vec, ktera jenom na HW - takze misto toho pocitat porad stejnou vec dokola ji spocitej jednou, uloz a priste jenom pouzij |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 23. březen 2008, 23:46:30 Předmět: |
|
|
Nj ve starých hrách stejně byly všechny rotace objektů, od kterých se očekávalo, že se budou rotovat, předpočítané. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 24. březen 2008, 08:41:05 Předmět: |
|
|
Eosie napsal: |
Nj ve starých hrách stejně byly všechny rotace objektů, od kterých se očekávalo, že se budou rotovat, předpočítané. |
jj mam v zive pameti nejenom rotace, ale i 2D animace - v 3D muzes pekne hybat objekty a nasimulovat treba otvirani dveri - ve 2D se to pekne rozkresli do 20 fazi pruhledneho obrazku |
|
Návrat nahoru |
|
|
|