2011-07-18 11 views
2

私はフラッシュでアプリケーションを構築しましたが、かなりスムーズに動作する大きなアプリケーションですが、アプリケーションウィンドウよりも長いグラフ私はそれらを表示するために垂直スクロールバーとマスクを使います。Flash/AS2:さらにスクロールするとアプリケーションが遅くなります

さらに問題がスクロールしていくと、すべてのトゥイーンまたはムーブメントとフレームレートは、はるかに低いようです。

スクロール全体に同じ量のムービークリップと同じ量のディテールがあるにもかかわらず、底に着くと耐えられないので、少し下がるのになぜこの大規模なパフォーマンスヒットがあるのか​​わかりません。

これを引き起こしている可能性のあることは誰でも知りたいですか?

ここで要求されたように、グラフを構築し、私のコードの一部です:

var local_data = SharedObject.getLocal("user_data"); 
Slide_Tracker = local_data.data.user_data; 
var timespan:MovieClip = this.timescale.span; 
for (i=0; i<Slide_Tracker.length; i++) { 
    var current_date = new Date(Slide_Tracker[i].date_int); 
    var date_int:Number = Slide_Tracker[i].date_int; 
    var x_range:Number = 30; 
    var sorted_date:Object = new Object(sortDate(Slide_Tracker[i].date_int)); 
    var date_string:String = sorted_date.string; 
    var startX:Number = 0; 
    date_nav.push(Slide_Tracker[i].date_int); 
    if (i == 0) { 
     for (s=0; s<Graphs.length; s++) { 
      var Chart:MovieClip = Graphs[s].chartArea.createEmptyMovieClip("chart", 10); 
      Chart._x = 0; 
      Chart._y = 0; 
      Charts.push(Chart); 
      Chart._parent.dotSpace.index = s; 
      Chart._parent.dotSpace.onRollOver = function() { 
       this.followDot._visible = true; 
       this.followDot.enabled = false; 
       this.onMouseMove = function() { 
        if(this._parent.chart.viewPortRatio == undefined) { 
         var viewPortRatio:Number = 1; 
        } 
        else { 
         var viewPortRatio:Number = this._parent.chart.viewPortRatio; 
        } 
        var xMouse:Number = this._xmouse; 
        var xToArray:Number = Math.round(((xMouse-this._parent.chart._x)*viewPortRatio)); 
        this.followDot._y = lineArray[this.index][xToArray].y; 
        trace(xToArray); 
        this.followDot._x = xMouse; 
       }; 
      }; 
      Chart._parent.dotSpace.onRollOut = function() { 
       this.followDot._visible = false; 
       delete this.onMouseMove; 
      }; 
     } 
    } else if (i>0) { 
     var past_date:Date = new Date(Slide_Tracker[i-1].date_int); 
     var date_diff:Number = Math.round((current_date-past_date)/86400000); 
    } 
    for (s=0; s<Slide_Tracker[i].val_arr.length; s++) { 
     var Slide_y:Number = 100-Slide_Tracker[i].val_arr[s]; 
     var Chart:MovieClip = Graphs[s].chartArea.chart; 
     with (Chart) { 
      beginFill(0x000066,15); 
      lineStyle(2,0x000066,80); 
      if (i == 0) { 
       moveTo(startX,Slide_y); 
       Xcoords[s].push(startX); 
       Ycoords[s].push(Slide_y); 
      } else if (i>0) { 
       var index:Number = Xcoords[s].length-1; 
       var prevX:Number = Xcoords[s][index]; 
       var prevY:Number = Ycoords[s][index]; 
       moveTo(prevX,prevY); 
       var newX:Number = prevX+(date_diff*(895.9/x_range)); 
       var newY:Number = Slide_y; 
       lineTo(newX,newY); 
       lineStyle(6,0x000066,0); 
       lineTo(newX,100); 
       lineTo(prevX,100); 
       lineTo(prevX,prevY); 
       convertLineToArray(s,prevX,newX,prevY,newY); 
       Xcoords[s].push(newX); 
       Ycoords[s].push(newY); 
      } 
      endFill(); 
      lineStyle(0,0x000066,80); 
      with (Graphs[s].chartArea.timescale.span) { 
       var barName:String = Slide_Tracker[i].date_int; 
       var thisBar:MovieClip = attachMovie("bar", barName, this.getNextHighestDepth()+i); 
       if (Slide_y != 100) { 
        var barY:Number = 100-Slide_y; 
       } else { 
        var barY:Number = 0; 
       } 
       if (i == 0) { 
        thisBar._x = 1; 
        thisbar._height = barY/4; 
        spanXcoords[s].push(1); 
        spanYcoords[s].push(barY/4); 
       } else if (i>0) { 
        var index:Number = spanXcoords[s].length-1; 
        var spanPrevX:Number = spanXcoords[s][index]; 
        var spanPrevY:Number = spanYcoords[s][index]; 
        var spanNewX:Number = spanPrevX+(date_diff*3); 
        var spanNewY:Number = barY/4; 
        thisBar._x = spanNewX; 
        thisBar._height = barY/4; 
        spanXcoords[s].push(spanNewX); 
        spanYcoords[s].push(spanNewY); 
       } 
       thisBar._y += 25; 
       selector_bars[s].push(thisBar); 
      } 
     } 
     Chart.setMask(Chart._parent.chart_mask); 
     var dot_name:String = new String(Graphs[s]._name+"_dot"+i); 
     var dotObj:Object = new Object(); 
     if (prevX != undefined) { 
      dotObj._x = newX; 
     } else { 
      dotObj._x = startX; 
     } 
     dotObj._y = Slide_y; 
     Chart._parent.dotArea.attachMovie("graph_dot",dot_name,Graphs[s].chartArea.dotArea.getNextHighestDepth(),dotObj); 
     Chart._parent.dotArea.swapDepths(99999); 
     var thisDot:MovieClip = eval(Graphs[s]+".chartArea.dotArea."+dot_name); 
     Graphs_dots[s].push(thisDot); 
     thisDot.date_string = date_string; 
     thisDot.date_int = date_int; 
     thisDot.percent = Slide_Tracker[i].val_arr[s]; 
     thisDot.onRollOver = function() { 
      this.gotoAndStop("over"); 
      var dot_Coords:Object = {x:this._x, y:this._y}; 
      var viewPortRatio:Number = this._parent._parent.chart.viewPortRatio; 
      var offsetX:Number = this._parent._parent.chart.offsetX; 
      if (viewPortRatio == undefined) { 
       viewPortRatio = 1; 
      } 
      if (offsetX == undefined) { 
       offsetX = 0; 
      } 
      var text_x:Number = (dot_Coords.x/viewPortRatio)+offsetX; 
      var text_y:Number = dot_Coords.y; 
      if (dot_Coords.y<50) { 
       text_y += 60; 
      } else { 
       text_y -= 20; 
      } 
      var Textbox:Object = {name:"dot_info", container:this._parent._parent._parent, x:text_x, y:text_y, text:this.date_string+"\n"+this.percent+"%"}; 
      var dotText:TextField = generateTextbox(Textbox); 
      if (dotText._x>448) { 
       dotText._x -= dotText._width; 
      } 


     }; 
     thisDot.onRollOut = thisDot.onReleaseOutside=function() { 
      this.gotoAndStop("norm"); 
      killTxt(this._parent._parent._parent.dot_info); 
      delete dot_Coords; 
     }; 

    } 
    chartsWidth = Chart._width; 
} 

そして、ここでは私のスクロールバーコードです:

scrolling = function() { 
var scrollHeight:Number = scrollTrack._height - btnUp._height - btnDown._height; 
var contentHeight:Number = contentMain._height; 
var scrollFaceHeight:Number = scrollFace._height; 
var maskHeight:Number = maskedView._height; 
var initPosition:Number = scrollFace._y=scrollTrack._y + btnUp._height; 
var initContentPos:Number = contentMain._y; 
var finalContentPos:Number = maskHeight-contentHeight+initContentPos; 
var left:Number = scrollTrack._x + (scrollTrack._width - scrollFace._width)/2.4; 
var top:Number = scrollTrack._y + btnUp._height; 
var right:Number = scrollTrack._x + (scrollTrack._width - scrollFace._width)/2.4; 
var bottom:Number = (scrollTrack._height-scrollFaceHeight+scrollTrack._y) - btnDown._height; 
var dy:Number = 0; 
var speed:Number = 10; 
var moveVal:Number = (contentHeight-maskHeight)/(scrollHeight-scrollFaceHeight); 

scrollFace.onPress = function() { 
var currPos:Number = this._y; 
startDrag(this, false, left, top, right, bottom); 
this.onMouseMove = function() { 
dy = Math.abs(initPosition-this._y); 
contentMain._y = Math.round(dy*-1*moveVal+initContentPos); 
}; 
}; 
scrollFace.onMouseUp = function() { 
stopDrag(); 
delete this.onMouseMove; 
}; 
btnUp.onPress = function() { 
this.onEnterFrame = function() { 
if (contentMain._y+speed<maskedView._y) { 
if (scrollFace._y<=top) { 
scrollFace._y = top; 
} else { 
scrollFace._y -= speed/moveVal; 
} 
contentMain._y += speed; 
} else { 
scrollFace._y = top; 
contentMain._y = maskedView._y; 
delete this.onEnterFrame; 
} 
}; 
}; 
btnUp.onDragOut = function() { 
delete this.onEnterFrame; 
}; 
btnUp.onRollOut = function() { 
delete this.onEnterFrame; 
}; 
btnDown.onPress = function() { 
this.onEnterFrame = function() { 
if (contentMain._y-speed>finalContentPos) { 
if (scrollFace._y>=bottom) { 
scrollFace._y = bottom; 
} else { 
scrollFace._y += speed/moveVal; 
} 
contentMain._y -= speed; 
} else { 
scrollFace._y = bottom; 
contentMain._y = finalContentPos; 
delete this.onEnterFrame; 
} 
}; 
}; 
btnDown.onRelease = function() { 
delete this.onEnterFrame; 
}; 
btnDown.onDragOut = function() { 
delete this.onEnterFrame; 
}; 
var mouseListener = new Object(); 
mouseListener.onMouseWheel = function(wheelMotion) 
{ 
if (wheelMotion < 0) { 
if (contentMain._y-speed>finalContentPos) { 
if (scrollFace._y>=bottom) { 
scrollFace._y = bottom; 
} else { scrollFace._y += speed/moveVal; 
} 
contentMain._y -= speed; 
} else { 
scrollFace._y = bottom; 
contentMain._y = finalContentPos; 
} 
} 
if (wheelMotion > 0) { 
if (contentMain._y+speed<maskedView._y) { 
if (scrollFace._y<=top) { 
scrollFace._y = top; 
} else { 
scrollFace._y -= speed/moveVal; 
} 
contentMain._y += speed; 
} else { 
scrollFace._y = top; 
contentMain._y = maskedView._y; 
} 
} 
} 

Mouse.addListener(mouseListener); 



if (contentHeight<maskHeight) { 
scrollFace._visible = false; 
btnUp.enabled = false; 
btnDown.enabled = false; 
btnUp.gotoAndStop(2); 
btnDown.gotoAndStop(2); 
} else { 
scrollFace._visible = true; 
btnUp.enabled = true; 
btnDown.enabled = true; 
btnUp.gotoAndStop(1); 
btnDown.gotoAndStop(1); 
} 
}; 
scrolling(); 
+0

はあなたが一度スクロールダウンし、スクロール、それは二回遅くなくなっているの先頭に戻ってくるか、カムバックトップにするとき良くなる時期についてダウンし、どのようなスクロールで表示リストにさらにムービークリップを追加します – Badr

+0

がスクロールバックすると、下の要素は人がフレームに入るとすぐに存在し、スクロールするとY値の変化から静的に離れています。 –

+0

いくつかのコードはありますか? – Badr

答えて

0

今日はこれを解決し、どのような救済、ちょうど私scrollRect()関数が実行されました。この関数は、ビットマップキャッシュされている限り、その範囲内で表示可能なデータをレンダリングします(ベクトルオブジェクトは表示可能かどうかにかかわらず完全にレンダリングされます)。

実際に私は、グラフの_scaleXを変更してビットマップとしてキャッシュするようにしましたが、十分なデータの後に、20,000を超える十分なデータの後にスクロール可能な矩形でマスクを交換してから、幅で。その巨大なサイズにもかかわらず、すべてが流動的に機能します。

Adobe's explanation of scrollRect()

関連する問題