플래시 편집기에서 이미지를 렌더링하는 AIR 앱이 있습니다. 여러 서피스를 사용자화할 수 있습니다 - 모두 동일한 너비와 높이를가집니다. 각 표면은 AIR 응용 프로그램에서 렌더링됩니다.AS3 드로잉 Sprite on BitmapData 메모리 누수
저는 메모리 누출 문제로 고심하고 있습니다.
렌더링해야하는 각 표면마다 많은 구성 요소 (다른 스프라이트 - 일부는 이벤트 리스너, BitmapDatas 및 기타 하위 구성 요소, 스프라이트 등)가 포함 된 스프라이트가 있습니다.
-
(처리 후 렌더링 각각에 대해 새의 BitmapData를 만드는
- ) 및 점 :
내가 쓰레기 수집로 이미의 BitmapData 문제를 알고 있어요, 나는 모두를 테스트 각 렌더링
메모리 누수는 여전히 같은 비율로 발생하고 있습니다.
var bm:BitmapData = new BitmapData(destDim.x, destDim.y, true, bgColor);
var mtx:Matrix = new Matrix();
trace('before drawing :'+(System.privateMemory/1024));
bm.draw(myBigSprite, mtx, null, null, null, true);
trace('after drawing :'+(System.privateMemory/1024));
var result:Bitmap = new Bitmap(bm, PixelSnapping.NEVER, true);
//return result and encode Bitmap to png
result.bitmapData.dispose();
result.bitmapData = null;
result = null;
결과 : 나는 그리기 기능 동작에서 뭔가 빠진 것 같은 기분
before drawing :208364
after drawing :302816
Wrote bitmap to file: surface0.png
before drawing :303296
after drawing :446160
Wrote bitmap to file: surface1.png
before drawing :446160
after drawing :565212
Wrote bitmap to file: surface2.png
before drawing :565924
after drawing :703100
Wrote bitmap to file: surface3.png
before drawing :703572
after drawing :834420
Wrote bitmap to file: surface4.png
여기 내 루프입니다. 그것은 그리기 작업 후에도 지속되는 myBigSprite의 구성 요소 인스턴스를 새로 만든 것처럼 보입니다.
내가 완전히 각 루프의 끝에서 myBigSprite을 파괴하려고, 그것은 아무것도 ....
이이 어떤 힌트를 주시면 감사하겠습니다을 변경하지 않습니다!
당신은 어떻게 알 수 있습니까? 가비지 수집 프로세스가 실행 되었습니까? 당신이 그것을 강요합니까? 또한 sidenote와 마찬가지로 System.gc()를 호출하여 gc를 강제 실행하면 디버그 플레이어에서만 작동합니다. – Patang
그리기 작업의 끝과 다음 작업의 시작 사이의 메모리는 거의 동일하지만 그 사이에 많은 메모리를 소비하는 작업이 있습니다. 특히 비트 맵을 png로 인코딩합니다. 그래서 나는 GC 프로세스가 그 작업을하고 있다고 가정합니다. 그 이유는 내가 원하는 모든 리소스가 그려진 함수를 제외하고는 정리되어 있기 때문입니다. 결코 System.gc()를 명시 적으로 호출하지 않습니다. – Bedu33
bitmapdata에 대한 참조를 보유하고 있으므로 "result"를 null로 설정합니까? – Patang