wyszukiwanie z zastosowanie map + vector wolniejsze od tablicy?
Ostatnio zmodyfikowano 2015-09-01 19:52
fokusx Temat założony przez niniejszego użytkownika |
wyszukiwanie z zastosowanie map + vector wolniejsze od tablicy? » 2015-09-01 19:09:49 Przy zastosowaniu kontenera "map" oraz "vector" funkcja wyszukująca odpowiednią klatkę animacji szkieletowej strasznie wolno działa, zaś przy zastosowaniu tablicy ten czas zmniejszył się niemalże do 0, dlaczego? Fragment kodu ogldev (z użyciem tablic): uint SkinnedMesh::FindPosition( float AnimationTime, const aiNodeAnim * pNodeAnim ) { for( uint i = 0; i < pNodeAnim->mNumPositionKeys - 1; i++ ) { if( AnimationTime <( float ) pNodeAnim->mPositionKeys[ i + 1 ].mTime ) { return i; } } assert( 0 ); return 0; }
mPositionKeys - to tablica struktur opisujących klatki animacji (czas klatki, wektor danych itd.). Mój fragment kodu: unsigned int Animation::FindPosition( float AnimationTime, string NodeName ) { assert( Animation::Channels[ NodeName ].NumPositionKeys > 0 ); for( unsigned i = 0; i < Animation::Channels[ NodeName ].NumPositionKeys - 1; i++ ) if( Animation::Channels[ NodeName ].PositionKeys[ i + 1 ].Time > AnimationTime ) return i; assert( 0 ); return 0; }
Channels - to mapa std::map < std::string, Channel > Channels;
która opisuje klatki dla pojedyńczego Node'a - w fragmencie ogldev jest to wszystko zawarte w klasie Node (pNodeAnim). PositionKeys - to vector przechowujący wszystkie klatki (czas, wektor danych etc.) przypisane konkretnemu Node'owi. Przez ten fragment kodu FPS'y spadły z 60 do 3-17. Nie mam za bardzo pomysłu jak zmienić kod, by działał jak należy bez większych zmian, dlatego najpierw wolałbym upewnić się, że następnym razem wyjdzie to w porządku. Mógłby ktoś mi to wyjaśnić? |
|
pekfos |
» 2015-09-01 19:37:42 Zapisz wynik Channels[ NodeName ] w zmiennej, zamiast obliczać go przy każdej możliwej okazji. |
|
fokusx Temat założony przez niniejszego użytkownika |
» 2015-09-01 19:52:48 Ok, dzięki - już jest dużo lepiej. |
|
« 1 » |