2011-12-29 4 views
2

캔버스에 그래픽을 그릴 때 BitmapData.copyPixels()을 사용했습니다 (Bitmap).BitmapData.draw()를 사용하지 않고 BitmapData를 구성하는 픽셀을 빠르게 회전하려면 어떻게해야합니까?

매우 느리기 때문에 draw()을 사용하지 않고 결과 그래픽을 회전해야합니다.

어떻게 대상 그래픽을 회전시킬 수 있습니까? 원점 (점)과 라디안을 기반으로 그래픽을 구성하는 픽셀을 먼저 재구성 할 수있는 공식이나 라이브러리가 있다고 가정합니다.

저는 그러한 논리를 만들 수 없다는 것을 확신합니다. 이렇게하면 알려진 라이브러리가 있다면 정말 멋질 것입니다.

XNA의 SpriteBatch.Draw() 메서드와 비슷한 것을 얻고 싶습니다.이 메서드는 rotation을 5 번째 인수로 사용할 수 있습니다.

+0

그래서. . . 픽셀을 새로운 객체로 복사하기 전에 BitmapData를 회전하려고합니까? 아니면 이후에? 아니면 상관 하나? – iND

+0

@iND 어느 것이 더 빠르든지, 나는 똑같을 것 같은 느낌이 든다. – Marty

+0

copyPixels가 매우 빠른 이유는 행렬 곱셈을 적용 할 필요가 없으므로 변환 결과로 다양한 픽셀 값을 추론 할 필요가 없기 때문입니다. copyPixels는 직접 복사입니다. draw() 메서드는 필요한 작업에 대해 가장 빨리 사용할 수있는 메서드입니다. draw() 메소드의 속도가 느려지는데 어려움을 겪고 있다면 다양한 주어진 회전에서 BitmapData를 미리 그린 다음 가장 가까운 것을 선택하십시오. – alecmce

답변

4

copyPixels은 기본적으로 하나의 BitmapData 개체에서 다른 개체로 메모리 블록을 복사합니다. 픽셀 변환 (예 : 배율, 회전, 전단 등)은 way CPU 집약입니다. 그게 바로 상황이고, 이것을 바꾸는 마법의 방법은 없습니다. 이러한 작업을 수행하는 다른 라이브러리를 찾더라도 순수 ActionScript로 구현해야하며 기본 명령으로 최적화 할 수 없으므로 네이티브 구현보다 더 빠를 것입니다.

씬 (예를 들어, 스프라이트를 더 큰 BitmapData 캔버스로 복사)을 스프라이트하고 많은 스프라이트로 많은 회전을 수행해야하는 경우 가장 좋은 방법은 이산 단계의 렌더링 단계를 렌더링하는 것입니다 BitmapData으로 이동 한 다음 copyPixels을 사용하여 원하는 회전과 가장 가까운 회전을 복사합니다. 그렇게하면 초기화시 느린 draw을 한 번만 사용하고 거기에서 빠른 copyPixels을 사용합니다.

새로운 3D API를 사용하여 회전 된 비트 맵을 그릴 수있는 또 다른 방법이 있습니다. 단순히 성능 저하없이 어느 정도까지 회전하고 크기를 조정하고 이동할 수있는 텍스처 쿼드를 렌더링 할 수 있습니다. 이것은 XNAs draw 구현에 가장 가깝지만 blitting (Bitmap으로 그려야 함)을 완전히 덤프해야합니다.

전체적으로 나는 가장 간단한 방법으로 가서 BitmapData.draw을 사용합니다. 예상되는 최대 동시 sprite를 그리고 테스트하여 성능 영향이 너무 커서 위의 해결 방법을 구현할 가치가 있는지 확인하십시오.

2

매트릭스를 사용합니다. 온라인으로 많은 예제가 있습니다.이 예제는 짧고 요점입니다. http://www.psyked.co.uk/actionscript/rotating-bitmapdata.htm

+0

나는 이것과 비슷한 것을 찾았지만'draw()'를 사용하는데 이는'copyPixels()'보다 상당히 느리다. 'BitmapData'의 인스턴스에서 픽셀을 뒤섞어서 회전시킨 다음 여전히'copyPixels()'를 사용하는 방법이 있습니까? – Marty

0

아이디어를이지만 속도가 검증되지 않은 경우 : 회전 고정하는 경우

  • (예컨대, 매 30도)는 다른 회전과 스프라이트 시트를 만들고 copyPixels()를 사용한다.
  • 비트 맵 데이터를 비트 맵으로 만들고 비트 맵을 다른 그래픽 앞에 회전합니다. 제거/추가 빈도가 자주 발생할 경우 개체 풀을 사용하여 인스턴스화 비용을 피하십시오. cacheAsBitmapMatrix를 사용하면 더 많은 메모리 사용량이 있지만 회전 속도가 빨라집니다.
  • 회전을하는 셰이더 만들기를 살펴보십시오.
  • 비트 맵 데이터를 회전하지 마십시오. . . 세계를 회전 시키십시오.
  • 애니메이션을 정말 느리게 만들어서 아무도 알아 채지 못하게하십시오. 당신이 그걸 가지고 도망 칠 수 있다면 이것은 실제로 좋은 충고입니다. . . 블리 팅 영향이 눈에 띄지 않을 때까지 프레임 속도를 줄이십시오.
관련 문제