.[ ČeskéHry.cz ].
Načítání modelů

 
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
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 1. červenec 2009, 19:15:04    Předmět: Načítání modelů Odpovědět s citátem

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



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 1. červenec 2009, 19:40:35    Předmět: Odpovědět s citátem

Urob si jednu triedu a z tej normalne vytvaraj instancie. Na rychlosti to urcite nikdy nepoznas Wink 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 Smile

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 Smile
_________________
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
Zobrazit informace o autorovi Odeslat soukromou zprávu
if.then



Založen: 13. 04. 2008
Příspěvky: 579

PříspěvekZaslal: 1. červenec 2009, 19:41:36    Předmět: Odpovědět s citátem

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 Wink
_________________
For guns and glory, go to www.ceske-hry.cz.
For work and worry, execute VC++.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
nou



Založen: 28. 07. 2007
Příspěvky: 1050

PříspěvekZaslal: 1. červenec 2009, 20:09:00    Předmět: Odpovědět s citátem

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



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 1. červenec 2009, 20:11:21    Předmět: Odpovědět s citátem

Very Happy Buď nějak nechápu já, nebo Vy Very Happy, 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 1. červenec 2009, 20:12:40    Předmět: Odpovědět s citátem

S ohladom na buducnost urcite to prve! Vsak som ti to rovno napisal Smile
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Poky



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 1. červenec 2009, 20:15:58    Předmět: Odpovědět s citátem

OK Díky.. jsem to předtím úplně nepochopil. Ještě jednou díky.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Augi



Založen: 28. 07. 2007
Příspěvky: 782
Bydliště: Čerčany

PříspěvekZaslal: 1. červenec 2009, 20:17:00    Předmět: Odpovědět s citátem

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



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

PříspěvekZaslal: 1. červenec 2009, 22:11:17    Předmět: Odpovědět s citátem

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" Smile 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
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: 2. červenec 2009, 01:30:01    Předmět: Odpovědět s citátem

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



Založen: 29. 06. 2009
Příspěvky: 184
Bydliště: Písek / Plzeň

PříspěvekZaslal: 2. červenec 2009, 13:22:38    Předmět: Odpovědět s citátem

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
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
Strana 1 z 1

 
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