вы добавляете строковых * col дочерних элементов (во вложенном цикле: addchild (grid)), так что в итоге вы получаете кучу видеороликов row * col, содержащих все более сложные векторные рисунки.
не очень хорошо, особенно на энтерфрейме!
на самом деле это сетка и должна быть нарисована один раз, сам график будет нарисован на другом слое. Вы можете передать объект отображения функции, если вам нужно перерисовать сетку.
Кроме того, вам не нужны вложенные циклы: использование drawRect вместо этого даст вам возможность разбить вложенные циклы, а поскольку прямоугольник рисует одновременно верхнюю и нижнюю части, вы можете увеличивать циклы на 2.
вот пример, который должен работать немного быстрее:)
package
{
import flash.display.MovieClip;
import flash.display.Shape;
import flash.events.Event;
import flash.utils.getTimer;
public class Line extends MovieClip
{
private var grid:Shape;
public function Line()
{
//adds the canvas once
grid = new Shape();
grid.x = 50;
grid.y = 50;
addChild( grid );
//draws once
createGraphContainer( grid, 100, 25, 5, 2 );
//draws in a loop
//addEventListener(Event.ENTER_FRAME, redrawGrid );
}
private function redrawGrid(e:Event):void
{
var t:uint = getTimer();
var cols:int = 1 + int( Math.random() * 200 );
var rows:int = 1 + int( Math.random() * 200 );
var width:int = 1 + Math.random() * 10;
var height:int = 1 + Math.random() * 10;
createGraphContainer( grid, cols, rows, width, height );
trace( 'redrawing took :', ( getTimer() - t ), 'for col:', cols, 'rows:', rows, 'cell width:', width, 'cell height:', height );
}
public function createGraphContainer( grid:Shape, numColumns:int = 100, numRows:int = 100, cellWidth:Number = 10, cellHeight:Number = 5 ):void
{
grid.graphics.clear();
grid.graphics.lineStyle( 0.5, 0xFFECDB);
//grid.graphics.beginFill( 0xFF0000, .25 ); // uncomment for debug
var gridWidth:Number = numColumns * cellWidth;
var gridHeight:Number = numRows * cellHeight;
grid.graphics.drawRect( 0, 0, gridWidth, gridHeight );
for (var col:Number = 0; col < numColumns; col += 2 )
{
grid.graphics.drawRect( col * cellWidth, 0, cellWidth, gridHeight );
}
for (var row:Number = 0; row < numRows; row += 2 )
{
grid.graphics.drawRect( 0, row * cellHeight, gridWidth, cellHeight );
}
grid.cacheAsBitmap = true;//not to be used in a loop very efficient if drawn once.
}
}
}