문제

내 웹사이트는 전적으로 플래시 기반이며 FLV 파일로 변환한 비디오 덩어리로 나에게 제공된 3D 모델을 중심으로 움직입니다.내 프로그램 내에서 비디오를 제어하기 위해 FLVPlayback 구성 요소를 사용하고 있습니다.System.totalMemory를 사용하여 메모리 검사를 실행하는 동안 비디오가 로드될 때마다 메모리 덩어리를 소모하고 비디오에서 모든 이벤트 리스너를 제거하더라도(모두 약하게 참조됨) 구성 요소를 제거하는 것을 발견했습니다. 해당 부모의 경우 비디오를 중지하고 구성 요소 인스턴스를 null로 설정해도 해당 메모리는 여전히 반환되지 않습니다.

사용자가 잠재적으로 인스턴스화하고 로드할 수 있는 엄청난 양의 비디오 때문에 이 프로젝트 작업을 시작한 이후로 이것이 나를 괴롭혔습니다.현재 모든 비디오는 필요할 때마다 새 FLVPlayback 인스턴스에 로드되지만 이 문제를 해결하는 가장 좋은 방법은 단순히 전역 FLVPlayback 인스턴스를 갖고 새 비디오를 이전 인스턴스로 다시 로드하는 것입니다. 응용 프로그램 메모리에는 FLVPlayback 구성 요소가 하나만 있습니다.

다른 사람도 이 문제에 직면했습니까?새로운 비디오마다 재사용하는 글로벌 인스턴스를 사용하는 것보다 더 나은 솔루션을 찾았습니까?

도움이 되었습니까?

해결책

불행하게도 Flash가 소멸자와 명시적 객체 삭제를 추가하기 전까지는 메모리 문제를 크게 해결할 수 없습니다.이 스레드를 참조하세요:

Actionscript 3에서 ByteArray 언로드

Flash 애플릿이 사용할 수 있는 메모리 양에는 제한이 있습니다.GC는 해당 한계에 도달하면 실행되는 것 같습니다.나는 메모리가 쉬운 애플릿이 몇 시간 동안 실행되고 GC가 시작되기를 원하지 않기 때문에 최대 200MB를 사용하는 것을 보았습니다.

아, 그리고 단일 인스턴스를 사용하는 것도 우아한 솔루션이라고 생각하지 않습니다.현재 저는 사용자 정의 클래스에 대한 dispose() 함수를 작성하고 있으며 언젠가 적절한 소멸자로 바뀔 수 있을 때를 기다리고 있습니다.

다른 팁

나는 구성 요소를 별로 좋아하지 않았으며 약간 이상했습니다.이 특정 문제는 일반적인 것으로 보이며 다소 성가신 해결책은 제안한 대로 FLVPlayback을 하나만 사용하고 이를 재사용하는 것입니다.

이에 대한 블로그 게시물은 다음과 같습니다.

응답해 주셔서 감사합니다. 다른 블로그 질문에 대한 링크도 도움이 되었습니다. Grant Skinner의 가비지 수집 정보도 모두 읽었지만 해당 링크를 검색하고 돌아가서 그가 원래 GC에 대해 말한 내용을 다시 읽는 것이 도움이 되었습니다. 오래된 노긴을 새로 고치세요.단일 FLVPlayback 구성 요소를 null로 만들고 다시 인스턴스화하는 것 외에도 Loader 인스턴스를 올바르게 언로드하고 삭제하지 않는다는 사실을 깨닫고 이를 정리하여 이제 프로그램이 훨씬 더 효율적으로 실행되고 있습니다.사이트의 메모리 사용량이 약 90% 향상되었다고 말할 수 있습니다.

@aib 단일 인스턴스 솔루션이 우아하지 않다는 점은 인정합니다. 하지만 플래시에서는 FLV 파일을 그대로 유지하지 못하기 때문에 계속해서 사용하고 있습니다.

@grapefrukt 저는 플래시 구성 요소를 싫어합니다. 플래시 구성 요소는 일반적으로 시간 절약보다 더 많은 슬픔을 야기합니다. 하지만 이 경우에는 비디오 파일과 관련된 큐 포인트와 탐색 작업이 많았고 FLVPlayback 구성 요소가 제가 찾은 최고의 솔루션이었습니다.물론 저는 아직 액션스크립트 세계에 익숙하지 않아서 뭔가를 간과했을 수도 있습니다.

또한 귀하의 답변이 모두 도움이 되었기 때문에 두 답변을 모두 찬성하는 평판을 얻었으면 좋겠습니다.세스트 라 비

많은 테스트 후에 제가 수집한 바에 따르면 플래시는 필요에 따라 라이브러리와 구성 요소에 동적으로 로드되지만 해당 데이터를 가비지 수집하지는 않습니다.예를 들어 FLVPlayback 구성 요소를 사용하는 웹 사이트나 Air 앱이 있는 경우 새 FLVPlayback() 인스턴스가 생성될 때까지 이와 관련된 실제 구성 요소 및 라이브러리가 로드되지 않습니다.그러면 라이브러리와 구성 요소가 메모리에 로드되지만 프로그램/웹 사이트가 닫힐 때까지 해당 공간을 다시 얻을 수 없습니다.내부에 비디오가 포함된 특정 인스턴스는 가비지 수집을 수행하며 리스너를 제거하고 스테이지에서 꺼내어 null로 설정하는 한 일부 메모리를 해제합니다.

또한 개별 비디오를 제작하는 경우 VideoPlayer는 훨씬 가볍고 정리가 더 좋습니다.

불행하게도 이것이 바로 플래시가 처리하는 방식입니다.특별히 똑똑하지는 않지만 대부분의 사람들에게 효과적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top