rust-sdl2를 사용하여 wasm을 생성 할 때 음악 파일 관련 tips

tl;dr;



  • emscripten-ports의 sdl2 문제로 음악 파일을 로드할 수 없음
  • Music::from_static_bytes 등을 사용하여 WebAssembly (wasm)에 미리 읽어 두면 움직인다
  • C, C++ 바인딩의 rust 라이브러리를 사용하는 경우 emscripten을 사용해야 할 수 없다고 생각된다

  • 소개



     mac상의 환경을 파괴했기 때문에 docker상에 재구축하는 날개가 되어 있는 r-chaser53입니다. 솔직히 거의 진행되지 않았기 때문에 rust-sdl2 를 사용한 앱을 wasm으로 변환했을 때의 tips를 쓰려고 합니다(※1).

    억지로 음악파일을 불러오기



    'rust-sdl2로 임의의 path의 음악 파일을 로드하고 싶은 경우, 다음과 같이 됩니다.
    sdl2::mixer::Music::from_file(path).unwrap();
    

    본래라면 변수 path로부터 메타데이터를 생성해 SDL.rwops라고 하는 오브젝트에 격납하는 것 같습니다만, 중요한 SDL.rwops 오브젝트는 [null]이라고 최초로 선언했을 때 그대로입니다. 값이 대입되어 있지 않습니다(※2). 그대로 실행하면 null의 rwops 오브젝트의 filename을 참조하려고 해 처리가 진행되지 않습니다. 다음과 같은 해킹으로 움직일 수 있었지만 솔직히 미묘한 곳입니다. 원래 파일을 읽어들이는 것 자체에 문제가 있을까 생각했습니다만, 맵을 읽게 하는 처리 자체는 문제 없게 움직이고 있습니다. 아마도 문제가 없을 것입니다.
    Module['preRun'] = function () {
      FS.createPreloadedFile(
        '/',
        'filepath',
        '/filepath',
        true, false);
      SDL.rwops = [{ filename: 'filepath'}];
    }
    

    미리 읽어 보자



    rust-sdl2는 다음과 같이 컴파일시에 음악 데이터를 받아 버리는 method도 제공하고 있습니다.
    sdl2::mixer::Music::from_static_bytes(include_bytes!("filepath"));
    

    이쪽은 문제없이 읽어 주는 것 같습니다. 컴파일 후에 파일을 지정할 수 없고, 음악 파일만큼 파일이 커져 버리는 것도 좋지 않습니다. 그러나 여러 음악 파일을 읽을 수 있다면 위의 해킹은 매우 유지할 수 없을 것입니다. 포기하고 이쪽을 사용하는 것이 타당한 것이 아닐까요.

    emscripten과 rust와 c, c++ 바인딩



     진척 안돼입니다. 리포지토리는 입니다.

      「러스트로 팩맨풍의 게임을 만들어 보았다」의 gif와 비교하면 알지만 원이 아니고 구형으로 되어 있습니다. 이유로는 sdl2-gfx라는 원 등을 그려주는 라이브러리를 emscripten이 지원하지 않기 때문입니다. c나 c++ 라이브러리를 사용한 rust 앱에서 wasm을 만들 때 대상 c나 c++ 라이브러리가 있는지 emscripten ports를 참조하지만 이번에 사용하고 싶은 sdl2-gfx가 없습니다. 자력으로 sdl2-gfx를 wasm상에서 움직일 수 있도록 여러가지 조사하고 있습니다만, 필요한 지식이 많이 언제까지 걸릴까 하는 상황입니다. 이 근처에 대해서는 "러스트에서 wasm을 생성해 본 이야기" 근처를 봐 주시면 기쁩니다.
    선택지의 하나로서 emscripten을 사용하지 않는 「wasm32-unknown-unknown」도 생각했습니다만, c나 c++의 바인딩을 고려해 주지 않는 것 같습니다(※3). 개발을 할 때 c나 c++의 자산을 사용하고 싶은 경우는 적지 않다고 생각됩니다. 약간 emscripten에서 도망치고 싶은 기분도 있습니다만, 현재 wasm을 작성하려고 하는 한 emscripten에서는 도망갈 수 없는 것일까라는 것이 개인의 감상입니다.

    비고



    ※1 2017/12/17 rust-sdl2 version 0.31 현재
    ※2 소스를 쫓아 보면 「throw 'Mix_QuerySpec: TODO'」라든가 써 있어 「그런가…」라고 됩니다
    ※3 조사 부족으로 설정이나 작성 방법에 따라서는 「wasm32-unknown-unknown」에서도 c, c++ 바인딩의 wasm을 생성할 수 있으면 좋겠다고 솔직히 생각하고 있습니다

    좋은 웹페이지 즐겨찾기