2013-08-29 1 views
0
FMOD::EventSystem  *EventSystem = 0; 
FMOD::System   *System; 
FMOD::EventProject  *Project; 
FMOD::Event    *pEvent; 
FMOD::Sound    *Sound; 
FMOD_RESULT    result = FMOD_OK; 

if(!FEV || !FSB) 
    return 0; 

result = FMOD::EventSystem_Create(&EventSystem); 
    if(result != FMOD_OK) 
     return 1; 
EventSystem->getSystemObject(&System); 

result = EventSystem->init(maxChannels, FMOD_INIT_NORMAL, 0, FMOD_EVENT_INIT_NORMAL); 
    if(result != FMOD_OK) 
     return 2; 

FMOD_EVENT_LOADINFO loadinfo; 
memset(&loadinfo, 0, sizeof(FMOD_EVENT_LOADINFO)); 
loadinfo.size = sizeof(FMOD_EVENT_LOADINFO); 
loadinfo.loadfrommemory_length = FEV_len; 

result = EventSystem->load((char*)FEV, &loadinfo, NULL); 
    if(result != FMOD_OK) 
     return 3; 

result = EventSystem->getEvent(Event, FMOD_EVENT_ERROR_ON_DISKACCESS, &pEvent); 
if(result == FMOD_ERR_FILE_UNWANTED) 
{ 
    FMOD_CREATESOUNDEXINFO exinfo = {0}; 
    exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO); 
    exinfo.length = FSB_len; 

    result = System->createSound((const char*)FSB, FMOD_OPENMEMORY, &exinfo, &Sound); 
     if(result != FMOD_OK) 
      return 4; 

    result = EventSystem->preloadFSB(FSB_name, 0, Sound); 

    result = EventSystem->getEvent(Event, FMOD_EVENT_ERROR_ON_DISKACCESS, &pEvent); 
     if(result != FMOD_OK) 
      return 5; 
} 
else if(result != FMOD_OK) 
    return 6; 

for(int a=0; a<LoopsCount; a++) 
{ 
    pEvent->start(); 

    FMOD_EVENT_STATE State = FMOD_EVENT_STATE_PLAYING; 
    while(State == FMOD_EVENT_STATE_PLAYING) 
    { 
     pEvent->getState(&State); 
     result = EventSystem->update(); 
     Sleep(300); 
    } 
} 

EventSystem->unloadFSB(FSB_name, 0); 

Sound->release(); 
EventSystem->release(); 

return 10; 

어떻게 메모리 사용량을 줄일 수 있습니까? 이 코드를 실행하면 166MB의 RAM이 필요합니다. 사운드가 재생 된 후이 메모리가 모두 해제되고 메모리 사용량이 9MB RAM으로 줄어 듭니다. FSB는 40MB를 가지고 있습니다. 답변 주셔서 감사합니다.fmod_event를 사용하여 메모리 사용량을 줄일 수있는 방법

답변

0

나는 그것을보고 있었고 오류를 발견했습니다. Fmod는 자체 복사본을 만들므로 사운드가 재생 될 때마다 메모리를 복제합니다. 이 사용

System->createSound((const char*)FSB, 
    FMOD_SOFTWARE | FMOD_CREATECOMPRESSEDSAMPLE | FMOD_OPENMEMORY_POINT, 
    &exinfo, &Sound); 

을 대신의 :

System->createSound((const char*)FSB, FMOD_OPENMEMORY, &exinfo, &Sound);