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 »  |