Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 29-01-2004, 08:27   #1 (permalink)
ewiger Schüler
 
Registriert seit: Jul 2003
Beiträge: 139
Sinus Bewegung - Performance optimieren

Hallo,

ich bastel grade an einem kleinen Spiel in dem sich verschiedene Objekte bewegen.

Dabei bewegen sich machen auch in Sinus Form. Nun habe ich festgestellt, daß die Berechnung

ActionScript:
  1. this._x=xpos+70*Math.sin(this._y/50*Math.PI);

sehr viel Performance braucht. einem P2 600 läuft es schon nicht mehr flüssig bei 6 Objekten. Nun suche ich nach einer anderen Lösung zur Berechnung, da ich den Weg über Tabellen möglichst vermeiden möchte.
__________________
Manchmal muß man erst etwas tun, um etwas getan zu haben.
Arpheton ist offline   Mit Zitat antworten
Alt 29-01-2004, 13:44   #2 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 35
Hi Arpheton,

wenn Du was über ne Sinus-, Kreis-, oder Ellipsenbahn bewegen willst, ist das der beste Weg. Du kannst es evtl. etwas beschleunigen, wenn Du setInterval() benutzt, anstatt onEnterFrame. Falls Du das nicht schon tust. Ansonsten kannst Du wie wir alle auf zackige Prozessoren hoffen.

glatzenmolch
glatzenmolch ist offline   Mit Zitat antworten
Alt 29-01-2004, 14:06   #3 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Hi,

du könntest dir auch vorher ein Array mit allen Sinus-Werten schreiben. Du müsstest die übergenenen Werte nur auf Ganzzahlen runden:

ActionScript:
  1. sinus = new Array();
  2. for(i=0;i<360;i++) {
  3.     sinus[i] = Math.sin(i*Math.PI/180);
  4.     trace(i + ":" + sinus[i]);
  5. }
  6. //...
  7. this._x=xpos+70*sinus[Math.round(this._y/50*Math.PI) % 360];

Abgesehen davon benötigen viele bewegte Objekte immer viel Performance, da die CPU das immer komplett berechnen muss.

Grüße
Sascha

PS: ich habs nicht auf Performance getestet, versuchs mal...
__________________
12:15, press return

Geändert von ludabruda (29-01-2004 um 14:07 Uhr)
ludabruda ist offline   Mit Zitat antworten
Alt 29-01-2004, 14:25   #4 (permalink)
ewiger Schüler
 
Registriert seit: Jul 2003
Beiträge: 139
Ja das mit der Array ist das, was ich vermeiden wollte, da ich verschiedene Sinusbewegungen habe und nicht zig tabellen erstellen will.

Das alle bewegeten Objekte viel Permance benötigen ist richtig, one Sinusbewegung kann ich locker das vierfache an Objekten bewegen!

Versteh garnicht das die berechnung so lange dauert, selbst ein lumpiger 486 kann doch schnell einen sinus berechnen ? was rechnet flash denn da ?
__________________
Manchmal muß man erst etwas tun, um etwas getan zu haben.
Arpheton ist offline   Mit Zitat antworten
Alt 29-01-2004, 14:30   #5 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
wie, verschiedene Sinus-Bewegungen?

Die Berechnung der Werte bleibt doch identisch?
Solange du mit ganzzahligen Wert operierst, brauchst du doch nur ein Array...

Lediglich den Ausdruck:
Math.round(this._y/50*Math.PI) % 360
als Array-Index musst du ändern. Die Faktoren davor sind davon auch unabhängig
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 29-01-2004, 14:38   #6 (permalink)
ewiger Schüler
 
Registriert seit: Jul 2003
Beiträge: 139
Äh...... wenn ich ne größere Amplitude oder ne andere Freuqenz (?) haben will, dann muß ich das doch auch neu berechnen, oder ?
__________________
Manchmal muß man erst etwas tun, um etwas getan zu haben.
Arpheton ist offline   Mit Zitat antworten
Alt 29-01-2004, 15:17   #7 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
und wo ist jetzt das Problem, das du mit Math.sin() lösen kannst?

Die Amplitude ist der Faktor, der steht eh außerhalb der Sinus-Funktion, so oder so...

ActionScript:
  1. mc1.onEnterFrame = function() {
  2.    this._y = 15 * _root.sinus[Math.round(this._y * 50)%360];
  3. }
  4. mc2.onEnterFrame = function() {
  5.    this._y = 38 * _root.sinus[Math.round(this._x * 214)%360];
  6. }

Vorausgesetzt, du nimmst nur ganzzahlige Werte, liefert Math.sin(x); immer Werte zwischen -1 und 1 im Bogenmaß.
Das gleiche gilt für das Array. Es gibt doch nur 360° im Kreis bzw. 2*PI...
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 29-01-2004, 15:35   #8 (permalink)
ewiger Schüler
 
Registriert seit: Jul 2003
Beiträge: 139
Aha!
Danke!!!
__________________
Manchmal muß man erst etwas tun, um etwas getan zu haben.
Arpheton ist offline   Mit Zitat antworten
Alt 30-01-2004, 08:48   #9 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 35
Hi Arpheton,

kann es sein, dass das Problem nicht in der Berechnung des Sinus liegt, sondern an der Komplexität der Clips, die Du bewegst? Wie sehen die denn aus?

g
glatzenmolch ist offline   Mit Zitat antworten
Alt 30-01-2004, 09:14   #10 (permalink)
ewiger Schüler
 
Registriert seit: Jul 2003
Beiträge: 139
Hi glatzenmolch,

es liegt definitiv an der Sinusbewegung, denn wenn ich die Objekte einfach linear bewege, gibt es keine Probleme!
__________________
Manchmal muß man erst etwas tun, um etwas getan zu haben.
Arpheton ist offline   Mit Zitat antworten
Alt 30-01-2004, 09:22   #11 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 35
und hat es performancemäßig was gebracht, die sinuswerte aus'm array zu ziehen?
glatzenmolch 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 05:35 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele