dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

mans statiskais konteineris, tā īstais nosaukums
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Programmēšana
View previous topic :: View next topic  
Author Message
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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 Cool

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
Code:
delete [] oArray;

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
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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ē Wink
EDIT2: izlabots - objekta radīšanas aktivācijas kļūda Wink
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: Mon Dec 24, 2007 8:53 pm    Post subject:

elvman - tu nekā nesaproti. std::vector ir lēns un neoptimizēts: http://boot.lv/prg/index.php?s=&showtopic=877&view=findpost&p=4094 snjake māk optimizēt krutāk nekā n-tie cilveki, kuriem C++ standartbibliotēkas veidošana un optimizēšana ir ikdienas darbs.
Back to top
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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 Wink
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
View user's profile Visit poster's website
Tenjou



Joined: 22 Nov 2005
Posts: 275

PostPosted: Mon Dec 24, 2007 9:15 pm    Post subject:

...tā gadījumā nav vienkārša struct izmantošana...?
Back to top
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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
View user's profile Visit poster's website
Tenjou



Joined: 22 Nov 2005
Posts: 275

PostPosted: 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
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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
View user's profile Visit poster's website
Tenjou



Joined: 22 Nov 2005
Posts: 275

PostPosted: 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
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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 Wink
jeb - nostabilizē FPS!
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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
View user's profile Visit poster's website
GiGa
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 25 Sep 2003
Posts: 887

PostPosted: 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
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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 Wink

nu - jebkurā gadījumā kautkas labs man ir izdevies un zināmu paātrinājumu varbūt es pat vēl izspiedīšu Wink
_________________
"There are two choices here: "looks good" and "realism"." -- Paul Nettle
Back to top
View user's profile Visit poster's website
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Programmēšana All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group