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

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 31. říjen 2008, 19:44:32 Předmět: |
|
|
Jo, singleton => jednoduché řešení, ne-singleton => robustní řešení |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 3. listopad 2008, 19:24:48 Předmět: |
|
|
Takže nakonec jsem to udělal takhle...
Použil jsem jeden singleton na Core, spolu s instancí Core (v singletonu) se vytvoří (zatím) texturovací manager a renderer, potom už jen vracím ukazatel na texturelib a renderer....
Kód vypadá pak asi takhle:
kód: |
int main(int argc, char *argv[])
{
CORE::GET.initializeme(argv[0]);
RENDERER *rdev = CORE::GET.createrenderer(800,500);
TEXTURELIB *txlib = CORE::GET.createtexturelib();
uint brick = txlib->loadtexture("D:\\textures\\brick.tga");
// renderovací smyčka
CORE::shutdown();
return 0;
} |
Ale mám tu malý problém se SDL...
Když chci během běhu programu změnit rozlišení obrazovky, tak jediný způsob, jak to udělat je zinicializovat video mode v SDL znovu...
Jenže, jenže...zmizí všechny textury z paměti, ale v manageru jsou na ně stále indexy...
Trochu jsem tedy hledal...našel jsem že se toto pod linuxama neděje...jen blbej Windows to udělá...prostě smaže všechny textury z paměti a jedinej způsob jak je tam mít, je načíst znova všechny...
Takže mám dvě možnosti...změnit ještě trochu strukturu a nebo se na to vykašlat a rozlišení nastavit jednou na začátku aplikace (podle configu)...
Máte s tím nějaké jiné zkušenosti než já? _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. listopad 2008, 19:49:29 Předmět: |
|
|
Zaveď config file a nech uživatele změnit rozlišení, potom samozřejmě budeš měnit i ten config, aby podruhé uživatel dostal to rozlišení, který si navolil.
Důvod, proč to na Linuxu v paměti zůstane, je prostý: Na Windows se nejprve vytvoří okno a v něm context, v Linuxu se nejprve vytvoří context a ten se dá jako parametr při vytváření okna, tzn. context na okně nezávisí. Na Windows se to dá obejít tak, že okno nebudeš rušit, ale pouze změníš jeho rozměry a změníš rozlišení. To ale nevím, jestli SDL dokáže, kdysi to ještě neuměl.
Nicméně tento problém je mimojiné i skvělá úloha pro manažer textur - načíst je znovu, když se ztratí. Ke každé textuře si dáš i název souboru, odkud pochází, a při znovuvytvoření okna prostě dříve načtené textury projdeš blbým for cyklem a načteš znovu. Samozřejmě si musíš někde evidovat seznam všech textur. Je to tak triviální, že tato funkce jde zadrátovat snad do libovolnýho enginu.
Bez singletonů to je pěknější:
kód: |
int main(int argc, char *argv[])
{
CORE core(argv[0]); // deklarace objektu na stacku aka RAII, výhoda C++ :)
RENDERER *rdev = core.createrenderer(800,500);
TEXTURELIB *txlib = core.createtexturelib();
uint brick = txlib->loadtexture("D:\\textures\\brick.tga");
// renderovací smyčka
// shutdown se nemusí volat, to zavolá destruktor CORE, kterej se tady volá automaticky
return 0;
} |
_________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 3. listopad 2008, 19:58:10 Předmět: |
|
|
Té první řádce jsem moc neporozumněl, prosím zkus to vysvětlit ještě jednou...
Jinak máš asi pravdu...já jen chtěl tím singletonem zabránit uživateli vytvářet něco dvakrát...ale jak jsem řekl a jak jsi řekl...asi to bude bez toho singletonu lepší.... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
MD

Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 3. listopad 2008, 20:25:01 Předmět: |
|
|
Mit jako singleton "Core" je presne to, co je spatne
Proste sis udelal jakysi nadobjekt, do ktereho budes casem davat vse, co se ti hodi a projevi se ti tam vsechny ty negativni vlastnosti.
Jestli singletony, tak by mely mit jasne vymezenou pusobnost - kdyz je pusobnost omezena, muzes si uvedomit, jestli je to pro singleton vhodny nebo ne. _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 3. listopad 2008, 21:00:48 Předmět: |
|
|
VODA napsal: |
Jinak máš asi pravdu...já jen chtěl tím singletonem zabránit uživateli vytvářet něco dvakrát...ale jak jsem řekl a jak jsi řekl...asi to bude bez toho singletonu lepší.... |
To jde i jinymi prostredky, treba private/protected konstruktor a factory metoda jine tridy. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. listopad 2008, 21:24:15 Předmět: |
|
|
VODA napsal: |
Té první řádce jsem moc neporozumněl, prosím zkus to vysvětlit ještě jednou... |
Budeš mít nějaký config file (ini, xml, ...), v něm nastavení rozlišení a jiné věci. Při spuštění vezmeš rozlišení z config file, to je základ. V aplikaci ale uděláš GUI na změnu rozlišení. Když ho uživatel změní, nové rozlišení se uloží do config file, aby při příštím spuštění dostal to, které předtím nastavil. Už je to jasnější?  _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 3. listopad 2008, 21:30:32 Předmět: |
|
|
Mě jen není jasná část potom...
Jako jako v options nastavím jiné rozlišení, to se uloží a co pak...požádám uživatele o restart? nebo to pustím znova....nebo jak to myslíš...
Sorry mě už to nějak nedocvakává...jsem po náročném psaní tří protokolů na měření do školy a nějak nevím ani čí jsem....  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 3. listopad 2008, 21:34:28 Předmět: |
|
|
Restart ne, prostě to rozlišení okamžitě přepneš, když o to uživatel zažádá. V případě SDL asi budeš muset znovu načíst všechny textury apod. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 4. listopad 2008, 08:14:52 Předmět: |
|
|
Teď mě ještě napadá...kdybych to chtěl napsat jako říká Eosie...to by stačilo použít prvky(jako Texturelib, Renderer) v Core jako statické...
A nebo by to šlo udělat tak, že bych musel na začátku přibindovat Texturelib a podobné objekty ke Core...ukazatel na ně samozřejmně...
Pak by to mohlo vypadat takhle:
kód: |
int main(int argc, char *argv[])
{
TEXTURELIB *txlib = new TEXTURELIB;
RENDERER *rdev = new RENDERER;
// mohu nastavit parametry
rdev->setresolution(800,500);
CORE core(argv[0]);
// bind všech potřebných objektů
core.bindtxlib(txlib);
core.bindrenderer(rdev);
// a po nabindování bych zavolal inicializaci kde by se vlastně inicializovali všechny prvky, např by renderer vytvořil fullscreenové okno...
core.initializeme();
// a když budu chtít změnit rozlišení
rdev->setresolution(640,400);
core.updaterenderer();
// (při překladu se taky podle platformy patřičně ošéfuje texturelib)
// smyčka
// conctruktor se zavolá a zničí přibindované objekty (uvolní je z paměti)
return 0;
}
|
I když nevím, jestli to není krkolomné...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 4. listopad 2008, 08:40:19 Předmět: |
|
|
Trochu jo a vůbec se tím nezbavíš těch nevýhod singletonu. Ještě jednou si přečti poslední příspěvek MD, ten to dobře vystihl. A k čemu vůbec máš ten objekt Core? Pokud je to objekt tak nějak na všechno, tak to porušuje pravidla OOP, kdy má mít každý objekt jasně definovaný účel a nemá dělat 10 různých věcí. _________________ Mám strach |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 4. listopad 2008, 08:51:08 Předmět: |
|
|
ja jenom doplnim dotaz - proc TEXTURELIB a RENDER vytvaret pres new??? - mnohem vhodnejsi je je vytvorit lokalne na stacku a bindnout je pres adresu ze. - stejne tak jako vytvaris core.
ke zbytku nekomentuju protoze uz jsem se vyjadril. vse si poctive predavat v argumentech. |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 4. listopad 2008, 09:22:17 Předmět: |
|
|
Jo a jak koukám na ten tvůj kód,
citace: |
// conctruktor se zavolá a zničí přibindované objekty (uvolní je z paměti) |
tak to je špatně Teda ono to bude fungovat, ale tímhle přístupem si zaděláváš na chyby. Problém je v asymetrii vytváření a mazání - vytváří je main a maže core. Je lepší, když paměť vytváří a maže stejný objekt, protože to potom máš pěkně pohromadě a víš, že když jsem tady vytvořil nějaký nový objekt, že ho tady musím taky smazat.
Pokud to budeš mít tak, že objekt vytváří někdo jiný, než kdo ho maže, budeš si muset navíc pamatovat, jak to teda vlastně je a to si piš, že to časem zapomeneš, nebo uděláš blbě  _________________ Mám strach |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 4. listopad 2008, 09:42:58 Předmět: |
|
|
mno ono uz vubec se nebude volat konstruktor ale destruktor ze
a navic bych doplnil - podivej se do Quiarkova podpisu a drz se zejmena te druhe vety  |
|
Návrat nahoru |
|
 |
VODA

Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 4. listopad 2008, 10:05:53 Předmět: |
|
|
No jo, s tím konstruktorem jsem se spletl
Samozřejmně jsem myslel destruktor...
A s tou likvidací máte pravdu...jako vždy...  _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
 |
|