Wydajność renderowania gier Flash


11

Czytałem na SO o natywnym renderowaniu flashowym vs budowaniu niestandardowego BitmapDatabufora ramek, a niektóre odpowiedzi były trochę sprzeczne, więc zastanawiałem się:

  1. Czy ogólnie najlepszą praktyką jest wybranie niestandardowej trasy bufora bitmapowego, czy też najlepiej pozostawić renderowanie w silniku flash?
  2. Jeśli używasz animacji wektorowych MovieClipw przeciwieństwie do duszków, czy to zmienia odpowiedź na powyższe?
  3. Jeśli tak, czy najlepszą praktyką jest stosowanie animacji opartych na ikonkach?

(Celuję we Flash 10, jeśli to coś zmienia)

Odpowiedzi:


14

1. Nie ma ogólnej najlepszej praktyki.

Jeśli masz dużo elementów (cząstek o złożonym kształcie), cząstek itp., Podejście do bufora bitmapy będzie znacznie szybsze. Bufor bitmap będzie również lepiej skalowany wraz ze wzrostem złożoności twoich duszków. Moduł renderujący wektor będzie działał wolniej dzięki bardziej złożonym kształtom lub animacjom animacji (animacja kształtu), ma jednak kilka innych zalet:

  • Możesz dowolnie skalować zasoby, a nawet przybliżać scenę bez utraty jakości.
  • Obracanie lub inne transformacje, takie jak pochylenie, będą znacznie łatwiejsze do wykonania na grafice wektorowej

Podsumowując, sprowadza się to do tego, jaką grę budujesz.

2. Używanie MovieClips zamiast bitmapowych arkuszy sprite

Myślę, że miałeś na myśli „bitmapy sprite-arkuszy”, a nie klasę AS3 Sprite ?

To naprawdę nie robi różnicy. Zawsze możesz zamienić animacje oparte na MovieClip na animowane mapy bitowe. Albo ręcznie, eksportując film do klatek i zamieniając go w arkusz sprite , lub dynamicznie, renderując arkusz sprite z MovieClip w czasie wykonywania. Oto jak bym to zrobił:

  1. Utwórz instancję MovieClip i stop()to.
  2. Utwórz new BitmapDataobiekt o tej samej szerokości i wysokości co klip filmowy.
  3. Użyj metody draw () , aby wyrenderować MovieClip do BitmapData.
  4. Przechowuj obiekt BitmapData w tablicy lub wektorze.
  5. Przejdź do następnej klatki MovieClip i powtórz kroki 2–4, rób to, aż dojdziesz do ostatniej klatki MovieClip. Dobrym pomysłem jest również aktualizacja dwóch zmiennych o maksymalnej szerokości i maksymalnej wysokości klatek MovieClip (ponieważ mogą one zmieniać się z jednej klatki na drugą).
  6. Teraz możesz połączyć wszystkie przechowywane obiekty BitmapData w arkusz Sprite-Arkusz (użyj BitmapData.copyPixels () )

3. Animacje sprite

Jak wspomniano w odpowiedzi na pierwsze pytanie, nie ma na to jednoznacznej odpowiedzi. Jeśli potrzebujesz wykonać wiele transformacji ze swoimi obiektami, np. skalowanie i obracanie jest prawdopodobnie lepsze przy użyciu renderera natywnego Flash. Jeśli masz predefiniowane animacje, które można wypalać na arkuszach duszków (ręcznie lub dynamicznie), i jeśli chcesz wyświetlić setki duszków w tym samym czasie, wybierz silnik renderowania bitmap.


Kiedy (jeśli?) Flash zacznie używać przyspieszania sprzętowego do renderowania, renderer copyPixel będzie prawdopodobnie wolniejszy niż renderer macierzysty.
Bart van Heukelom,

6

Powiedziałbym, że jeśli budujesz grę opartą na rastrze za pomocą spritów, idź z budowaniem niestandardowego rozwiązania do renderowania za pomocą BitmapData. Jeśli budujesz grę wektorową, skorzystaj z wbudowanych mechanizmów animacji za pomocą MovieClips.

Jeśli budujesz niestandardowe rozwiązanie do renderowania, praktycznie odrywasz się od Flasha, używając tylko ActionScript, aby osiągnąć to, czego potrzebujesz. Silnik flixel korzysta z tej metody i jest całkiem niezły. Wolę pisać własny silnik od zera, ale masz pomysł.

Korzystanie z wbudowanych mechanizmów animacji Flash działa najlepiej w przypadku gier opartych na wektorach, ponieważ można łatwo tworzyć zasoby biblioteki jako klipy filmowe, które można następnie tworzyć na żądanie w języku ActionScript. Używasz osi czasu podanej w klipach filmowych do obsługi animacji i odpowiedniego przenoszenia położenia duszka. Wszystkie BattleOn! gry takie jak Adventure Quest Worlds używają tej metody. Ładnie też wygląda.

Zakładam, że twoje ostatnie pytanie dotyczy korzystania z klasy Sprite zamiast klasy MovieClip do animacji wektorowych. Sprite to MovieClip bez osi czasu, więc stracisz wygodę zarządzania animacjami.


3

Chociaż powszechnie uważa się, że blitting jest szybszy, nie widziałem żadnych testów porównawczych. Niektórzy programiści wolą tylko blitting, ponieważ pozwala im traktować Flash jako bardziej ogólną maszynę wirtualną i sterować renderowaniem. Jeśli jednak podoba Ci się wbudowana lista wyświetlania (co robię), Flash może z przyjemnością przesuwać, skalować, obracać i stosować ładne efekty do setek wyświetlanych obiektów ekranowych (np. MovieClip, Sprites, Bitmapy) przy dużych częstotliwościach wyświetlania klatek, więc o ile mają dość małe wymiary, np. mniej niż 200 x 200 pikseli każdy. Możesz używać MovieClips bez użycia wektorów. Większość gier korzysta z zasobów bitmap niezależnie od używanego systemu. Czasami jednak przydatne jest układanie i animowanie zasobów bitmapowych na osi czasu, szczególnie jeśli pracujesz ze specjalistą od Flasha, a nie z twórcą pikseli. Ustawiając jakość sceny na NISKĄ, uzyskasz znacznie lepszą wydajność kosztem brzydszych transformacji. Flash nie renderuje żadnych obiektów poza ekranem, więc nie spowalniają cię.

Tam, gdzie Flash może zwolnić, porusza się i przekształca bardzo duże mapy bitowe - na przykład, jeśli masz bardzo duży poziom przewijania lub wiele warstw paralaksy. Hybrydowe podejście do używania MovieClipów do obiektów gry podczas blitowania tła z bufora ekranowego może być szybsze i pozwoli ci mieć nieskończenie duże poziomy, jednocześnie umożliwiając łatwość użycia standardowych Sprite'ów i MovieClipów.


Złożone kształty wektorowe mogą również mieć znaczący wpływ na wydajność. Jeśli masz animowane klipy filmowe z dużą ilością gradientów, a jeśli nie zwracasz uwagi na poziom szczegółowości twoich kształtów wektorowych, rysuje ono znacznie wolniej niż bitmapa.
bummzack

Możesz używać MovieClips bez użycia wektorów. Większość gier korzysta z zasobów bitmap niezależnie od używanego systemu. Czasami jednak przydatne jest układanie i animowanie zasobów bitmapowych na osi czasu, szczególnie jeśli pracujesz ze specjalistą od Flasha, a nie z twórcą pikseli.
Iain

Tak, w przypadku gier flash Polecam, aby nie używać gradientów do czegokolwiek, co ma być wektorem i renderowane przez flashowanie każdej klatki, oprócz kilku rzeczy na HUD i ikonce odtwarzacza. Gradienty szybko jedzą wydajność.
AttackingHobo

Niektóre testy porównawcze renderowania i aktualizacji: 8bitrocket.com/2007/12/23/…
Max Dohme,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.