Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-01-2003, 09:18   #1 (permalink)
th.
Neuer User
 
Benutzerbild von th.
 
Registriert seit: Oct 2001
Ort: Bielefeld
Beiträge: 1.279
OOP sucks!

Hey,
habe im Auftrag vom WM-Team eine Game-Engine programmiert, klein, übersichtlich, nach objektorintierten Prinzipien. Dabei wurde jedoch ziemlich schnell klar, dass das Ganze zu langsam wird. Also alles über Bord geworfen, was an Struktur drin war, alles auf _root gepackt, die meisten Funktinen dupliziert und direkt in den Code gepackt und siehe da, 50% bessere Performance. Warum gibt es da so einen krassen Unterschied? Auf jeden Fall habe ich jetzt ein echtes Problem, wenn das Teil mal gewartete werden muss.

Gruß,
Thorsten
__________________
polyaktiv.de
Flash 3D-Renderer

Geändert von th. (08-01-2003 um 13:37 Uhr)
th. ist offline   Mit Zitat antworten
Alt 08-01-2003, 10:09   #2 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
wat soll man da sagen?
ich habe auch gerade ein (Iso-)Spiel programmiert, auch (relativ) streng objektorientiert
und bin mit der Performance sehr zufrieden.
hier isset:
http://www.duschdas.de/unterhaltung/...el/default.asp

Ich wüsste gar nicht, wie ich das ohne OOP hätte realisieren sollen.
Es gibt halt ein paar Dinge von denen man die Finger lassen sollte, wenn
es um Performance geht, z.B. FLEM/Asbroadcatser.
Es ist halt eine Frage, wie man an die Dinge rangeht,
for..in Loops zum Bsp. sind um einiges schneller als normale Schleifen,
machen aber nur mit OOP Sinn.
Ein Problem mit Flash&OOP ist sicher die Geschichte, das verschachtelte
Objekte Punkt für Punkt evaluiert werden,
aber die kann man ja zur Not am Ende mit eval bzw. set wieder flott machen.

Florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 11:32   #3 (permalink)
th.
Neuer User
 
Benutzerbild von th.
 
Registriert seit: Oct 2001
Ort: Bielefeld
Beiträge: 1.279
Hi Flory,
natürlich macht OOP in Projekten, in denen es nicht so auf auf Performance ankommt. Bei meinen ersten Iso-Game hatte ich da auch keine Probleme...
Hier gibt es aber viel mehr Tiles, KI für mehrere Gegner usw.

Gruß,
Thorsten
__________________
polyaktiv.de
Flash 3D-Renderer
th. ist offline   Mit Zitat antworten
Alt 08-01-2003, 11:40   #4 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
bleibt dabei, OOP und Performance schliessen sich nicht aus,
ist nur ne Frage der Optimierung und der Effizienz der Algorithmen.
Ich hab ja auch schon ein paar Spiele gebaut - man muss sich halt vorher
Gedanken machen.
Glaub mir, die scrollende Iso-Landschaft und die Gegner sind auch nicht ganz ohne.
Wenn man weiss, wo die Nadelöhrs liegen und wie man drumrumkommt,
geht das aber.

gruss,
Florian
__________________
www.planet-xaml.net

Geändert von flory (08-01-2003 um 11:44 Uhr)
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 11:45   #5 (permalink)
th.
Neuer User
 
Benutzerbild von th.
 
Registriert seit: Oct 2001
Ort: Bielefeld
Beiträge: 1.279
Und selbst wenn alle Flaschenhälse beseitigt sind bringt der Rückbau noch einiges an Performance. Und wenn es wirklich auf jedes Frame ankommt, vergiss OOP, die grundsätzlichn Strukturen können natürlich erhalten bleiben.

Gruß,
Thorsten
__________________
polyaktiv.de
Flash 3D-Renderer
th. ist offline   Mit Zitat antworten
Alt 08-01-2003, 12:11   #6 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
Der "Rückbau" ist in Flash ja schon drin, die Performancefresser liegen in den
Algorithmen und in den Aufrufen.
Die einzige Schwäche die ich da erkennen kann ist die Sache mit
den Pfaden - jeder Punkt verbrennt zwei Bytecode-Instruktionen mehr.
Hast Du mal Versuche mit set/eval gemacht?

Bei meiner 3D-Engine kam es auch auf jeden Frame an - trotzdem OOP, auch wenn die Methoden in sich extrem optimiert sind.

Aber jedem seine Meinung

Florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 12:29   #7 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
ich finde auch das oop eigentlich nicht langsamer ist, die alten f4 funktionen substring() ect. sind halt schneller, aber das hat ja mit oop nicht viel zu tun. Mir kommt prototype = function fast schneller vor als nur function.

OOP !sucks
secp ist offline   Mit Zitat antworten
Alt 08-01-2003, 13:48   #8 (permalink)
hOk
Neuer User
 
Benutzerbild von hOk
 
Registriert seit: Jun 2001
Ort: berlin
Beiträge: 829
@th.
Ist ein nettes Game geworden, gefällt mir sehr gut.

@flory
Kannst du mir mal erklären wo der Unterschied ist,
wenn ich mir einen langen Pfad zwischenspeichere
und wenn ich eval oder set verwende.
Ich mach mal ein kleines Beispiel:
PHP-Code:
Car = function () 
{
    
this.arrWheels = new Array();
}
Car.prototype.addWheels = function (pNumber)
{
    while (
pNumber--) this.arrWheels.push(new Wheel());
}

Wheel = function () {}
Wheel.prototype.explode = function ()
{
    
trace('Huups, ein Reifen ist geplatzt!');
}

Knife = function () {}
Knife.prototype.stickWheel = function (pWheel)
{
    
pWheel.explode();
}


objCar = new Car();
objCar.addWheels(4);

objWheel objCar.arrWheels[0];

objKnife = new Knife();
objKnife.stickWheel(objWheel); 
Wo würdest du jetzt mit deinem Performance-Schraubendreher rangehen.
Bzw. hast du ein Beispiel wo set und eval Sinnvoll wären,
würde mich echt interessieren.

viele nette Grüße, Holger
__________________
gobogo
hOk ist offline   Mit Zitat antworten
Alt 08-01-2003, 14:08   #9 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
ActionScript:
  1. Car = function ()
  2. {
  3.     this.arrWheels = new Array();
  4. }
  5. Car.prototype.addWheels = function (pNumber)
  6. {
  7.     while (pNumber--) eval("this.arrWheels.push")(new Wheel());
  8. }
  9.  
  10. Wheel = function () {}
  11. Wheel.prototype.explode = function ()
  12. {
  13.     trace('Huups, ein Reifen ist geplatzt!');
  14. }
  15.  
  16. Knife = function () {}
  17. Knife.prototype.stickWheel = function (pWheel)
  18. {
  19.     eval("pWheel.explode")();
  20. }
  21.  
  22.  
  23. objCar = new Car();
  24. eval("objCar.addWheels")(4);
  25.  
  26. objWheel = eval("objCar.arrWheels")[0];
  27.  
  28. objKnife = new Knife();
  29. eval("objKnife.stickWheel")(objWheel);

an deinem Beispiel kann aber man nicht so viel rumschrauben, weil ja hauptsächlich Strukturen
definiert werden und nicht viel an Berechnungen/Logik passiert.
Die Geschichte mit eval() wurde hier im OOP-Bereich glaub ich schon ein paarmal erklärt.
Bei Flash5 konnte man eval noch auf die rechte Seite setzen (eval("this.prop.prop")=xyz, in MX
muss man das über set machen (set("this.prop.prop",xyz). Letzteres funktioniert aber nur, wenn die Properties vorher schonmal "ordentlich" definiert wurden (z.B. im Konstruktor this.prop.prop=initval).
Wenn man sich ein bischen mit Flash-Bytecode auseinandersetzt, versteht man, warum das
so ist - Stichwort setmember vs. setvariable.
Wenn´s Dich interessiert, spiel mal ein bischen rum und dekompilier den Code in Flasm.

Viele interessante Einsichten wünscht
Florian
__________________
www.planet-xaml.net

Geändert von flory (08-01-2003 um 14:16 Uhr)
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 14:10   #10 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
th,
du hast es eben einfach nicht drauf

Ne Quatsch,
wenn ein Funktionsaufruf schon
uber 50 % Performance kostet,
dann ist es halt schwierig mit OOP.

ActionScript:
  1. function test(){
  2.     x = x + 2;
  3. }
  4.  
  5. t = getTimer();
  6. for(i=0; i<1000; i++){
  7.     test();
  8. }
  9. trace(getTimer() - t);
  10.  
  11. t = getTimer();
  12. for(i=0; i<1000; i++){
  13.     x = x + 2;
  14. }
  15. trace(getTimer() - t);

output
107
47


Aber für den Entwurf und für nicht so
rechenintensive Sachen möchte ich es nicht
mehr missen. Optimieren kann man dann
anschliessend.

Denn nach einer alten Regel verbringt ein Programm
90% der Zeit in 10% des Codes, und dort muss
man optimieren, der Rest kann sauber bleiben.

mfg r.
bokel ist offline   Mit Zitat antworten
Alt 08-01-2003, 15:12   #11 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
also: functions suck

florian
__________________
www.planet-xaml.net
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 15:31   #12 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
hmm hab mal getestet, th. hat doch recht, oder?

ActionScript:
  1. function test(){
  2.         x = x + 2;
  3. }
  4.  
  5. function tObj(){
  6.     this.x = 0;
  7. }
  8. tObj.prototype.test = function(){
  9.     this.x = this.x + 2;
  10. }
  11.  
  12. obj = new tObj();
  13. t = getTimer();
  14. for(i=0; i<1000; i++){
  15.         obj.test();
  16. }
  17. trace(getTimer() - t);
  18.  
  19.  
  20. t = getTimer();
  21. for(i=0; i<1000; i++){
  22.         test();
  23. }
  24. trace(getTimer() - t);
  25.  
  26.  
  27.  
  28. t = getTimer();
  29. for(i=0; i<1000; i++){
  30.         x = x + 2;
  31. }
  32. trace(getTimer() - t);

ausgabe:
101
87
40
secp ist offline   Mit Zitat antworten
Alt 08-01-2003, 15:51   #13 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
mit
ActionScript:
  1. tObj.prototype.test = function(){
  2.         set("this.x",eval("this.x") + 2);      
  3. }

komme ich auf 99 zu 86. ist zwar langsamer, aber die 15% relativieren sich auch, weil man normalerweise nicht ausschlieslich properties setzt, sondern auch mal lokale Variablen benutzt (oder sollte).

Der Vergleich mit dem letzten Beispiel ist natürlich irgendwo Banane - für jede Addition extra eine Funktion aufzurufen ist logischerweise langsamer, als einfach zwei und zwei zusammenzuzählen. Aber im echten Leben macht man das ja auch nicht.

Im echten Leben sieht es dann doch eher so aus:
ActionScript:
  1. function Class(x) {
  2.   this.x=x; 
  3. }
  4.  
  5. Class.prototype.count1000=function() {
  6.   var x=eval("this.x");
  7.   for (var i=1000;i --; ) {
  8.       x+=2;
  9.   }
  10.   set("this.x",x);
  11. }
  12.  
  13. t = getTimer();
  14. obj=new Class(12);
  15. obj.count1000();
  16. trace(getTimer() - t);
  17.  
  18. // - - - - -
  19.  
  20. t = getTimer();
  21. for(i=0; i<1000; i++){
  22.         x = x + 2;
  23. }
  24. trace(getTimer() - t);


output:
18
30

OOP, trotzdem fast doppelt so schnell
in dem Fall ging es natürlich auch ohne set und eval ohne grossen Performance-Verlust
__________________
www.planet-xaml.net

Geändert von flory (08-01-2003 um 16:19 Uhr)
flory ist offline   Mit Zitat antworten
Alt 08-01-2003, 16:26   #14 (permalink)
Bugfixer
 
Registriert seit: Nov 2001
Ort: #
Beiträge: 572
ja wenn man den pfad auch noch zwischenspeichert ist es genauso schnell wie normale funktionen, bei deiner syntax stimmt x nicht mehr

ActionScript:
  1. tObj.prototype.test = function(){
  2.       set("x",eval("x") + 2);
  3. }
  4.  
  5. obj = new tObj();
  6. f = obj.test;
  7. t = getTimer();
  8. for(i=0; i<1000; i++){
  9.        f();
  10. }
  11. trace("x : " + x + ", " +(getTimer() - t));
secp ist offline   Mit Zitat antworten
Alt 08-01-2003, 16:29   #15 (permalink)
www.kruesch.de
 
Benutzerbild von flory
 
Registriert seit: Feb 2002
Beiträge: 1.057
ojeoje, wat soll dat dann?
schau dir deinen code nochmal an...

Florian
__________________
www.planet-xaml.net

Geändert von flory (08-01-2003 um 16:31 Uhr)
flory 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 15:38 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele