Nekronomik Temat założony przez niniejszego użytkownika |
[C++] Spadek FPS wraz ze wzrostem liczby zabitych obiektów na scenie » 2013-10-13 00:10:24 Witam, chodzi mi oto że gdy w mojej grze zabijam potwory to pozostają po nich ciała, a im więcej ciał tym gra zaczyna mi mulić i teraz czy jest taka możliwość aby ich ciała bezpośrednia wkleić w teren ? Tak to cały czas muszę wyświetlać ich szczątki osobno. |
|
SeaMonster131 |
» 2013-10-13 10:16:44 Mając nawet tysiące ciał, gra nie powinna mulić. Wyświetlaj tylko te ciała, które są widoczne na ekranie oraz po jakimś czasie możesz je usuwać. Lub podaj kod, bo być może gdzieś masz błąd (np wczytujesz grafikę w pętli). |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2013-10-13 11:59:40 Wyświetlam ciała tylko te które są na ekranie. W pętli mam tylko wyświetlanie bitmapy: al_draw_rotated_bitmap( cialo, 10, 10, potwor_1[ x ].polozenie_x + parametry_wyswietlania.przesun_x, potwor_1[ x ].polozenie_y + parametry_wyswietlania.przesun_y, ALLEGRO_PI / 180 * potwor_1[ x ].kat, false );
Czytałem że rysowanie bitmapy trochę zajmuje a im więcej mam bitmap wyświetlanych tym czas jest jeszcze dłuższy.Do tego dochodzą jeszcze ślady po strzelaniu czy łuski. W jednej grze zauważyłem że ciała, łuski itp. są wklejane w teren i nie są już ponownie wyświetlane osobno a tylko raz z terenem(albo i się mylę). Tu jest adres strony do obrazku: http://sand-storm.net/img/game/ACT2D/Alien%20Shooter/Alien%20Shooter%200115.jpg. |
|
DejaVu |
» 2013-10-17 12:02:45 Skoro masz tak zaawansowany projekt to zrób sobie pomiary czasu renderowania każdej klatki i loguj je do pamięci (np. 1000 ostatnich klatek). Licz następnie z tego średnią i wypisuj tą średnią na ekran. Mierz tylko i wyłącznie czas renderowania, pomijając wszelkie algorytmy kolizji itp. to na tej podstawie dojdziesz do tego, czy przyczyną mulenia jest renderowanie czy też inna część kodu.
/edit:
Co do wklejania w teren - zamiast wklejać w teren możesz utworzyć dodatkowe bitmapy tak, aby teren składał się z 2 bitmap. Pierwsza warstwa będzie początkowo przezroczysta, a drugą będą klocki terenu. Na przezroczystą wartstwę będziesz renderował ciała, ale koniec końców będzie to oznaczało, że będziesz musiał mieć unikatowe tekstury np. 64x64 dla każdego klocka mapy, czyli:
Podsumowując: wszystko zależy od tego jakie masz ograniczenia gry.
Dodam jeszcze, że w pamięci nie trzeba trzymać wszystkich klocków, ale tylko te, na których poległa jednostka. Czyli w praktyce może się okazać, że na mapie będzie mniej jak 15% powierzchni pokrytej poległymi jednostkami, czyli te przezroczyste klocki będą zajmowały 154MB pamięci, a nie 1GB. |
|
Nekronomik Temat założony przez niniejszego użytkownika |
» 2013-10-19 19:45:07 Zrobiłem nowy projekt (dla testów) w którym wyświetlam same kafle 10x10 pix na ekranie o rozdzielczości 1280x1024 z odświeżaniem mapy 50hz. Podczas testowania fps wyniósł około 30, w sumie nic dziwnego jak wyświetlałem około 655000 kafli na sek ( (1280/10)*(1024/10)*Hz ). Więc przyspieszyłem to w sposób taki: W pętli gdzie wyświetlam kafle umieściłem pierw kod: al_set_target_bitmap( paleta_1 ); al_draw_bitmap( test1, xp, yp, 0 ); a pod pętlą: al_set_target_backbuffer( okno_1 ); i w głównej pętli wyświetlam: mapa_terenu(); al_clear_to_color( al_map_rgb( 255, 255, 255 ) ); al_draw_bitmap( paleta_1, 0 + postac.kamera_x, 0 + postac.kamera_y, 0 ); al_flip_display(); Ok, wszystko ładnie działa, fps podskoczyło do około 700000 gdyż mapę wyświetlam tylko 50 razy na sek, po za tym kafle które zostały raz wyświetlone wyświetlane już nie są chyba że są to kafle po za mapą lub które nie były wyświetlone np w chwili przesuwania mapy. Ale mam problem taki że nie mogę zapisywać kafli na paleta_1 gdy ich współrzędne sa mniejsze od zera i nie mogę przesuwać: al_set_target_bitmap(paleta_1);. |
|
DejaVu |
» 2013-10-29 14:41:45 Jeden temat = jeden problem. Przyczyna spadku FPS została ustalona, a na inne problemy techniczne należy założyć osobny temat. |
|
« 1 » |