Czy dodawanie do do kontenera wskaźników jest szybkie? liczenie sił fizycznych na scenie
Ostatnio zmodyfikowano 2014-11-29 10:49
colorgreen19 Temat założony przez niniejszego użytkownika |
Czy dodawanie do do kontenera wskaźników jest szybkie? liczenie sił fizycznych na scenie » 2014-11-11 21:29:31 Jak w temacie. Przedstawie problem: z grze jest dużo sił fizycznych (może być nawet do 20 naraz). Na jakiś obiekt one wszystkie muszą oddziaływać. I teraz jak to zrobic. Myslałem nad tym by obiekt mial vector wskaźników i w każdym obiegu pętli te siły dodawać, liczyć wypadkową i usuwać, ale stad sie rodzi pytanie z tematu nr 1. czy ten zabieg byłby szybki? 2 opcja jest taka by dodać siłe do tego vektora kiedy wchodzi sie w jej zakres, i usunąć kiedy wychodzi obiekt spoza jej zasięgu (ale to sie wiąże ze sprawdzeniem odległości dla każdej siły). Inna idea jest taka by liczyć wypadkową z vektora dla obiektu i po prostu ten obiekt updatować, ale to wtedy.... no właśnie. wiec pyt nr 2 ktora idea lepsza/jak wy byście rozwiązali ten problem. i pyt 3 zależnie od przypadku lepszy std::vector czy std::list ? |
|
pekfos |
» 2014-11-11 22:05:55 Czy dodawanie do do kontenera wskaźników jest szybkie? |
To brzmi trochę niepoważnie.. Odpowiedź wynika z samej wiedzy, co to jest wskaźnik. zależnie od przypadku lepszy std::vector czy std::list ? |
Prawie jw. std::vector<>. |
|
akwes |
» 2014-11-12 00:21:23 Optymalizowanie kodu jest błędem, kiedy trzeba optymalizować algorytm.
Optymalizacja algorytmu: Spróbuj wykorzystać drzewo czwórkowe aby zminimalizować ilość sił działających na dany obiekt, Pomyśl o leniwych obliczeniach, Nie obliczaj sił dla obiektów poza ekranem, Nie obliczaj sił o znikomej wartości
Optymalizacja kodu: Używaj std::vector zamiast std::list, Jeżeli masz mieć dużo wektorów różnego rodzaju wskaźników to pomyśl o specjalizacji dla T* aby nie generować masy kodu (oraz aby przesyłać wskaźniki przez wartość zamiast stałej referencji), Zaprzyjaźnij się z pamięcią podręczną procesora i staraj się trafić w linię pamięci podręcznej. Użyj wątków i nie niwecz ich zalet (staraj się obliczać wyniki pośrednie lokalnie).
|
|
jcoder |
» 2014-11-26 15:12:21 Dobrze czujesz, że dodawanie i usuwanie z wektora w C++ jest powolne. A jest powolne, dlatego, że pod spodem wektor używa pamięci dynamicznej (wywołuje new/delete). Np. musi dokonać realokacji i skopiowania/przesunięcia całej zawartości do nowej tablicy jeśli nie posiada wystarczająco dużo miejsca na dodanie nowego elementu. Taka operacja potrafi zająć bardzo dużo czasu i w ogólności nie jest przewidywalna czasowo (zwykle setki cykli CPU) - bo alokator musi najpierw wyszukać odpowiednie miejsce w pamięci.
Dlatego postaraj się przerobić algorytm tak, aby nie korzystał z dynamicznych struktur danych i aby z góry wiadomo było ile będzie potrzebne pamięci. |
|
b00rt00s |
» 2014-11-28 13:34:01 Dlatego postaraj się przerobić algorytm tak, aby nie korzystał z dynamicznych struktur danych i aby z góry wiadomo było ile będzie potrzebne pamięci. |
To nie wyklucza użycia wektora: http://www.cplusplus.com/reference/vector/vector/reserve/ Poza tym, o ile dobrze zrozumiałem, dodawanie sił będzie się odbywało po kolei, tak jak występują w kontenerze. W takiej sytuacji bezpośredni dostęp do konkretnego elementu nie jest potrzebny i wystarczy sekwencyjny. Jeśli więc się nie pomyliłem, to można wykorzystać std::list i po sprawie. |
|
colorgreen19 Temat założony przez niniejszego użytkownika |
» 2014-11-29 10:49:30 heh, zapomniałem o tym temacie, bo po przemyśleniach stwierdziłem ze to jest głupi i mało wydajny sposób. Już lepiej najprościej liczyć lokalnie wypadkową ze wszystkich sił w głównym wektorze sił, i tą wypadkową "nakładać" na obiekty. Dziekuje wszystkim za wypowiedzenie sie w temacie. |
|
« 1 » |