2012-04-02 2 views
1

그래서 여기에 거래가 있습니다 : 처음에는 지연된 명령을 사용하여 컴퓨터를 정지시키지 않고 wav 파일을 재생 한 다음 wav 파일을 해제하는 것이 정말 섹시한 코드라고 생각했습니다 (프로그램이ocaml sdl 청크 가비지 수집

let rec play_wav file play = 
    Sdlmixer.open_audio ~freq:44100(); 
    let loaded_file = Sdlmixer.loadWAV file in 
    if play = false then 
    Sdlmixer.free_chunk loaded_file 
    else 
    (
     Sdlmixer.play_channel ~loops:1 loaded_file; 
     play_wav file false 
    ) 
;; 

나는 또한 같은 작업을 달성 아마도 더 나은 방법이 말을해야, 그것은 수도 : 및 예) 함수가 호출 될 때, 종료하지, WAV 파일의 기간 동안 물건을합니다 기계 특정 기능 등으로 인해서 만 작동하지만 지금은 다음에 대한 학문적 호기심이 있습니다.

(1) 파일이 두 번로드되고 한 번만 해제되므로 분명히 알려지지 않은 코드가 생성됩니다.

거나 도리어,

WAV 파일이 Sdlmixer.loadWAV 의해 회로드 여부 (2)

하지 할당 된 두 개의 분리 된 메모리 어드레스, mallocs 등 또는 분리 논리 H =이다 (H1 * emp)은 사후 조건입니다. 즉, 한번로드되면 다시로드하는 것은 작동 상 효과가 없으며 한 번만로드하면 몇 번로드되었는지에 관계없이 청크가 해제됩니다.

및 마지막

여부

OCaml의 SDL-라이브러리에 대한 유사한 free_surface C의 기능이 구현되지 않기 때문에 (3)가 Sdlmixer.free_chunk도 필요하다.

아래의 모든에 Valgrind의를 실행하면 메모리 누수를 표시하지 않는 것 :

(가) play_wav 기능을 포함하는 프로그램,

(b)는 덩어리를 확보하지 못하는 기능,

동일한 WAV 파일 1000 번을로드하는 기능을 갖는 연속 부하 플레이 웨이트 free_chunk 코드 블록 (c)

(d).

:

는 (그 약하지만 관계없이 Valgrind의 네 가지 경우에 동일한 메모리 결과를보고 무엇인지 확실하지 않은 사실, 기술적으로, 모든 경우에 그것은 "337 바이트를 4 개 블록에 확실히 손실"상태.) OCaml의 가비지 컬렉터가 프로그램을 종료 할 때 (b) OCaml의 가비지 컬렉터가 처리한다고 상상해보십시오. 따라서 함수가 끝나면 특정 루틴이 끝나고 메모리를 차지하는 것이 끝나면 freeing이 필요하다는 것을 말하기 어렵습니다. 프로그램이 종료되므로 큰 프로그램에서 free chunk 기능을 사용하는 것이 좋습니다.

어쨌든, 사람들의 생각과 의견이 궁금했을뿐입니다.

+0

유럽인들이 잠에서 깨어나 약간의 피드백을 얻을 때까지 기다려야 할 것 같아요.) – mbunit

+0

sdl 바인딩의 구현을보세요 – ygrek

답변

1

라이브러리의 소스 코드를 살펴본 결과, 청크 값은 자동으로 가비지 수집되지 않으므로이를 명시 적으로 해제하거나 직접 처리기를 설정해야합니다 (Gc.finalize 참조).

valgrind가 중요한 문제를보고하지 않는다는 것이 이상한 일입니다.

초기 호출에서 매개 변수 재생이 true이면 코드에서 실제로 샘플을 두 번로드합니다. 함수에서 샘플을 멈추거나 해제하는 데 play 매개 변수를 사용한다는 사실 외에 play 매개 변수가 필요하다고 가정합니다.

아마도 뭔가 같은 :

let play_wav = function 
    true -> (fun file -> 
    Sdlmixer.open_audio ~freq:44100(); 
    let loaded_file = Sdlmixer.loadWAV file in 
    Sdlmixer.play_channel ~loops:1 loaded_file; 
    Sdlmixer.delay 1000; 
    Sdlmixer.free_chunk loaded_file; 
    Sdlmixer.close_audio()) 
    | _ -> (fun _ ->()) 

은 당신의 필요에 맞게 수 있습니다. play_wav의 두 매개 변수를 바꿔서, 컴파일러가 플레이가 틀렸을 때 아무 것도 할 수 없도록 컴파일러에게 더 명확하게 보이도록했습니다. false를 명시 적으로 전달하면 함수가 최적화되어야합니다 (필자는 믿는다). 누락 된 close_audio 호출과 믹서에 샘플 재생 시간을주는 지연을 추가했습니다. 이제 동일한 샘플을 여러 번 재생해야하는 경우 나중에 다시로드하지 않도록 캐시하는 것이 더 재미있을 수 있습니다.

+0

죄송합니다. 3 년이 걸렸습니다. 나는 욕실로가는 길에 길을 잃었다. – mbunit

+0

어쩌면 GPS를 사용하여 길을 찾을 수 있을까요? :) – didierc