Zurück   Flashforum > Flash > Mobile Flash und Flash Lite

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 01-05-2009, 23:42   #1 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Daten abfrage von Sensoren, performance problem. Was kann man weglassen?

Also, Kugel rollt per Sensordatenabfrage auf dem Bildschirm hin und her(per Neigung des handys)
Die Abfrage der Achsendaten erfordert unnormal viel performance(ok, ist halt n handy)

Ich wüsste gern was ich hier entfernen kann, ohne einen Error zu erhalten.:
PHP-Code:
// Import Platform Service Interface
import com.nokia.lib.Service;

// Enable Full Screen
fscommand2"FullScreen"true );
// Set quality
fscommand2"SetQuality""high" );
// Set onPress function to exit_mc MovieClip which closes the application
exit_mc.onPress = function() {
    
status fscommand2("Quit");
    
trace("QUIT");
}



// Prevent scale of the stage
Stage.scaleMode "noScale";

// Create new Service object which has Sensor data
var sensors = new Service("Service.Sensor""ISensor");

// Define input parameters for picking Rotation sensor
var inParam = {SearchCriterion:"AccelerometerAxis"};
// Define result value
var outParams sensors.FindSensorChannel(inParam);
// Define channel info (rotation)
var channelInfo outParams.ReturnValue;
// Define valid values for channel info
var channelId channelInfo[0].ChannelId;
var 
contextType channelInfo[0].ContextType;
var 
quantity channelInfo[0].Quantity;
var 
channelType channelInfo[0].ChannelType;
var 
location channelInfo[0].Location;
var 
vendorId channelInfo[0].VendorId;
var 
dataItemSize channelInfo[0].DataItemSize;
var 
channelDataTypeId channelInfo[0].ChannelDataTypeId;
var 
channelInfo = {
    
ChannelId:channelIdContextType:contextTypeQuantity:quantity
    
ChannelType:channelTypeLocation:locationVendorId:vendorId
    
DataItemSize:dataItemSizeChannelDataTypeId:channelDataTypeId
    
};

// Define input parameters for listening orientation channel data 
var inParams = {ListeningType:"ChannelData"ChannelInfoMap:channelInfo};

// The RegisterForNotification method registers the user to receive data from one sensor channel asynchronously
sensors.RegisterForNotification(inParamscallBack);

// Because this is an asynchronous method you need to define callback function
// Callback function includes all the channel data
function callBack(transactionID:StringeventID:StringoutParam:Object) {
    if (
outParam.ErrorCode == 0) {
        var 
channelData outParam.ReturnValue;
        
_root.deviceAccelerometerDataX channelData.XAxisData;
        
_root.deviceAccelerometerDataY channelData.YAxisData;
        
_root.deviceAccelerometerDataZ channelData.ZAxisData;
    }
}; 
War n Tut, in dem die Displaylage von vertikal auf horizontal geändert wird, Ich musste n paar Dinge ändern damit ich an die Daten komme die ich wirklich brauche. Daher hab ich eigentlich keine Ahnung was genau das alles heist, also vllt weis jemand was da "überflüssig" ist, und performance sparen würde.
thx
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 02-05-2009, 11:51   #2 (permalink)
Neuer User
 
Registriert seit: Sep 2004
Beiträge: 632
Sieht nicht so aus, als wäre in den geposteten Zeilen irgendwas performancehungriges, ausser dem Aufruf der Function, wie die Sensordaten übergeben werden.

Wieviel fps bekommst du denn?

Ich würde versuchen, die Flash-Anwendnung selber zu optimieren wo es geht. So ein Handy ist wesentlich empfindlicher als ein PC, gerade was Grafik-Berechnung angeht. Hier finden sich einige Empfehlungen
http://library.forum.nokia.com/index...42DBCA099.html

Geändert von kugelfunk (02-05-2009 um 11:54 Uhr)
kugelfunk ist offline   Mit Zitat antworten
Alt 02-05-2009, 12:24   #3 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Danke für die Antwort, ich habe mir die tipps schon längst durchgelesen, viele interessante Dinge, aber da ich eigentlich nur einen ball(vektorgrafik) hin und her bewege und sonst eig nix anzeige, muss ich was am script ändern.

Ich habe erstmal die Zachse rausgelassen, es geht schon merkbar fixer, Ich hatte überlegt den kram nur alle 2 frames abzufragen, das wäre warscheinlich noch sensibel genug, und flüssiger.

Ich sehe da kein EnterFrame oder so, wieso wird das trotzdem IMMER abgefragt ?
sieh :
PHP-Code:
sensors.RegisterForNotification(inParamscallBack); 
und :
PHP-Code:
function callBack(transactionID:StringeventID:StringoutParam:Object) {
    if (
outParam.ErrorCode == 0) {
        var 
channelData outParam.ReturnValue;
        
_root.deviceAccelerometerDataX channelData.XAxisData;
        
_root.deviceAccelerometerDataY channelData.YAxisData;
        
_root.deviceAccelerometerDataZ channelData.ZAxisData;
    }
}; 
Es wird nur einmal diese notification "registred" und dabei iwie die callBack funktion aufgerufen, wird die dann jedes frame aufgerufen, bzw. senden die sensoren dann jedes frame die daten? Weil unten ja ein "stop()" steht und somit das ganze nur einmal gestartet wird...
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 02-05-2009, 12:33   #4 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Wie bekomme ich eigentlich raus wie viele frames ich bekomme ?
-> "Wieviel fps bekommst du denn?"
Muss ich da die frames zählen und mit der Zeit(date=new Date.....) verrechnen?xD
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 02-05-2009, 13:52   #5 (permalink)
Neuer User
 
Registriert seit: Sep 2004
Beiträge: 632
Mit
Code:
sensors.RegisterForNotification(inParams, callBack);
meldest du dich beim Gerät als Observer an. Wie oft das Gerät die Sensordaten rausrückt ist unabhängig vom Flashplayer und der framerate. Entweder es meldet das nur, wenn der Sensor eine Ceränderung feststellt, oder laufend in einem bestimten Intervall. Kannst du dir ja mal ausgeben lassen.

Die framerate kann man bspw. durch gettimer abfragen, also jede Sekunde (oder Durchschnittswert 3 sekunden / 3) die gezählten onEnterFrame-Aufrufe ausgeben.
kugelfunk ist offline   Mit Zitat antworten
Alt 02-05-2009, 14:10   #6 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
ok werd ich mal machen...

Habe folgendes gemacht : Habe in dem "callBack" eine Bedingung eingebaut, er soll nur die werte ausgeben wenn eine zahl 2 ist, diese wechselt zwischen 1 und 2. somit macht er das nur alle 2 frames.

PHP-Code:
function callBack(transactionID:StringeventID:StringoutParam:Object) {
    if (
outParam.ErrorCode == 0) {
        var 
channelData outParam.ReturnValue;
        
_root.deviceAccelerometerDataX channelData.XAxisData;
        
_root.deviceAccelerometerDataY channelData.YAxisData;
        
_root.deviceAccelerometerDataZ channelData.ZAxisData;
    }
}; 
-> hier habe ich den errorcode entfernt(ist im mom unwichtig) und dafür die Bedingung eingebaut.
jetzt läuft es merkbar flüssiger.
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 02-05-2009, 14:34   #7 (permalink)
Neuer User
 
Registriert seit: Sep 2004
Beiträge: 632
Ah ok. Wobei sich das nach deiner Beschreibung so anhört, als würde das Spiel jedes Mal alle Berechnungen durchführen, wenn Sensordaten vom Gerät kommen. (bzw. jetzt jedes 2. Mal). Das wäre ja unnötiger Overhead.

Stattdessen brauchst du die Berechnungen ja nur einmal pro Frame, weil nur einmal pro Frame auch was neues gezeichnet wird. Hast du die Berechnungen in der onEnterFrame-Methode drin? Wenn nicht pack sie besser da rein (oder rufe die Berechnungsmethoden von da auf).

Stellst du das Spiel später mal zur Verfügung? Würd mich auch interessieren in Bezug auf die Performance. Das Nokia 5800 selber ist von der Beschreibung her eigentlich recht schnell, fast wie ein iPhone. Der Flashlite-Player bremst bislang aber so einiges aus, weil er noch nicht auf performante Vektorberechnungen optimiert ist. Das kommt lt. Wikipedia demnächst mit einer neuen Engine.

Geändert von kugelfunk (02-05-2009 um 14:38 Uhr)
kugelfunk ist offline   Mit Zitat antworten
Alt 02-05-2009, 14:44   #8 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
" _root.deviceAccelerometerDataX = channelData.XAxisData;" das ist ja nur das speichern der daten in die links stehende variable. Die abfrage ist glaube ich : "var channelData = outParam.ReturnValue; " weil "channelData" der wert von "outParam.ReturnValue" zugewiesen wird. und genau das, mache ich genau wie die zuweisung in die variable nur alle 2 frames. Ich schätze, sobald man diese notification durchgeführt hat, sucht er jedes bild nach den daten die der callback anfordert, das heist er macht diese abfrage immernoch jedes frame, aber sendet die daten nur jedes 2., jedes 1. frame geht er das script durch und macht quasi einen "break" da die bedingung nicht erfüllt ist. Jedenfalls funktioniert es halbwegs.. also die leistung ist merkbar gestiegen..

Den ganzen Kram der oben steht, über dem callBack, der wird nur 1mal durchgeführt. (glaube ich)

reicht das als erklärung, oder bist du immernoch der Meinung da habe ich quatsch gemacht ? Wenn ich da noch was verbessern kann immer her mit tipps
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 02-05-2009, 15:03   #9 (permalink)
Neuer User
 
Registriert seit: Sep 2004
Beiträge: 632
Zitat:
Zitat von KYL3R Beitrag anzeigen
und genau das, mache ich genau wie die zuweisung in die variable nur alle 2 frames.
Bist du dir da sicher? An welcher Stelle hast du denn diese Halbierung eingebaut?
kugelfunk ist offline   Mit Zitat antworten
Alt 02-05-2009, 17:11   #10 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
PHP-Code:
// Import Platform Service Interface
import com.nokia.lib.Service;

// Enable Full Screen
fscommand2"FullScreen"true );
// Set quality
fscommand2"SetQuality""low" );



// Prevent scale of the stage
Stage.scaleMode "noScale";

// Create new Service object which has Sensor data
var sensors = new Service("Service.Sensor""ISensor");

// Define input parameters for picking Rotation sensor
var inParam = {SearchCriterion:"AccelerometerAxis"};
// Define result value
var outParams sensors.FindSensorChannel(inParam);
// Define channel info (rotation)
var channelInfo outParams.ReturnValue;
// Define valid values for channel info
var channelId channelInfo[0].ChannelId;
var 
contextType channelInfo[0].ContextType;
var 
quantity channelInfo[0].Quantity;
var 
channelType channelInfo[0].ChannelType;
var 
location channelInfo[0].Location;
var 
vendorId channelInfo[0].VendorId;
var 
dataItemSize channelInfo[0].DataItemSize;
var 
channelDataTypeId channelInfo[0].ChannelDataTypeId;
var 
channelInfo = {
    
ChannelId:channelIdContextType:contextTypeQuantity:quantity
    
ChannelType:channelTypeLocation:locationVendorId:vendorId
    
DataItemSize:dataItemSizeChannelDataTypeId:channelDataTypeId
    
};

// Define input parameters for listening orientation channel data 
var inParams = {ListeningType:"ChannelData"ChannelInfoMap:channelInfo};

// The RegisterForNotification method registers the user to receive data from one sensor channel asynchronously
sensors.RegisterForNotification(inParamscallBack);

// Because this is an asynchronous method you need to define callback function
// Callback function includes all the channel data
function callBack(transactionID:StringeventID:StringoutParam:Object) {
        if(
i==2){ //Bei i==1 wird weder var channelData die werte vom Sensor also "outParam.ReturnValue;" zugewiesen, noch diese werte den anderen Variablen "_root.deviceAccelerometerDataX"(diese habe ich selbst definiert, muss man dazusagen weil hier ja alles coloriert wird^^
        
var channelData outParam.ReturnValue;
        
_root.deviceAccelerometerDataX channelData.XAxisData;
        
_root.deviceAccelerometerDataY channelData.YAxisData;
        }
};
onEnterFrame=function(){
    if(
i<2){
        
i++
    }else if(
i==2){
        
i=1
    
}
}
stop(); 
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 03-05-2009, 08:50   #11 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Zitat:
Zitat von KYL3R Beitrag anzeigen
Ich habe erstmal die Zachse rausgelassen, es geht schon merkbar fixer...
Zitat:
Zitat von KYL3R Beitrag anzeigen
-> hier habe ich den errorcode entfernt(ist im mom unwichtig) und dafür die Bedingung eingebaut.
jetzt läuft es merkbar flüssiger.
Also von dem was ich sehe, sollten deine Änderungen, wenn überhaupt,
minimale Verbesserungen "weit hinter dem Komma" bewirken.
Was du da rausschmeißt sind einfache Wertzuweisungen von einer Variable
in die andere, wenn die Callback-Funktion aufgerufen wird, müssen die Werte
eigentlich schon "da" sein, ob du die dann noch aus dem Objekt ausließt oder
nicht, sollte nicht ins Gewicht fallen.
Ohne objektive Messung der Performance wirst du nicht weiterkommen,
in deinem Code ist erstmal nichts ersichtlich,was spürbar Performance kosten könnte.
Wie werden denn die Werte weiter verarbeitet? Wenn diese Zuweisung so teuer ist,
könntest du einfach in _root eine Referenz auf das channelData-Objekt hinterlegen,
und aus diesem die Werte eben nur auslesen, wenn du sie auch benötigst.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (03-05-2009 um 08:51 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 03-05-2009, 12:26   #12 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Zitat:
Zitat von Janoscharlipp Beitrag anzeigen
[...]könntest du einfach in _root eine Referenz auf das channelData-Objekt hinterlegen,
und aus diesem die Werte eben nur auslesen, wenn du sie auch benötigst.
Das hätte ich dann gerne nochmal genauer erklärt. Das würde so wie ich es jetzt verstanden habe bestimmt etwas bringen..

in _root heist ja nur auf die Zeitleiste, oder halt auf die ursprungsebene, stamm was auch immer. Referenz ? AUF das channeldata-objekt ? hm.. das versteh ich grade nicht
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 03-05-2009, 13:29   #13 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Neuigkeiten

erst definiere ich das:
PHP-Code:
var timer:Number 0
und dann mache ich kontinuierlich das :
PHP-Code:
txtFPS Math.round(10 / ((getTimer() - timer) / 1000));
timer getTimer(); 
Habe ich von hier.

Ergebnis : Auf dem pc habe ich 250 frames, aber da kann er auch nix abfragen^^

Auf dem Handy :
Wenn ich den callback immer mache : ca 64 frames.
Wenn ich im Callback die bedingung(nur bei "2" -> 1,2,1,2,1,2) einbaue, habe ich ca 88-100 frames, aber die schwanken eigenltich sogar zwischen 70 und 110, weil die Abfrage immer wieder die fps runter reißt.

Ob nun 64 oder 88 frames, es sieht überhaupt nicht flüssig aus.(besser als vorher, aber es müsste deutlich besser gehen)

-> Ich habe in flash 24 fps eingestellt, mit 64 müsste das mehr als flüssig laufen. Ist an meiner Berechnung (siehe oben) was falsch? (habe die ja dierekt übernommen von der seite)
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 03-05-2009, 13:54   #14 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Ok ok, hab n fehler gemacht, man muss bei bild 11 wieder auf bild 2 zurück gehen, nicht jedes bild wie ich es gemacht habe(onEnterFrame)
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.
KYL3R ist offline   Mit Zitat antworten
Alt 03-05-2009, 13:59   #15 (permalink)
Flash-süchtiger
 
Benutzerbild von KYL3R
 
Registriert seit: Jan 2007
Beiträge: 268
Also nochmal. Habe das fps dings jetzt richtig eingestellt^^

Wenn ich jedes 2. bild abfrage habe ich 10-18 frames/sek (so siehts auch aus -.-)

Wenn ich jedes bild abfrage, habe ich 7-10 frames/sek (kotz)

Jetzt habe ich das nochmal auf jedes 3. geändert, komme auf 14-19 fps (jetzt wird die sensibilität/Reaktion des balls immer schlechter, logisch..)
__________________
http://kyl3r.ky.funpic.de
->Es gibt 3 Arten von Mathematikern ; Die einen können bis 3 zählen , die anderen nicht.

Geändert von KYL3R (03-05-2009 um 14:02 Uhr)
KYL3R ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 16:20 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele