Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czy dodawanie do do kontenera wskaźników jest szybkie? liczenie sił fizycznych na scenie

Ostatnio zmodyfikowano 2014-11-29 10:49
Autor Wiadomość
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 ?
P-120391
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<>.
P-120395
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).
P-120412
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.
P-121431
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.
P-121616
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.
P-121676
« 1 »
  Strona 1 z 1