Χαμηλά fps σε flash με Actionscript 3

ActionScript και Flex Προγραμματισμός

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
ahepa
Δημοσιεύσεις: 7
Εγγραφή: 10 Ιαν 2009 20:20
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από ahepa » 07 Ιουν 2011 19:33

Για τη δουλειά μου χρειάζομαι να μάθω Actionscript 3 και να μεταφέρω κάποια παιχνίδια που έχει η εταιρεία σε flash.

Την κύρια λογική των παιχνιδιών την έχω μεταφέρει και λειτουργεί όπως θα περίμενα, με σταθερά fps, υπόψη ότι η όλη δουλειά γίνεται με κώδικα και όχι timeline.

Δυστυχώς όμως όπως διαπίστωσα σε ορισμένα μηχανήματα, ανεξάρτητα από τον browser που θα χρησιμοποιήσω αντί να έχω σταθερά 60fps που έχω ριθμίσει (με κώδικα, όχι τα fps του timeline/stage) βλέπω να έχω μεταβλητά από 25-35fps.

Μπορεί κανείς να μου στείλει δείγμα ή να μου πει κανένα site με δείγματα πως μπορεί να καταφέρω να έχω σταθερά fps, μήπως και κάνω εγώ κάποιο λάθος;

Ευχαριστώ.

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από HeRu » 08 Ιουν 2011 10:33

Για να έχεις πιο σταθερά fps, θα πρέπει να χρησιμοποιήσεις το Timer class και όχι να βασίζεσαι στο ENTER_FRAME event.

Για να έχεις 60 fps θα πρέπει να κάνεις μια ανανέωση ανά περίπου 16.6 ms ( 1 sec/60 fps ).

Κώδικας: Επιλογή όλων

var _timer:Timer = new Timer(16.6);
_timer.addEventListener(TimerEvent.TIMER, onUpdate);

function onUpdate(event:TimerEvent):void
{
	// Do stuff
}

_timer.start();
Αν όμως δεν προλαβαίνει να τελειώσει ο κώδικας και το display μέσα σε αυτά τα 16.6 ms, τότε πάλι θα πέφτουν τα fps και θα πρέπει να κάνεις κάποια optimizations για να ρίξεις το processing time.

ahepa
Δημοσιεύσεις: 7
Εγγραφή: 10 Ιαν 2009 20:20
Τοποθεσία: Θεσσαλονίκη
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από ahepa » 08 Ιουν 2011 10:49

HeRu έγραψε:Για να έχεις πιο σταθερά fps, θα πρέπει να χρησιμοποιήσεις το Timer class και όχι να βασίζεσαι στο ENTER_FRAME event.
Ναι πράγματι δε βασίζομαι στο ENTER_FRAME event, αν και αρχικά τη λογική μου με αυτόν τον τρόπο την είχα. Σε κάποιο βιβλίο που διάβασα είχε και τους δύο τρόπους. Τόσο με το συγκεκριμένο event όσο και με timer, αλλά έδινε μεγαλύτερη έμφαση στο timer, ειδικά για την περίπτωση που όλα είναι να γίνουν με κώδικα.
HeRu έγραψε: Για να έχεις 60 fps θα πρέπει να κάνεις μια ανανέωση ανά περίπου 16.6 ms ( 1 sec/60 fps ).

Κώδικας: Επιλογή όλων

var _timer:Timer = new Timer(16.6);
_timer.addEventListener(TimerEvent.TIMER, onUpdate);

function onUpdate(event:TimerEvent):void
{
	// Do stuff
}

_timer.start();
Αν όμως δεν προλαβαίνει να τελειώσει ο κώδικας και το display μέσα σε αυτά τα 16.6 ms, τότε πάλι θα πέφτουν τα fps και θα πρέπει να κάνεις κάποια optimizations για να ρίξεις το processing time.

Αυτό που έχω είναι:

Κώδικας: Επιλογή όλων

    public static const FRAME_RATE:int = 60;
    private var mfPeriod:Number = 1000 / FRAME_RATE;

    ....................................
    mpGameTimer = new Timer(mfPeriod,1);
    mpGameTimer.addEventListener(TimerEvent.TIMER, MainLoop, false,0,true);
    mpGameTimer.start();

Με αυτόν τον τρόπο αν θελήσω αργότερα να βάλω άλλα fps αυτόματα θα γίνει η μετατροπή. Και στη συνέχεια:

Κώδικας: Επιλογή όλων

private function MainLoop(e:TimerEvent):void
{
      var next_game_tick:Number = getTimer();
      var sleep_time:Number = 0;
			
       var fElapsedTime:Number = next_game_tick - mfTime;
       mfTime = getTimer();

	GameLogic(fElapsedTime);

        mpCanvasBD.lock();
	        GameDraw(fElapsedTime);
	mpCanvasBD.unlock();

	next_game_tick = next_game_tick + mfPeriod;
	if (next_game_tick > 1000)
		next_game_tick = getTimer();
	
	sleep_time = ( next_game_tick - getTimer() );

        mpGameTimer.reset();
	mpGameTimer.delay = 0;
	if ( sleep_time > 0 )
            	mpGameTimer.delay = sleep_time;
        mpGameTimer.start();

	e.updateAfterEvent();			
}
Στα πιο πολλά μηχανήματα που το δοκίμασα ανεξάρτητα από τον browser τα fps ήταν όπως ήθελα και η κίνηση ομαλότατη. Δυστυχώς το αφεντικό το δοκίμασε σε ένα netbook και εκεί ήταν που έγινε ο χαμός.

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από HeRu » 08 Ιουν 2011 11:48

Είναι αναμενόμενο ότι ένα απαιτητικό παιχνίδι δεν θα έχει καλή απόδοση σε ένα netbook. Ο flash player τρέχει προς το παρών μόνο στην CPU, οπότε ένα netbook που έχει αδύναμο επεξεργαστή, δεν μπορεί να ανταπεξέλθει στην επεξεργασία και προβολή ενός πολύπλοκου παιχνιδιού.

Αυτό που μπορείς να κάνεις είναι κάποια optimizations, bitmaps ( ή cacheAsBitmap ) και όχι vector γραφικά και να απλοποιήσεις τις πράξεις.

http://wiki.joa-ebert.com/index.php/Main_Page
http://osflash.org/as3_speed_optimizations
http://www.nbilyk.com/optimizing-actionscript-3

Άβαταρ μέλους
Argyris88i
Δημοσιεύσεις: 60
Εγγραφή: 10 Απρ 2010 13:53
Τοποθεσία: Athens
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από Argyris88i » 13 Ιουν 2011 05:07

Καλώς όρισες στον κόσμο του Flash! Το Flash αν και «Multimedia Engine» με την ευρύτερη έννοια ακόμα κάνει τα calculations στην CPU + ότι δεν υποστηρίζει threading!.

Παιδιά όχι timers!!!! Σε οποιαδήποτε γλώσσα προγραμματισμού «τρώνε» ΠΟΛΥ CPU Usage! Με 2 timers σε ένα stage θέλεις Pentium i3 τουλάχιστον ( που λέει ο λόγος ).

Δοκίμασε αυτό και η Game Loop να καλείτε απο την enterFrame.

Κώδικας: Επιλογή όλων

CurrentTickCount = flash.utils.getTimer();
	
if ( Math.abs( LastTickCount - CurrentTickCount ) > 50 )
{
LastTickCount = flash.utils.getTimer();
… // You Main Game Loop
}

Αλήθεια τι games κάνεις port;;;;; Σε Java ήταν και τα μεταφέρεις σε Flash;;;
Prosilis - Chatzitofis & Co.
Web,Social & Marketing Games!
http://www.sdsgames.com/

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από HeRu » 13 Ιουν 2011 18:07

Argyris88i έγραψε:Παιδιά όχι timers!!!! Σε οποιαδήποτε γλώσσα προγραμματισμού «τρώνε» ΠΟΛΥ CPU Usage! Με 2 timers σε ένα stage θέλεις Pentium i3 τουλάχιστον ( που λέει ο λόγος ).
Argyris αυτό που αναφέρεις δεν έχει καμία βάση. Τα πάντα λειτουργούν με timers, ακόμα και το Enter_Frame event έχει internally ένα "elastic" timer.

Αν ήταν έτσι, τότε βιβλιοθήκες για physics όπως το Box2D
και για 3D όπως το Away3D , που βασίζονται σε timers δεν θα υπήρχαν.

Πολύ CPU καταναλώνει στο Flash μη βελτιστοποιημένος κώδικας και πολύπλοκα διανυσματικά γραφικά.

Άβαταρ μέλους
Argyris88i
Δημοσιεύσεις: 60
Εγγραφή: 10 Απρ 2010 13:53
Τοποθεσία: Athens
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από Argyris88i » 13 Ιουν 2011 20:54

HeRu έγραψε:
Argyris88i έγραψε:Παιδιά όχι timers!!!! Σε οποιαδήποτε γλώσσα προγραμματισμού «τρώνε» ΠΟΛΥ CPU Usage! Με 2 timers σε ένα stage θέλεις Pentium i3 τουλάχιστον ( που λέει ο λόγος ).
Argyris αυτό που αναφέρεις δεν έχει καμία βάση. Τα πάντα λειτουργούν με timers, ακόμα και το Enter_Frame event έχει internally ένα "elastic" timer.

Αν ήταν έτσι, τότε βιβλιοθήκες για physics όπως το Box2D
και για 3D όπως το Away3D , που βασίζονται σε timers δεν θα υπήρχαν.

Πολύ CPU καταναλώνει στο Flash μη βελτιστοποιημένος κώδικας και πολύπλοκα διανυσματικά γραφικά.
http://osflash.org/pipermail/papervisio ... 16836.html

"...The answer is, update on FRAMES, but control with TIME.

Timed events for screen updates is the wrong way to go."

«Τα πάντα λειτουργούν με timers» Αυτό είναι άκυρο εντελώς. Δεν είναι καθόλου έτσι, Στις Low Level γλώσσες δεν υπάρχουν Timers, μόνο Main Loops ( + Threads ) που καλούν functions και ελέγχουν τον χρόνο που πέρασε από το ρολόι του ΟS. Τα Timers στις γλώσσες υψηλού επιπέδου , καθυστερούν αρκετά την CPU και δεν χρησιμοποιούνται σε κανένα επαγγελματικό Game.
Prosilis - Chatzitofis & Co.
Web,Social & Marketing Games!
http://www.sdsgames.com/

Άβαταρ μέλους
HeRu
Flash Moderator
Δημοσιεύσεις: 800
Εγγραφή: 16 Αύγ 2004 10:49
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από HeRu » 13 Ιουν 2011 21:40

Argyris καταλαβαίνω πως μπορεί να έχεις παραπληροφορηθεί από ένα random thread σε ένα random mailing board, αλλά η ίδια η Adobe λέει ότι σε κάποιες περιπτώσεις είναι καλύτερο να χρησιμοποιείς Timers για καλύτερο CPU usage.
http://help.adobe.com/en_US/as3/mobile/ ... eebc6-7ffb
This behavior can offer some significant optimization.
Ένας timer από μόνος του δεν προσθέτει φόρτο στην CPU. Ή μάλλον θα μπορούσες να πεις ότι προσθέτει ακριβώς τον ίδιο φόρτο με ένα frame event.

Ο κίνδυνος προέρχεται στο γεγονός ότι με τους Timers μπορείς να τρέχεις κώδικα ανεξάρτητα από το frame rate του movie και έτσι κάνεις "skip" το rendering κομμάτι του Flash player και κατά συνέπεια φαινομενικά φορτώνεις πιο πολύ την CPU. Αυτό όμως πάντα εξαρτάτε από τον κώδικα σου.

Η προτίμηση σε frames στο Flash προέρχεται από το μοντέλο που λέγεται Elastic Racetrack,
http://www.craftymind.com/tag/elastic-racetrack/
για να μην σε ζαλίσω με τις λεπτομέρειες, όταν αργεί πολύ να τελειώσει ο κώδικας καθυστερεί το frame ή ενώνει frames μαζί ώσπου να τελειώσει ο κώδικας και μετά κάνει το render στην οθόνη. Έτσι πέφτουνε τα "πραγματικά" fps. Δηλαδή και τα controls σου είναι πιο αργά αλλά και όλα τα updates που βασίζονται στο frame event.

Όταν χρησιμοποιείς timer, μπορεί να πέσουν πάλι τα display fps αν έχεις βάρη κώδικα, άλλα επειδή συνεχίζει να κάνει update από πίσω χωρίς να εξαρτάτε από το frame rate, σου δίνει την εντύπωση ότι είναι πιο responsive το παιχνίδι.

Πάντως με οποιονδήποτε τρόπο και αν κάνεις το main loop σου, θα πρέπει πάντα συνειδητά να έχεις σωστό και καθαρό κώδικα. Αυτό είναι το πιο σημαντικό για να μην έχεις high cpu usage.

Άβαταρ μέλους
Argyris88i
Δημοσιεύσεις: 60
Εγγραφή: 10 Απρ 2010 13:53
Τοποθεσία: Athens
Επικοινωνία:

Χαμηλά fps σε flash με Actionscript 3

Δημοσίευση από Argyris88i » 14 Ιουν 2011 01:44

HeRu έγραψε: Πάντως με οποιονδήποτε τρόπο και αν κάνεις το main loop σου, θα πρέπει πάντα συνειδητά να έχεις σωστό και καθαρό κώδικα. Αυτό είναι το πιο σημαντικό για να μην έχεις high cpu usage.
+1 :wink:
Prosilis - Chatzitofis & Co.
Web,Social & Marketing Games!
http://www.sdsgames.com/

Απάντηση

Επιστροφή στο “ActionScript και Flex Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης