.[ ČeskéHry.cz ].
Singleton::jak to s ním vlastně je?
Jdi na stránku Předchozí  1, 2, 3, 4  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
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

PříspěvekZaslal: 31. říjen 2008, 19:44:32    Předmět: Odpovědět s citátem

Jo, singleton => jednoduché řešení, ne-singleton => robustní řešení
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 3. listopad 2008, 19:24:48    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 3. listopad 2008, 19:49:29    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 3. listopad 2008, 19:58:10    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 3. listopad 2008, 20:25:01    Předmět: Odpovědět s citátem

Mit jako singleton "Core" je presne to, co je spatne Wink
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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
OndraSej



Založen: 28. 07. 2007
Příspěvky: 767
Bydliště: Brandýs nad Labem

PříspěvekZaslal: 3. listopad 2008, 21:00:48    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 3. listopad 2008, 21:24:15    Předmět: Odpovědět s citátem

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ší? Wink
_________________
AMD Open Source Graphics Driver Developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 3. listopad 2008, 21:30:32    Předmět: Odpovědět s citátem

Mě jen není jasná část potom... Wink
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íš...
Wink 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.... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Marek



Založen: 28. 07. 2007
Příspěvky: 1782
Bydliště: Velká Morava

PříspěvekZaslal: 3. listopad 2008, 21:34:28    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 4. listopad 2008, 08:14:52    Předmět: Odpovědět s citátem

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é... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 4. listopad 2008, 08:40:19    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 4. listopad 2008, 08:51:08    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Quiark



Založen: 29. 07. 2007
Příspěvky: 816
Bydliště: Chlívek 401

PříspěvekZaslal: 4. listopad 2008, 09:22:17    Předmět: Odpovědět s citátem

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ě Smile 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ě Smile
_________________
Mám strach
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 4. listopad 2008, 09:42:58    Předmět: Odpovědět s citátem

mno ono uz vubec se nebude volat konstruktor ale destruktor ze Smile

a navic bych doplnil - podivej se do Quiarkova podpisu a drz se zejmena te druhe vety Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 4. listopad 2008, 10:05:53    Předmět: Odpovědět s citátem

No jo, s tím konstruktorem jsem se spletl Very Happy
Samozřejmně jsem myslel destruktor... Wink

A s tou likvidací máte pravdu...jako vždy... Very Happy
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3, 4  Další
Strana 2 z 4

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna