Flash/tech

ByteArray를 이용해 BitmapData 속도 높이기

devmae 2009. 7. 31. 17:46

BitmapDatagetPixelsetPixel대신


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%

속도가 향상되었습니다.


기능은 제한적이지만  비트맵 한픽셀씩 전체적으로 무언가를 연산할때

예로들면 한 픽셀을 파티클처럼 객체로 다룰때 속도향상에 도움될 것 같습니다.