Flash/AS2:向下滚动越远,应用程序速度越慢
我在flash中构建了一个应用程序,它是一个运行非常平稳的大型应用程序,但是它是一个比应用程序窗口运行得更远的图形列表,所以我使用垂直滚动条和遮罩来显示它们 问题是你向下滚动的越远,所有的东西都会变得不稳定,任何二者之间的移动和帧速率都会降低很多 当你到达底部时,它是无法忍受的,尽管在整个卷轴中有相同数量的电影唇和相同数量的细节,所以我不明白为什么会有如此巨大的性能下降了一点 有人知道是什么导致了这一切吗 根据要求,以下是我构建图表的代码部分:Flash/AS2:向下滚动越远,应用程序速度越慢,flash,actionscript,actionscript-2,Flash,Actionscript,Actionscript 2,我在flash中构建了一个应用程序,它是一个运行非常平稳的大型应用程序,但是它是一个比应用程序窗口运行得更远的图形列表,所以我使用垂直滚动条和遮罩来显示它们 问题是你向下滚动的越远,所有的东西都会变得不稳定,任何二者之间的移动和帧速率都会降低很多 当你到达底部时,它是无法忍受的,尽管在整个卷轴中有相同数量的电影唇和相同数量的细节,所以我不明白为什么会有如此巨大的性能下降了一点 有人知道是什么导致了这一切吗 根据要求,以下是我构建图表的代码部分: var local_data = SharedOb
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;
}
var local_data=SharedObject.getLocal(“用户_数据”);
Slide_Tracker=本地_data.data.user_数据;
var timespan:MovieClip=this.timescale.span;
对于(i=0;i0){
变量索引:Number=spanXcoords[s]。长度-1;
var spanPrevX:Number=spanXcoords[s][index];
var spanPrevY:Number=spanYcoords[s][index];
变量span wx:Number=spanPrevX+(日期差异*3);
var SPANWY:编号=barY/4;
此杆。_x=扳手wx;
该杆的高度=barY/4;
spanXcoords[s]。推送(Spanwx);
spanYcoords[s]。推送(Spanwy);
}
该条_y+=25;
选择器_条[s]。推动(此条);
}
}
图表.设置掩码(图表.父.图表.掩码);
var dot_name:String=新字符串(图[s]。_name+“_dot”+i);
var dotObj:Object=新对象();
if(prevX!=未定义){
dotObj._x=newX;
}否则{
dotObj._x=startX;
}
dotObj._y=幻灯片_y;
Chart.\u parent.dotArea.attachMovie(“graph\u dot”,dot\u名称,Graphs[s].chartArea.dotArea.getNextHighestDepth(),dotObj);
图表_parent.dotArea.swapDepths(99999);
var thisDot:MovieClip=eval(图[s]+.chartArea.dotArea.+dot_名称);
图点[s]。推送(此点);
thisDot.date\u字符串=日期\u字符串;
thisDot.date\u int=date\u int;
thisDot.percent=Slide_Tracker[i].val_arr[s];
thisDot.onRollOver=函数(){
这个。停止(“结束”);
var dot_Coords:Object={x:this.\ux,y:this.\uy};
var viewPortRatio:Number=this.\u parent.\u parent.chart.viewPortRatio;
var offsetX:Number=此。_parent._parent.chart.offsetX;
如果(viewPortRatio==未定义){
视窗比率=1;
}
if(offsetX==未定义){
offsetX=0;
}
var text_x:Number=(dot_Coords.x/viewPortRatio)+offsetX;
变量text_y:Number=dot_Coords.y;
如果(dot_Coords.y448){
点文本。_x-=点文本。_宽度;
}
};
thisDot.onRollOut=thisDot.onReleaseOutside=函数(){
本节为“gotoAndStop”(“norm”);
killTxt(this.\u parent.\u parent.\u parent.dot\u info);
删除点坐标;
};
}
图表宽度=图表宽度;
}
这是我的滚动条代码:
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();
scrolling=function(){
变量scrollHeight:Number=scrollTrack.\u height-btnUp.\u height-btnDown.\u height;
变量contentHeight:Number=contentMain.\u高度;
变量scrollFaceHeight:Number=scrollFace.\u高度;
var maskHeight:编号=maskedView.\u高度;
变量initPosition:Number=滚动面。_y=滚动轨迹。_y+btnUp._高度;
var initContentPos:Number=contentMain.\u y;
var finalContentPos:Number=maskHeight contentHeight+initContentPos;
变量left:Number=scrollTrack.x+(scrollTrack.width-scrollFace.width)/2.4;
变量顶部:数字=滚动轨迹。_y+btnUp。_高度;
右侧变量:数字=滚动轨迹。x+(滚动轨迹。width-滚动面。width)/2.4;
变量底部:数字=(scrollTrack.\u高度-scrollFaceHeight+scrollTrack.\u y)-btnDown.\u高度;
变量dy:Number=0;
var速度:数字=10;
var moveVal:Number=(contentHeight maskHeight)/(scrollHeight scrollFaceHeight);
scrollFace.onPress=函数(){
var currPos:Number=此项;
startDrag(此、假、左、上、右、下);
this.onMouseMove=函数(){
dy=Math.abs(初始位置为该值);
contentMain._y=Math.round(dy*-1*moveVal+initContentPos);
};
};
scrollFace.onMouseUp=函数(){
停止拖动();
删除此.onMouseMove;
};
btnUp.onPress=函数(){
this.onEnterFrame=函数(){
如果(contentMain._y+速度=底部){
滚动面。_y=底部;
}否则{
滚动面。_y+=速度/移动值;
}
contentMain._y-=速度;
}否则{
滚动面。_y=底部;
contentMain.\u y=最终内容;
删除此.onEnterFrame;
}
};
};
btnDown.onRelease=函数(){
删除此.onEnterFrame;
};
btnDown.onDragOut=函数(){
删除此.onEnterFrame;
};
var mouseListener=新对象();
mouseListener.onMouseWheel=功能(车轮运动)
{
if(车轮运动<0){
如果(contentMain.\u y-speed>finalContentPos){
如果(滚动面._y>=底部){
滚动面。_y=底部;
}else{scrollFace._y+=速度/移动值;
}
contentMain._y-=速度;
}否则{
滚动面。_y=底部;
contentMain.\u y=最终内容;
}
}
如果(车轮运动>0){
如果(contentMain._y+speed我今天解决了这个问题,这真是一种解脱,我刚刚遇到了scrollRect()
函数,它只渲染在其边界内可查看的数据,只要它是位图缓存的(无论是否可查看,向量对象仍将完全渲染)
尽管我允许用户修改图形的_scaleX并将其缓存为位图,但现在我仍然看到,自从使用可滚动矩形替换遮罩以来,性能得到了绝对巨大的提高,因为在获得足够的数据后,这些图形的宽度超过20000。尽管它们的大小巨大,但一切都可以流畅地工作