Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 28-09-2005, 18:00   #1 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 34
Hohe CPU-Last durch Skript

Hohe CPU-Last durch Skript

Hallo

ich habe Probleme beim Laden von Hintergrundbildern in einen Container.

Folgendes habe ich gemacht:
Ein Hintergrundbild wird per Zufallsgenerator in einen MC-Container geladen (mit preloader), was auch klappt ;-) aber manchmal wird das Bild nicht angezeigt oder erst nach merrmaligem Laden
Dieses Problem passiert aber nur online (hostet by strato, bei 1und1 genauso). Offline funzt alles prima, sowohl bei direktem aufruf der index.html wie auch über localhost auf eigenem apache (win)

habe darasufhin auf Anraten aus dem Forum mit einer OnEnterFRame Funktion und einer if-Abfrage nach der Ladegrösse des Hintergrundbildes erreicht, dass es auch online im Prinzip funzt.

Diese Skript scheint aber eine Schleife auszulösen, der Prozessor rattert laut TaskManager permanent bei 30-70%, auch wenn gar nichts geschieht.

Ohne die OnEnterFrame-Funktion bleibt die CPU zwar ruhig, aber es funzt eben online wieder nicht...

Hier das Skript mit OnEnterFrame

ActionScript:
  1. _root.load_bg._visible = false;
  2. _root.main._visible = false;
  3.  
  4. var bg_height = getProperty(_root.load_bg, _height);
  5. var bg_width = getProperty(_root.load_bg, _width);
  6.  
  7. /* faktor1 für höhenänderung*/
  8. var faktor1 = bg_width/bg_height;
  9. /* faktor2 für breitenänderung*/
  10. var faktor2 = bg_height/bg_width;
  11.  
  12.  
  13. this.onEnterFrame = function () {
  14.   if bg_height >= 5)
  15.  
  16.   {
  17. _root.load_bg._visible = true;
  18. _root.main._visible = true;
  19.  
  20.  
  21.  
  22. Stage.align = "TL";
  23.  
  24. Stage.scaleMode = "noScale";
  25.  
  26.  
  27. stageListener = new Object();
  28.  
  29.  
  30.  
  31. stageListener.onResize = function()
  32. {
  33.     this.main._x = 25;
  34.     this.main._y = 30;
  35.     if (Stage.height >= bg_height and Stage.width < bg_width) {
  36.         _root.load_bg._height = Stage.height;
  37.         _root.load_bg._width = _root.load_bg._height*faktor1;
  38.  
  39.     } else if (Stage.width >= bg_width and Stage.height <bg_height) {
  40.         _root.load_bg._width = Stage.width;
  41.         _root.load_bg._height = _root.load_bg._width*faktor2;
  42.  
  43.     } else if (Stage.width >= bg_width and Stage.height >= bg_height) {
  44.         relationWidth = Stage.width / bg_width;
  45.         relationHeight = Stage.height / bg_height;
  46.         if (relationWidth > relationHeight) {           
  47.             _root.load_bg._width = Stage.width;
  48.             _root.load_bg._height = _root.load_bg._width*faktor2;
  49.  
  50.         }
  51.         else if (relationWidth < relationHeight) {
  52.             _root.load_bg._height = Stage.height;
  53.             _root.load_bg._width = _root.load_bg._height*faktor1;
  54.  
  55.         }
  56.     }
  57.  
  58. }
  59. Stage.addListener(stageListener);
  60. stageListener.onResize();
  61.  
  62.  
  63.   }//ende if
  64. }; //ende onEnterFrame
  65.  
  66. stop();


Frage: Kennt jemand einen Trick, wie ich sicherstelle dass mein Hintergrundbild (vor allem auch online) wirklich weiterverarbeitet wird, so wie es offline ja problemlos funktioniert, ohne dass die CPU-Belastung ständig so hoch ist???
mikune ist offline   Mit Zitat antworten
Alt 28-09-2005, 18:55   #2 (permalink)
Banned
 
Benutzerbild von projecktx
 
Registriert seit: Sep 2003
Beiträge: 2.071
ActionScript:
  1. _root.load_bg._visible = false;
  2. _root.main._visible = false;
  3.  
  4. var bg_height = getProperty(_root.load_bg, _height);
  5. var bg_width = getProperty(_root.load_bg, _width);
  6.  
  7. /* faktor1 für höhenänderung*/
  8. var faktor1 = bg_width/bg_height;
  9. /* faktor2 für breitenänderung*/
  10. var faktor2 = bg_height/bg_width;
  11.  
  12.  
  13. this.onEnterFrame = function () {
  14. [COLOR=Red]if (_root.MeineFlag==false){[/COLOR]
  15.         if [COLOR=Red]([/COLOR]bg_height >= 5)
  16.        
  17.         {
  18. _root.MeineFlag=true;
  19.                 _root.load_bg._visible = true;
  20.                 _root.main._visible = true;
  21.                
  22.                
  23.                
  24.                 Stage.align = "TL";
  25.                
  26.                 Stage.scaleMode = "noScale";
  27.                
  28.                
  29.                 stageListener = new Object();
  30.                
  31.                
  32.                
  33.                 stageListener.onResize = function()
  34.                 {
  35.                         this.main._x = 25;
  36.                         this.main._y = 30;
  37.                         if (Stage.height >= bg_height and Stage.width < bg_width) {
  38.                                 _root.load_bg._height = Stage.height;
  39.                                 _root.load_bg._width = _root.load_bg._height*faktor1;
  40.                                
  41.                         } else if (Stage.width >= bg_width and Stage.height <bg_height) {
  42.                                 _root.load_bg._width = Stage.width;
  43.                                 _root.load_bg._height = _root.load_bg._width*faktor2;
  44.                                
  45.                         } else if (Stage.width >= bg_width and Stage.height >= bg_height) {
  46.                                 relationWidth = Stage.width / bg_width;
  47.                                 relationHeight = Stage.height / bg_height;
  48.                                 if (relationWidth > relationHeight) {
  49.                                         _root.load_bg._width = Stage.width;
  50.                                         _root.load_bg._height = _root.load_bg._width*faktor2;
  51.                                        
  52.                                 }
  53.                                 else if (relationWidth < relationHeight) {
  54.                                         _root.load_bg._height = Stage.height;
  55.                                         _root.load_bg._width = _root.load_bg._height*faktor1;
  56.                                        
  57.                                 }
  58.                         }
  59.                        
  60.                 }
  61.                 Stage.addListener(stageListener);
  62.                 stageListener.onResize();
  63.                
  64.                
  65.         }//ende 2tes if
  66.    [COLOR=Red] }//ende erstes if[/COLOR]
  67. }; //ende onEnterFrame
  68.  
  69. stop();

da fehlte zuerstmal ne klammer (rot markiert)
zum zweiten hab ich dir ne variable eingebaut die erstmal überprüft ob überhaupt notwendig ist irgendwas zu machen diese heisst "_root.MeineFlag"

sooo wenn du nun einen neuen inhalt (neues bild) reinlädst setzt du

_root.MeineFlag=false;

direkt eine zeile hinter den befehl zum nachladen deines bildes

ginge aber auch einfacher aber mag dich nun nicht verwirren

Gruss Sascha
projecktx ist offline   Mit Zitat antworten
Alt 29-09-2005, 11:19   #3 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 34
Hallo und Danke schon mal.

Dein Vorschlag löst zwar das CPU-Problem, aber dafür nicht das Problem mit dem Laden des Hintergrundbildes, weswegen ich die OnEnterfRame-Funktion ja überhaupt verwende.

Online ist nach wie voer das Problem: Manchmal lädt er das Bild, manchmal nicht.

Ich bräuchte eine Funktion, die bewirkt, dass das Bild tatsächlich immer im Container "ankommt", ohne dass die CPU-Last so hoch wird.

Meine OnENterFrame erreicht das ja bereits, aber sie ist irgendwie fehlerhaft. wie müsste ich die umstricken?
mikune ist offline   Mit Zitat antworten
Alt 29-09-2005, 22:50   #4 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 10
hm, vielleicht könntest du mit
getBytesLoaded() und getBytesTotal () rausbekommen, ob das bild vollständig geladen wurde. das kannste in ne while schleife stecken, die erst abbricht, wenn getBytesLoaded == getBytesTotal ist

gruß
sWeeR ist offline   Mit Zitat antworten
Alt 30-09-2005, 07:43   #5 (permalink)
Neuer User
 
Registriert seit: Jun 2005
Beiträge: 34
Ich habe bereits einen Preloader, zu dem oben beschriebenen Skript komme ich also erst, wenn das Bild geladen ist. Es ist also geladen, wird nur von dem listener-Skript nicht angezeigt, es sei denn ich verwende die beschriebene Kombination aus onEnterframe und Listener. Dann aber eben das CPU-Problem.

Jemand hat mich darauf hingewisen, dass dies evtl. eine Flash-Krankheit sei, dass manchmal Bilder im Container nicht ganz ankommen...
Daher die Abfrage mit OnENterFrame...

Hat denn keiner eine Idee, was der Fehler in dem Skript sein könnte???
Das muss doch gehen...


Hier noch der Preloader:

ActionScript:
  1. var byteload = (int(this.load_bg.getBytesLoaded()/1024));
  2. var bytetotal = (int(this.load_bg.getBytesTotal()/1024));
  3.  
  4. // ermittelt geladene und zulandende bytes
  5.  
  6. if (byteload == bytetotal) {
  7.     //alles geladen
  8.     this.gotoAndPlay("onresize");
  9.     //weiter gehts
  10. }else{
  11.     this.gotoAndPlay(this._currentframe -1);
  12.     // ein frame zurück um dieses script nochmals aufzurufen
  13. }
  14. percentSetup = ((byteload/bytetotal)*100);
  15. percentage = 100 - int(percentSetup);
mikune 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 17:55 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele