ASの線
AS3で線を引く。
基本的にスプライトにgraphicsで一度描画をするとX,Yの位置やサイズは動かせてもそれの座標を指定してウネウネ動かすことは出来ない。
板に線を描画して画像として動かしてるみたいな感じ。
が、Processingでよくやるあるポイントからマウスカーソルの位置までの線を引きたい
line(0,0,mouseX,mouseY);
みたいな感じに。
で、結果は大体想像できるけど一応2つのパターンを試して見た。
1、本数分のスプライトを用意
(本数分のスプライトをクリア+全スプライトに再描画>レンダリング)繰り返し
2、1つのスプライトを用意
(スプライトをクリア>スプライトに本数分ラインを描画>レンダリング)繰り返し
この2つを80*30の2400本で実行。
1の場合
package { import flash.display.*; import flash.events.*; import flash.utils.*; public class linetest1 extends Sprite { private var lines:Array = new Array; private var cw:int = 80; private var ch:int = 30; public function linetest1() { var i:int; for(i=0;i<cw*ch;i++){ var line:Shape = new Shape; addChild(line); lines[i]=line; } stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); } private function onEnterFrame(evt:Event):void { var mx:int = stage.mouseX ; var my:int = stage.mouseY ; var x:int; var y:int; for(y=0;y<ch;y++){ for(x=0;x<cw;x++){ lines[y*cw+x].graphics.clear(); lines[y*cw+x].graphics.lineStyle(1,0x000000); lines[y*cw+x].graphics.moveTo(x*10,y*10); lines[y*cw+x].graphics.lineTo(mx,my); } } } } }
2の場合
package { import flash.display.*; import flash.events.*; import flash.utils.*; public class linetest2 extends Sprite { private var line:Shape; private var cw:int = 80; private var ch:int = 30; public function linetest2() { var i:int; line = new Shape; addChild(line); stage.addEventListener(Event.ENTER_FRAME,onEnterFrame); } private function onEnterFrame(evt:Event):void { var mx:int = stage.mouseX ; var my:int = stage.mouseY ; var x:int; var y:int; line.graphics.clear(); for(y=0;y<ch;y++){ for(x=0;x<cw;x++){ line.graphics.lineStyle(1,0x000000); line.graphics.moveTo(x*10,y*10); line.graphics.lineTo(mx,my); } } } } }
2が速い。
やはり複数のスプライトを用意するより、1回の描画でスプライトに全ラインを描画したほうが速かった。
まあ、冷静に考えればかかってる描画コストが同じなら描画対象切り替える時間がかかる方が重いから当然なんだけど、一応ね・・・