Wpis z mikrobloga

#cpp #gamedev #programowanie Hej, szukam bardziej zoptymalizowanego sposobu na wyświetlenie duzej ilości ruchomych gwiazdek lecących w dół w 2d. Jeśli mam rozdzielczość w poziomie 1920 i chcę mieć 1000 gwiazdek to teoretycznie dorzucam pętlę z 1000 przejść i w każdym dodaje jedną gwiazdkę, przy czym 1000 przejsc w dla każdej klatki to straszne zamulanie głównej pętli tylko po to żeby pokazac gwiazdki.. jak to najlepiej zrobić? przykłądowy kod:

while (głównapętla)
{
...
for (int i = 0; i < 1000; i++)
{
...
aktualizuj pozycje gwiazdy(i)
...
bufor.dodaj
gwiazde(x[i]. y[i]);
}
...
}

na razie co mi przyszło do głowy to zejscie z 1000 do 500 ilteracji w petli
i wrzucanie w jednym przejsciu dwóch gwiazdek, np.

while (głównapętla)
{
...
for (int i = 0; i < 500; i++)
{
...
aktualizuj pozycje gwiazdy(i)
...
bufor.dodaj
gwiazde(x[i]. y[i]);
bufor.dodaj_gwiazde(x2[i], y[i]);
}
...
}
  • 23
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Kopytko1:
Nie jestem mistrzem w dziedzinach GUI, ale Twoja sugestia optymalizacji to (,). Poza tym - to naprawdę jest tak duże obciążenie? Takie operacje to powinien być strzał z nosa, jak już chcesz szukać optymalizacji to spróbuj jak najlepiej zoptymalizować niepokazaną tu metodę aktualizuj pozycje gwiazdy(i)
  • Odpowiedz
@samarin: nie zgodzę się że (,), zamiast 1000 przejść mam 500, a w tej pętli poza wrzuceniem pozycji w bufor sa tez obliczenia i jakeis warunki do sprawdzenia.. przy tescie widać wzrost wydajnosci a wizualnie nie widac powtorzeń..
  • Odpowiedz
@Kopytko1:
No i dokładnie świadczy to o tym o czym Ci napisałem. Nie jest problemem liczba iteracji w pętli, a brak optymalizacji tego co w niej wykonujesz.

poza wrzuceniem pozycji w bufor sa tez obliczenia i jakeis warunki do sprawdzenia..


Lepiej wklej ten kod to Ci łatwiej będzie pomóc Mireczku ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@panato: ten sam problem jest jesli chodzi o gry 3d, z taka roznica ze mamy np. 4-wierzchołkowy plane z texturą, też muszę przejść 1000 iteracji zeby zaktualizować kazdą gwiazdkę..
  • Odpowiedz
@samarin:

mniej wiecej cos takiego, najprostsza prościzna, dodanie i porównanie, nie używam np. randomów bo mam je juz przekalkulowane w tablicy.. myslałem zeby nie robic aktualizacji co każdą klatkę tylko np. co drugą

for (int i = 0; i < 1000;
  • Odpowiedz
@samarin: Ja tam nigdy rysowaniem się nie zajmowałem (bo w sumie nie wiadomo nawet na czym tu jest to rysowane) ale czy czasem od tego nie są dostępne metody do tworzenia instancji a później dostarczania macierzy transformacji i rysowania wielu instancji jednocześnie co powinno być mega szybkie?
  • Odpowiedz
@Kopytko1: Dalej widać, że masz kod powycinany, bo chyba tak nie powinno być. Wklej całość jak człowiek a nie się bawisz. Pisałeś, że przy teście widać poprawę jak zrobisz 500 iteracji zamiast 1000. Jak to testowałeś? Z tego co widać po Twoim kodzie kompletnie nic się nie powinno zmienić jeśli działałeś na 2 gwiazdach w jednej iteracji.

if (gwiazda[i].y > 1080) gwiazda[i] = 0;

bufor.dodaj_gwiazde( x[i], y[i] );
  • Odpowiedz
@nowa_zielonka: no i z czego rżysz.. to tak nie działa.. w ten sposób można uzyskać poprawę tylko do pewnej wartości.. a samo duplikowanie instrukcji np. 256 ma sens przy robieniu wstawek w asemblerze zamiast robienia pętli bo oszcędzasz cykle zegara..
  • Odpowiedz