Alokace paměti pro strukturu modelu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Alokace paměti pro strukturu modelu – C / C++ – Fórum – Programujte.comAlokace paměti pro strukturu modelu – C / C++ – Fórum – Programujte.com

 

Hitokage
~ Anonymní uživatel
13 příspěvků
25. 10. 2013   #1
-
0
-

Zdravím,

nedávno jsem řešil nahrávání 3D modelu ze souboru pro následné zobrazení v OpenGL. Vypadá to nějak takto:

nový typ pro objekty

typedef struct
{
   ....

} obj, *objPoint;

pak mezi globálníma proměnnýma mám:

obj Model;

a tento model pak předávám funkci, která vypadá přibližně takto

int loadModel (objPoint object, char modelAdr[]); //modelAdr je jen adresa kde je uložený

chci se zeptat zda je to řešení efektivní, nedávno jsme se učili ve škole o rozdílech mezi heap/stack atd a docela jsem se zarazil, zda bych raději neměl alokovat místo pro celý model dynamicky, jaksi si s tím ale nevím rady, nějak se vždy ztratím v ukazatelých :D

tak se s dovolením ptám, zda je to vůbec potřeba, popřípadě mohl by mi někdo prosím naznačit správnou alokaci a předání správné proměnné/ukazatele mé funkci?

Děkuji a pěkný den ^^

Nahlásit jako SPAM
IP: 88.83.233.–
ingiraxo+15
Grafoman
25. 10. 2013   #2
-
0
-

Tak můžeš ho nahrát do paměti (na heap), je to potom rychlejší, ale pokud těch modelů máš hodně nebo jsou dost velký (třeba přes 2GB) tak to nemá smysl, ale pokud jsou menší, tak ho normálně nahraješ do paměti a vezmeš si ptr na něj 

typedef unsigned char byte;

struct Model
{
    char* name;
    byte* data;
};

Model* loadModel(const char* modelPath)
{
    // pokud vrátí NULL, tak se model nepodařilo načíst
}

Dost záleží o jaký modely se jedná a kde a jak je chceš používat.. od toho vychází i kód potom

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Hitokage
~ Anonymní uživatel
13 příspěvků
25. 10. 2013   #3
-
0
-

#2 ingiraxo
Hm takže nechat jak to mám vlastně ne? Nejsem si jitý zda tomu totiž rozumím správně.

Když si vytvořím onu strukturu voláním mého typu obj Model; ještě před main() tak se místo tvoří mimo stack i heap. Je možné to nechat takto? 

Jako, funguje správně, jen bych rád programoval čistě :D

Nahlásit jako SPAM
IP: 88.83.233.–
ingiraxo+15
Grafoman
25. 10. 2013   #4
-
0
-

#3 Hitokage
stack má omezenou velikost, tam se ti ukládaj takový ty dočasný věci jako proměnný ve funkcích nebo statický alokace

na heap leze všechno co je dynamický, resp. přes "new, malloc, calloc...", tam to musíš potom i ručně uvolnit!
pokud např. ztratíš nebo nastavíš ukazatel na model jako NULL, tak v paměti bude stále a bude brát místo podle velikosti modelu

a tak jak to máš to můžeš více-méně nechat, jen bych se pokusil zrušit všechny globální proměnný a někam potom ukládat všechny načtený modely (pole s ukazatelema na modely)

a ta struct Model múže obsahovat víc věcí, jak cestu k modelu, jeho název, velikost a hlavně ukazatel, kde je umístěnej v paměti.. a hlavně pokud model nepotřebuješ už, tak ho uvolnit

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Hitokage
~ Anonymní uživatel
13 příspěvků
25. 10. 2013   #5
-
0
-

#4 ingiraxo
jasně, v té struktuře mám vertexy, název apod,

jen adresu jsem si nechal jako parametr funkce

o rozdílu mezi stack a heap vím, právě proto řeším, kde vlastně ty data mám tak jak to mám teď udělané a jestli to může být

předpokládám, že se teda chová jako globální proměnná a je to někde mezi heap a stack, tuším "Datová oblast" se tomu říká, nevím teda co by bylo lepší, použít malloc nebo new pro uložení na heap, nebo to ponechat

Nahlásit jako SPAM
IP: 88.83.233.–
ingiraxo+15
Grafoman
25. 10. 2013   #6
-
0
-

#5 Hitokage
nic jako "mezi" stack a heap neexistuje.. buď je to tam nebo tam

tu glob. proměnnou co tam máš, máš stejně špatne - obj Model; tam by měl být ukazatel správně, takto je to jen reference na existující objekt, ty potřebuješ ukazatel = dynamicky naalokovat model do paměti

ale tu glob. proměnnou vyhod, správně by si globálky neměl používat vůbec - je to takový "nečistý"

Nahlásit jako SPAM
IP: 93.90.162.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Hitokage
~ Anonymní uživatel
13 příspěvků
25. 10. 2013   #7
-
0
-

#6 ingiraxo
Ok díky za pomoc.

Nahlásit jako SPAM
IP: 88.83.233.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 87 hostů

Podobná vlákna

Alokace paměti polí — založil Lenka S.

Dynamická alokace paměti — založil birkof

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý