2008-08-22 13 views
1

내 웹 사이트는 전적으로 플래시 기반이며, FLV 파일로 변환 한 비디오 덩어리로 제공된 3D 모델을 중심으로 이동합니다. 내 프로그램 내부의 비디오를 제어하기 위해 FLVPlayback 구성 요소를 사용하고 있습니다. System.totalMemory를 사용하여 메모리 검사를 실행하는 동안 비디오가로드 될 때마다 메모리 덩어리가 줄어들고 모든 이벤트 리스너를 약하게 참조하더라도 (모두 약하게 참조 됨) 구성 요소를 제거합니다. 그것의 부모, 비디오를 멈추고 컴포넌트 인스턴스를 null로 만들면 여전히 그 메모리를 돌려주지 않을 것입니다.FLVPlayback 구성 요소 메모리 문제

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

누구도이 문제를 겪었습니까? 새로운 비디오마다 다시 사용하는 글로벌 인스턴스를 사용하는 것보다 나은 솔루션을 찾았습니까?

답변

1

플래시가 소멸자와 명시 적 객체 삭제를 추가 할 때까지는 메모리 문제를 해결할 수 없습니다. 이 스레드를 참조하십시오 :

Unloading a ByteArray in Actionscript 3

메모리 플래시 애플릿이 사용할 수있는 양에 제한이를; 그 한계에 도달하면 GC가 시작됩니다. 나는 내 기억이없는 애플릿이 ~ 200MB 정도를 사용하는 것을 보았습니다. 왜냐하면 단지 몇 시간 동안 실행되어 GC가 실행되기를 원치 않기 때문입니다.

아, 인스턴스도 훌륭한 솔루션입니다. 현재는 커스텀 클래스에 dispose() 함수를 작성하고, 적절한 소멸자로 바뀔 수있는 날을 기다리고 있습니다.

0

불행히도 플래시가 처리하는 방식입니다. 특히 현명한 것은 아니지만 대부분의 사람들에게 적합합니다.

2

저는 컴포넌트를 정말 좋아하지 않았습니다. 이 특정 문제는 일반적으로 보입니다. 다소 귀찮은 해결책은 제안하는대로 하나의 FLVPlayback 만 가지고 다시 사용하는 것입니다. 응답에 대한

Here's a blog post about it

1

덕분에, 다른 블로그 질문에 대한 링크는 물론, 나도 가비지 컬렉션에 그랜트 스키너의 정보를 모두 읽을 수 있지만 그 링크를 통해 검색하고 다시 가서 재었다 도움이되었다 그가 GC에 관해 원래 말했던 것을 읽는 것은 오래된 노자를 리프레시하는 것을 도왔습니다. 단일 FLVPlayback 구성 요소를 nulling 및 다시 인스턴스화하는 것 외에도 로더 인스턴스를 올바르게 언로드 및 제거하지 않아도되므로 정리 된 후 프로그램이 훨씬 효율적으로 실행됩니다. 나는 메모리 사용량이 사이트에서 약 90 % 향상되었다고 말할 것이다.

@aib 필자는 단일 인스턴스 솔루션이 우아하지는 않지만 플래시에서 FLV 파일을 그냥 놓을 수는 없으므로 나는 그것에 매료되어 있다고 생각합니다.

@grapefrukt 플래시 구성 요소를 싫어하기 때문에 일반적으로 저장된 시간보다 슬픔이 더 많이 발생하지만이 경우 비디오 파일과 FLVPlayback 구성 요소에서 진행되는 큐 포인트와 탐색 항목이 많았습니다. 녹이다.물론 나는 여전히 액션 스크립트 세계에 대해 매우 익숙하다. 그래서 나는 아마도 무언가를 과도하게 보았다.

나는 둘 다 도움이 되었기 때문에 나는 둘 다 답변을 upvote하는 평판을 갖고 있었으면한다. ... c'est la vie

1

많은 테스트를 거친 후에 수집 한 내용은 필요에 따라 라이브러리 및 구성 요소에서 플래시가 동적으로로드되지만 가비지는 해당 데이터를 수집하지 않습니다. 예를 들어, FLVPlayback 구성 요소를 사용하는 웹 사이트 또는 Air 응용 프로그램이있는 경우 실제 FLVPlayback() 인스턴스를 만들 때까지 실제 구성 요소 및 라이브러리가로드되지 않습니다. 그런 다음 라이브러리와 구성 요소를 메모리에로드하지만 프로그램/웹 사이트가 닫힐 때까지 공간을 다시 확보하지 못합니다. 그 내부의 비디오를 가지고있는 특정 인스턴스는 청취자를 제거하고 스테이지에서 꺼내어 null로 설정하는 한 가비지 수집 및 메모리 일부를 해제합니다.

또한 개별 비디오 작업을 수행하는 경우 VideoPlayer의 무게가 훨씬 가볍고 멋지게 정리됩니다.