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

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 1. červenec 2009, 19:15:04 Předmět: Načítání modelů |
|
|
Mám třídu MODEL(nepopisuju sem podtřídy - je to pouze př.) a chci se zeptat, jestli je lepší udělat v konstruktoru načtení modelu (+metodu pro vykreslení) a dělat tím pádem tolik instancí třídy, kolik budu chtít načíst modelů nebo ve třídě model udělat metodu LoadModel a nějak je indexovat a pak jen vykreslovat modely podle indexů a mít pouze jednu instanci třídy MODEL. Co je výhodnější (pro rychlost) ? |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 1. červenec 2009, 19:40:35 Předmět: |
|
|
Urob si jednu triedu a z tej normalne vytvaraj instancie. Na rychlosti to urcite nikdy nepoznas A nepoznas to ani ked tam budes mat polymorfizmus a virtualne metody. To preto, ze vsetko ostatne bude urcite pomalsie ako volanie metod tvojich tried, lebo ich bude relativne malo (tisice, desattisice). O toto sa neboj.
Akurat potom by si asi chcel mat nejaky manazer, ktory si bude vsetky instancie pamatat a pekne ich vykreslovat (cize volat modelInstances[i]->draw() alebo podobne). Tu asi existuje viac pristupov, vsak ostatni nieco pekne napisu
Co sa tyka LoadModel, tak to mozes narvat kludne aj do konstruktora. V pripade chyby pri nacitani musis hodit vynimku (alebo to nejako vhodne osetrit). Druha moznost je vytvorit "prazdnu" instanciu a az potom do nej nacitat mesh. Pozor, vykreslovanie si potom musi kontrolovat, ci uz je nacitany, aby sa nesahalo na neexistujuce data atd. Co je lepsie uvidis casom, alebo ti to sem niekto napise  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Naposledy upravil pcmaster dne 1. červenec 2009, 19:42:00, celkově upraveno 1 krát |
|
Návrat nahoru |
|
 |
if.then
Založen: 13. 04. 2008 Příspěvky: 579
|
Zaslal: 1. červenec 2009, 19:41:36 Předmět: |
|
|
Mám dojem, že se to odvíjí podle toho, kolik bude naloadovaných modelů a kolik bude objektů. Druhá možnost mi přijde lepší, ale obojí má výhody i nevýhody, záleží na hře.
BTW: Aktuální animaci musíš v druhém případě skladovat u každého objektu  _________________ For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++. |
|
Návrat nahoru |
|
 |
nou

Založen: 28. 07. 2007 Příspěvky: 1050
|
Zaslal: 1. červenec 2009, 20:09:00 Předmět: |
|
|
oserenie chyby pri nacitavani by som spravil tak ze tam hodi "blank" model. napr Return to castle wolfenstein Enemy territory zobrazoval RGB tri osy namiesto modelu ktory sa nepodarilo nacitat. tak isto by sa to dalo sravit napr aj pri texturac kedy by vratilo napr zlto-ciernu kostickovanu texturu. plus teda nejake logovanie chyby nenacitania. _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 1. červenec 2009, 20:11:21 Předmět: |
|
|
Buď nějak nechápu já, nebo Vy , takže tady je lepší příklad:
Co je lepší?
za A) toto:
kód: |
class MODEL
MODEL(); //defaultní konstruktor
MODEL(const char* FileName); //konstruktor načtením modelu(vnitřně volá LoadModel)
void DrawModel(); //vykreslí model
void LoadModel(const char* FileName); //načte model
...
//v inicializaci
MODEL model1("MAPA.3ds");
MODEL model2("KAMEN.3ds");
//atd atd atd...
...
//ve smyčce
model1.DrawModel();
model2.DrawModel();
//atd atd atd...
|
za B) toto:
kód: |
class MODEL
GLint ModelIndex;
MODEL(); //konstruktor
void DrawModel(GLint ModelID); //vykreslí model s indexem ID
int LoadModel(const char* FileName); //načte model a přidělí a vrátí index
...
//v inicializaci
MODEL model;
model.LoadModel("MAPA.3ds");
model.LoadModel("KAMEN.3ds"); //vrácený index by se ukládal někam do pole abych měl info o daném modelu(v př. neřešim)
//atd atd atd...
...
//ve smyčce
model.DrawModel(1);
model.DrawModel(2);
model.DrawModel(3);
//atd atd atd...
|
|
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 1. červenec 2009, 20:12:40 Předmět: |
|
|
S ohladom na buducnost urcite to prve! Vsak som ti to rovno napisal  _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 1. červenec 2009, 20:15:58 Předmět: |
|
|
OK Díky.. jsem to předtím úplně nepochopil. Ještě jednou díky. |
|
Návrat nahoru |
|
 |
Augi

Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 1. červenec 2009, 20:17:00 Předmět: |
|
|
if.then to už nakousl. Je důležité důsledně oddělit data, která jsou per-instance (např. pozice a rotace objektu, stav animací) a data, která jsou společná pro celou třídu objektů (geometrie, textury, shadery, ...).
Doporučil bych teda mít nějakej TextureManager, kterej se bude starat o načítání textur a pokud by mělo dojít k druhému načtení textury, tak vrátí již načtenou instanci. Stejně tak pro shadery, geometrii apod.
Tvoje třída Model pak teda bude obsahovat per-instance data + si bude držet objekty obsahující textury, geometrii apod. |
|
Návrat nahoru |
|
 |
Quiark

Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 1. červenec 2009, 22:11:17 Předmět: |
|
|
Poky napsal: |
za B) toto:
kód: |
class MODEL
GLint ModelIndex;
MODEL(); //konstruktor
void DrawModel(GLint ModelID); //vykreslí model s indexem ID
int LoadModel(const char* FileName); //načte model a přidělí a vrátí index
...
//v inicializaci
MODEL model;
model.LoadModel("MAPA.3ds");
model.LoadModel("KAMEN.3ds"); //vrácený index by se ukládal někam do pole abych měl info o daném modelu(v př. neřešim)
//atd atd atd...
...
//ve smyčce
model.DrawModel(1);
model.DrawModel(2);
model.DrawModel(3);
//atd atd atd...
|
|
Tímhle kódem se snažíš vyjádřit myšlenku "do háje s OOP" Tohle je přesně typický případ kraviny spáchané ve jménu rychlosti, která má samozřejmě na rychlost nulový vliv. _________________ Mám strach |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 2. červenec 2009, 01:30:01 Předmět: |
|
|
Ta možnost B) je fakt strašná. Jo a nikde jsem z těch zdrojáků nepoznal, že jde o OOP. (class != OOP)
Dávej proměnným vhodný jména, "model" neříká nic. Uvedu příklad:
kód: |
Model *car = fileFormats->loadModelFrom("car.3ds");
Model *gun = fileFormats->loadModelFrom("gun.3ds");
graphicsDevice->render(car);
graphicsDevice->render(gun); |
Pro "rychlost" je výhodnější raději nedělat nic, pokud pro to nemáš hodně dobrý argument, a optimalizovat jen tehdy, až opravdu zjistíš, kde to vázne. Optimalizace by rozhodně neměly dělat kód příliš nepřehledným.
EDIT: Nikdo tě nenutí rvát všechno do jedné třídy, což jsem se i v tom příkladu snažil naznačit. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Poky

Založen: 29. 06. 2009 Příspěvky: 184 Bydliště: Písek / Plzeň
|
Zaslal: 2. červenec 2009, 13:22:38 Předmět: |
|
|
To Eosie:
citace: |
MODEL(nepopisuju sem podtřídy - je to pouze př.) |
Toto jsem napsal hned na úvod !!!! A tamten kód je pouze ilustrační příklad !!! To je mi naprosto jasný, že modelům nebudu dávat jména model1 model2... Jinak k tomu OOP-> z těch zdrojáků ani nejde poznat že to je OOP, když jsem to psal jen tak jako příklad.
Ale ano máš pravdu vtom, že to za B) není dobré řešení.
VYŘEŠENÉ! Děkuju všem. |
|
Návrat nahoru |
|
 |
|