BitmapData의 getPixel과 setPixel대신
ByteArray를 이용하면
어느정도 속도를 높일 수 있을까 시험해 봤습니다.
해당 좌표의 color 를 얻어오는 getPixel 메소드 테스트 입니다.
var t:uint;
function start(){
t=getTimer()
}
function result(){
trace((getTimer()-t)+" millisecond")
}
var xx,yy,i
var w:uint=stage.stageWidth
var h:uint=stage.stageHeight
var bitmap:BitmapData=new BitmapData(w,h)
bitmap.draw(img)
var data:ByteArray=new ByteArray()
addChild(new Bitmap(bitmap))
img.visible=false//getPixel32
start()
for(i=0;i<100;i++){
for(yy=0;yy<h;yy++){
for(xx=0;xx<w;xx++){
bitmap.getPixel32(xx,yy)
}
}
}
result()
//3546 millisecond//readUnsignedInt
data=bitmap.getPixels(bitmap.rect)
start()
for(i=0;i<100;i++){
data.position=0
for(yy=0;yy<h;yy++){
for(xx=0;xx<w;xx++){
data.readUnsignedInt()
}
}
}
result()
//2713 millisecond
해당 좌표의 color 를 할당하는 setPixel 메소드 테스트 입니다.
var t:uint;
function start(){
t=getTimer()
}
function result(){
trace((getTimer()-t)+" millisecond")
}
var xx,yy,i
var w:uint=stage.stageWidth
var h:uint=stage.stageHeight
var bitmap:BitmapData=new BitmapData(w,h)
var data:ByteArray=new ByteArray()
addChild(new Bitmap(bitmap))//setPixel32
start()
for(i=0;i<100;i++){
for(yy=0;yy<h;yy++){
for(xx=0;xx<w;xx++){
bitmap.setPixel32(xx,yy,uint(Math.random()*0xffffffff))
}
}
}
result()
//11056 millisecond//writeUnsignedInt & setPixels
start()
for(i=0;i<100;i++){
for(yy=0;yy<h;yy++){
for(xx=0;xx<w;xx++){
data.writeUnsignedInt(uint(Math.random()*0xffffffff))
}
}
data.position=0
bitmap.setPixels(bitmap.rect,data)
}
result()
//10314 millisecond//writeUnsignedInt
start()
for(i=0;i<100;i++){
data.position=0
for(yy=0;yy<h;yy++){
for(xx=0;xx<w;xx++){
data.writeUnsignedInt(uint(Math.random()*0xffffffff))
}
}
}
data.position=0
bitmap.setPixels(bitmap.rect,data)
result()
//9150 millisecond
※스크립트 실행 제한시간인 15초를 벗어나 주석처리하며 하나씩 테스트하였음
결론
읽기는 24%
쓰기는 18%
속도가 향상되었습니다.
기능은 제한적이지만 비트맵 한픽셀씩 전체적으로 무언가를 연산할때
예로들면 한 픽셀을 파티클처럼 객체로 다룰때 속도향상에 도움될 것 같습니다.