View previous topic :: View next topic |
Author |
Message |
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 8:12 pm Post subject: mans statiskais konteineris, tā īstais nosaukums |
|
tātad: par iespējamo esamību nezinot, izveidoju particle/ložu sistēmai labu konteineri ;)
gribēju zināt, vai tāds jau kautkur izgudrots un kā to sauc?
ja nu nav, tad autortiesības pievācu es
lai palīdzētu - īss apstāsts:
deklarācijas
Code: | struct Object{bool Active;};
Object* oArray;
int maxcount; |
radīšana (int max_skaits)
Code: | maxcount = max_skaits;
oArray = new Object[maxcount];
ZeroMemory(oArray,sizeof(Object)*maxcount); |
dzēšana
objekta pievienošana
Code: | for (int i = 0;i<maxcount;i++)
{
Object& oo = oArray[i];
if (!oo.Active){break;}
}
Object& ooo = oArray[i];
ooo.Active = true;
//šeit pievieno informāciju |
objekta izņemšana (int index)
Code: | if (index >= maxcount){return;}
oArray[index].Active = false; |
objektu skaitīšana
Code: | int cnt = 0;
for (int i = 0;i<maxcount;i++)
{
Object& oo = oArray[i];
if (oo.Active){cnt++;}
}
return cnt; |
_________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle
Last edited by snake5 on Mon Dec 24, 2007 8:29 pm; edited 1 time in total |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Dec 24, 2007 8:23 pm Post subject: |
|
Pirmkārt, kas notiks, ja pievenošu vairāk elementus, kā maxcount? Otrkārt, kas notiks, ja pievienošu 100 elementus un pirmos 99 elementus izdzēsīšu? Būs tukšs masīvs ar 100 elementiem, bet tikai pēdējais tiks izmantots (priekš tam izdevīgāk taisīt hashu)? Utt. utt. utt. Labāk tomēr neatkārto manas kļūdas un izmanto std::map vai to pašu std::vector. _________________ long time; /* know C */ |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 8:28 pm Post subject: |
|
šis masīvs ir domāts particle sistēmām, jo radīšanas/dzēšanas laiks ir niecīgs un nav svarīgi, kur masīvā atrodas objekts! pietam pazūd new/delete izsaukumu, kuri vnk var nebūt tik ātri, kā to gaida..
ja tu pievienot mēģināsi vairāk elementus, tad nekas nesanāks ;)
EDIT: salabošu vienu kļūdu paraugsourcē
EDIT2: izlabots - objekta radīšanas aktivācijas kļūda _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 8:57 pm Post subject: |
|
bubu - redzu, tu pat neapskatījies neko no tā, ko uzrakstīju..
tā jau ir spamošana, ja tu nezini, par ko raksti :evil:
te nav runas par jebkādu optimizāciju, bet tikai par statisko konteineri visādu sīku lietu uzglabāšanai
arī tajā topikā tu vnk domāji, ka tas ir vektora analoga konteineris..
ja vektors būtu uz linkedlist'a bāzes, tad tu nekļūdītos! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tenjou
Joined: 22 Nov 2005 Posts: 275
|
Posted: Mon Dec 24, 2007 9:15 pm Post subject: |
|
...tā gadījumā nav vienkārša struct izmantošana...? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 9:23 pm Post subject: |
|
struct ir jebkura sīka objekta pamatā! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tenjou
Joined: 22 Nov 2005 Posts: 275
|
Posted: Mon Dec 24, 2007 9:27 pm Post subject: |
|
Ei nu! Tam teiktajam zemteksts bija, kāda jēga no tā uber konteinera, ja tā būtībā ir parasta struct lietošana? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 9:31 pm Post subject: |
|
kas tavā izpratnē ir "parasta struct lietošana"? _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Tenjou
Joined: 22 Nov 2005 Posts: 275
|
Posted: Mon Dec 24, 2007 9:39 pm Post subject: |
|
Tas nozimē izveidot struktūru, kas var saturēt mainīgos vai citus objektus, izdalīt atmiņu un atbrivot atmiņu pēc lietošanas?
Vai arī boolean mainīgais, kas nosaka vai noteiktais objekts ir aktīvs(visible, focused u.tt u.tt) ir kautkas neparasts? |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Mon Dec 24, 2007 9:47 pm Post subject: |
|
ak tā? nu tad tuvu tam..
bet visu maina tas, ka šī atmiņas izdalīšana + tas bool mainīgais veido kopā noderīgu pamatu priekš sīko objektu sistēmas, piemēram ložu sistēmas, jo:
* tas izdala atmiņu tikai vienreiz, atbrīvo arī tikai vienreiz - nav iespējamas atmiņas izdalīšanas problēmas vēlāk
* elementu saskaitīšana/iešana caur visiem ir ātrāka!
kopumā - tas pasargā no iespējami ilgā atmiņas izdalīšanas laika priekš sīkajiem objektiem
jeb - nostabilizē FPS! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 26, 2007 12:09 pm Post subject: |
|
HAHAHAHAHAHAHAHAHAHAHA
http://yy.lv/download.php?f=91574
tas mana šodienas uzlabotā particle konteinera salīdzinājums ar to vektoru
(nokompilēts gan debug, gan release, iekšā pilnā source)
es vnk gāžos nost no kājām! man IR izdevies izveidot particle konteineri, kurš ātrāks par vektoru!!!
OMFG!!!!! _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Wed Dec 26, 2007 12:54 pm Post subject: |
|
Šoreiz būsi par ātru sapriecājies.
Tas ko tu izdari šeit:
Code: |
vector_system::vector_system(int init_cnt)
{
objects.resize(init_cnt*sizeof(Object));
}
|
Ir nevis rezervē vietu init_cnt Objektiem vektorā, bet ieliec vektorā init_cnt*sizeof(Object) Objektus. Līdz ar to, kad tu pēc tam ciklā liec pa elementam klāt, vienā brīdī vektorā nepietiek vieta un viņš automātiski izmaina izmēru. Tajā mirklī viņam nākas rezervēt lielu atmiņas apjomu (laikam ~2x vairāk kā jau rezervēts) un nokopēt VISUS jau esošos objektus, pēc tam atbrīvot pirms tam aizņemto atmiņu, izsaucot katram Objektam destruktoru (kas šajā gadījumā gan neko nemaina). Tur arī aiziet tas viss laiks. Izmaini to rindiņu uz:
Code: |
vector_system::vector_system(int init_cnt)
{
//objects.resize(init_cnt*sizeof(Object));
objects.reserve(init_cnt);
}
|
Un tu redzēsi, ka esi ieguvis tieši 2x paātrinājumu, un to pašu tikai tāpēc, ka šeit:
Code: |
void vector_system::AddObject()
{
Object dummy;
memcpy(dummy.byte_eater,text,31);
objects.push_back(dummy);
}
|
tiek divreiz nokopēts tavs Objekts - pirmo reiz tu pats to izdari ar memcpy, otrreiz, kad ieliec vektorā. Turklāt, liekot vektorā šādi, tu neizmanto sava Objekta "Active" mainīgo. Lai lietotu active un neizdarītu divkāršu objekta kopēšanu, tev vajadzētu darīt šādi:
Code: |
vector_system::vector_system(int init_cnt)
{
//objects.resize(init_cnt*sizeof(Object));
objects.resize(init_cnt);
}
|
un ievietot objektus tieši tāpat kā tu to dari "savai sistēmai", tikai šādi rīkojoties tu būtu pilnībā atmetis visas vektora dotās priekšrocības, starp citu, arī jau tagad tu to esi paguvis izdarīt, tikai vektors bija paguvis tevi paglābt no programmas nokāršanās pat tad, kad tu to izmantoji nepareizi. _________________
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Wed Dec 26, 2007 1:15 pm Post subject: |
|
Code: | void vector_system::AddObject()
{
Object dummy;
memcpy(dummy.byte_eater,text,31);
objects.push_back(dummy);
} |
kā tad šo izmainīt, lai tas atbilstu tam, kas notiek manā sistēmā?
vai nu es sakopēju objekta datus šeit, vai pēc ielikšanas - tam taču nav nekādas nozīmes, vai ne?
P.S. vektorā "Active" mainīgo nelietoju tāpēc, ka tur iekšā esošie objekti visi skaitās aktīvi
nu - jebkurā gadījumā kautkas labs man ir izdevies un zināmu paātrinājumu varbūt es pat vēl izspiedīšu _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Dec 26, 2007 1:39 pm Post subject: |
|
Eh snjake, snjake... izlasot GiGa postiņu nevarēju atturēties un uz brīdi atslēdzu elfz'a jauko spam-postiņu slēpšanas skriptu. Jāpakomentē tavi brīnumi ir tomēr.
Tu tur esi uzrakstījis divu dažādu darbību salīdzinšanu un tagad brīnies, ka darbojas pilnīgi savādāk.. Es jau arī varētu salīdzināt velosipdēda un motocikla pārvietošanās ilgumu no Jelgavas līdz Rīgai un pēc tam brīnities!
Reku kods vektoram, kas darbosies analoģiski tavam masīvam:
Code: | struct Object2
{
char byte_eater[31];
};
class vector_system : public cont_system
{
std::vector<Object2> objects;
int count;
public:
vector_system(int init_cnt);
~vector_system();
void AddObject();
void RemoveAllObjects();
int Count();
};
vector_system::vector_system(int init_cnt)
{
objects.resize(init_cnt);
count = init_cnt;
}
vector_system::~vector_system()
{
}
void vector_system::AddObject()
{
if (count == objects.size())
{
return;
}
std::copy(text, text+31, objects[count].byte_eater);
count++;
}
void vector_system::RemoveAllObjects()
{
count = 0;
}
int vector_system::Count()
{
return count;
} |
Tas vadoties pēc tava teksta - "tur iekšā esošie objekti visi skaitās aktīvi". Masīvam īstenībā jau arī varētu līdzīgi rakstīt. Nesaprotu, kam tev tas active tur vajadzīgs...
Un rezultāts:
Code: | Adding 8000 objects - my system
Result: 1583
Adding 8000 objects - vector system
Result: 394 |
OMGLOLWTFNUB!
Ak jā un destruktoru neizsaukt cont_system mantotajām klasēm arī ir stilīgi - tu taču neatbalsti atmiņas atbrīvošanu, vai ne? :) |
|
Back to top |
|
|
|