2009-06-12 8 views
9

Pracuję nad strzelanką 2D z mnóstwem poruszających się obiektów na ekranie (pociski itp.).Vsync w Flex/Flash/AS3?

Używam BitmapData.copyPixels (...) do renderowania całego ekranu do bufora: BitmapData. Następnie I "copyPixels" z "buffer" do ekranu: BitmapData. Framerate jest 60.

private var bitmap:Bitmap = new Bitmap(); 
private var buffer:Bitmap = new Bitmap(); 

private function start():void { 
    addChild(bitmap); 
} 

private function onEnterFrame():void { 
    // render into "buffer" 
    // copy "buffer" -> "bitmap" 
} 

Problem polega na tym, że skrzaty są rozdzieranie: niektóre części sprite został przesunięty poziomo.

Wygląda jak gra komputerowa z wyłączonym VSYNC.

Czy ktoś rozwiązał ten problem?

UPDATE: pytanie nie chodzi o wydajność, ale o pozbycie ekran łzawienie. [!]

UPDATE: Utworzyłem another question i tutaj można spróbować zarówno implementacje: za pomocą sposobu Flash lub BitmapData + copyPixels()

+0

Zrywanie ekranu jest związane z wydajnością. To jedyny sposób, aby naprawić łzawienie. – Kekoa

+3

@Kekoa Nie mogę się z tym zgodzić. Wydajność nie ma nic wspólnego z odrywaniem ekranu, ponieważ używam podwójnego bufora. W przypadku słabej wydajności uzyskałbym niższy FPS, ale nie ekranowe rozdarcie. – oshyshko

+0

inni mają rację, że to podejście nie jest zbyt odpowiednie dla flash playera ... wciąż jestem zaskoczony, to wcale nie działa ... kilka pytań: - czy próbowałeś zablokować bitmapę, którą jesteś wciągnąć? (jeśli nie, może to bardzo pomóc!) - czy korzystasz z przezroczystych bitmap? (ogólny zabójca wydajności) - dir wypróbujesz 'Stage :: invalidate' i renderujesz na' Event.RENDER' zamiast renderowania? greetz back2dos – back2dos

Odpowiedz

7

Czuję twój ból, ponieważ jestem obecnie w okopach rozwijających moją własną grę. Przy ustawieniach domyślnych renderowanie Flash generuje okropne problemy z rozrywaniem ekranu/v-synchronizacją, niezależnie od tego, jaki kod wygenerujesz.

Dlatego właśnie ucieszyłem się, że znalazłem najprostszą, elegancką odpowiedź, która nie była re-factoringiem kodu (co nie pomaga ani trochę, problemem jest odtwarzacz Flash, a nie kod).

Wystarczy włączyć akcelerację sprzętową w ustawieniach publikowania. Dostępne są dwie różne opcje:

Poziom 1: bezpośredni; i Poziom 2: GPU.

Przeczytaj więcej na ten temat w oficjalnej dokumentacji: Specify publish settings for SWF files i zdecyduj, która opcja jest najlepsza dla Twojej gry.

Rynek docelowy odgrywa tu ważną rolę, jeśli jest to poważna gra dla graczy, nie musisz martwić się o możliwe problemy z wydajnością, ponieważ większość graczy ma układy GPU.

This article nie dostarczył mi rozwiązania, ale poprowadził mnie we właściwym kierunku. ALE, jeśli twoja gra będzie w oknie przeglądarki, być może będziesz musiał użyć tej samej techniki ustawienia wmode, aby kierować lub gpu.

+0

Czy wiesz, czy istnieje atrybut tagu metadanych, który można w tym celu określić? (W przypadku gier FlashDevelop AS-only, bez FLA). Coś wzdłuż linii: [SWF (hardwareAcc = "gpu")] czy to istnieje? – bigp

+0

Jedynym innym znanym parametrem jest wmode, który można ustawić w pliku html umieszczonym w pliku Flash. Jestem pewien, że musi istnieć coś, co może to osiągnąć bez Flash IDE. –

+0

Jaki jest wniosek? To naprawdę problem Flash Playera i nie możemy zrobić nic, żeby to poprawić? –

-4

Pierwszą rzeczą może chcesz zrobić, to przestać traktować Flash Player tak jak to jest DOS. Flash Player jest wysoce zoptymalizowanym silnikiem gry 2D i naprawdę nie rozumiem, dlaczego próbujesz odkryć nowe koło, kopiując wiele plasterków mapy bitowej. Oczywiście będziesz mieć problemy z wydajnością.

Flash Player nie pozwala na synchronizację z pionowym lub poziomym blankem, ponieważ Flash Player po prostu nie ma pojęcia o tym.

Osobiście uważam, że należy ponownie przemyśleć podejście, jeśli chcesz "płynniejszej" animacji. Flash Player z pewnością jest w stanie to zrobić, po prostu próbujesz złego podejścia.

+2

Dziwne, kopiowanie uchwytów bajtów (bitmap) w pamięci powinno być łatwiejsze dla komputera niż renderowanie go z matematyką obliczenia. Powinny istnieć powody, dla których "cacheAsBitmap" istnieje w programie Flash. Sprawdź również: http://aralbalkan.com/759 – oshyshko

+0

Twoje Sprites (DisplayObject's) nie muszą być wektorem w ogóle. Flash Player jest zoptymalizowany, aby sobie z tym poradzić. Gdy zaczniesz odtwarzać w ActionScriptu z bitmapami, co Flash Player robi już bardzo dobrze i jest zoptymalizowany, po prostu brakuje ci punktu. Myślę, że powinieneś przeczytać więcej na blogu Tinic Uro: http://www.kaourantin.net – Luke

+2

@Luke: Twoja odpowiedź byłaby bardziej przydatna, gdyby zasugerowała praktyczną alternatywę, niż zwykłe powiedzenie, że oryginalne podejście jest złe. Istnieje kilka źródeł w Internecie sugerujących użycie bitmap i copyToPixels w kontekście tworzenia gier 2D, więc nie jest to oryginalny plakat, który dokonuje zmian na nowo. – Kylotan

-5

Nie zapisuj rzeczy w BitmapData, które zabiją, całkowicie zabiją Twoją aplikację. Dane bitmapowe nie są bardzo wydajne.

Zrób wszystkie elementy gry w trybie flash, jako Sprites (lub MovieClips, jeśli musisz), a następnie pracuj jak flash miał działać, jako platforma animacji wektorowych. Nigdy nie została zoptymalizowana pod kątem grafiki 2-bitowej. Grafika wektorowa 2d działa dobrze, a nawet jeśli zaimportujesz bitmapy, będą działać lepiej, przenosząc się do obiektu BitmapData.

+0

Jeśli zrezygnuję z buforowania i dodam mapy bitowe jako natywne spity Flash (nadal bitmapy), to czy rozwiąże to problem VSYNC? – oshyshko

+0

Nie, nie będzie. Ale będzie wyglądać znacznie lepiej niż to, co obecnie masz. Jak już wspomniałem w swojej odpowiedzi na twoje pytanie, Flash Player nie ma koncepcji vsync. Po ustawieniu fps na 60 (co jest absurdalne, ale to jest poza punktem), Flash Player spróbuje wygenerować 60 fps. W rzeczywistości prawie nigdy tego nie osiągnie. – Luke

+1

Odkryłem, że są zdecydowanie razy, kiedy powinieneś używać Bitmapdata do poprawy wydajności. –