Eli의 여백

바쁜 나날들 사이에서 생각났던 이런저런 것들을 적어봅니다.

프로그래밍

BMS구동기 v0.3

Eli♪ 2016. 1. 24. 22:20

결과물 화면

 

 

 

현재까지 완료된 것

  • monogame으로 ogg 재생 안되던 문제를 외부 dll으로 해결
  • 자체 작곡한 샘플 BMS를 넣음 (저작권이 나한테 있으므로 문제될 게 없다.)
  • Garbage collection을 이해
 
다음단계 계획
  • 이제 마음껏 wav ogg mp3를 재생시킬 수 있으니 BMS를 실제로 처음부터 끝까지 시간계산해서 소리나게 하는 것
 
하.. 여기까지 오는데 미친듯한 삽질을 많이 했다.
monogame에서 wav나 ogg를 재생하려면 content.mgcb를 직접 열어서 일일이 wav는 wav importer로, ogg는 mp3 importer를 지정해주고 파일도 수작업 했어야 됐었다. 게다가 이렇게 하면 모든 음원이 xnb라는 자기네 자체 파일형식으로 컴파일이 되는데, 이 컴파일을 명시적으로 하는 게 아니고 그냥 빌드할때 한번 하고 끝이다. 
이말은 즉슨, 다른 사람꺼 쌩 BMS를 받으면 거기에 들어있는 음원 파일을 monogame을 통해서 직접 컴파일해야된다는 것이다. 아예 리소스가 고정된 일반 게임이야 뭐 괜찮을 수도 있지만, BMS를 계속 추가해야 하는 입장에서 음원 컴파일이라니... 심지어 컴파일하는 코드도 따로 없어서 내가 원한다고 해서 런타임중에 불러온 음원을 컴파일할 수 있는 방법도 없다.
그래서 monogame에서 사운드 재생하는 걸 버리고 C#자체에서 소리를 재생할 수 있는 방법을 미친듯이 찾아다녔는데, Direct3D를 쓰라고 하는데가 있어서 코드에 using.System.Direct어쩌고를 쓰니까 import가 안됐다. 뭐 지금이야 dll 넣는법을 알았지만, 이당시에는 답이 없다고 판단하고 검색을 불나게 해서 찾은 게 바로 

여기다.

 

오오오오.... 난 64비트지만 호환성을 위해 32비트짜리로 라이브러리를 받으니까 뭔가 용량이 컸는데 안에 example을 build해보니 ogg가 뙇 나오는 게 아닌가!

!!!!

바로 코드상에서 import한 부분을 찾아보니 VS에 솔루션 탐색기 안에 irrKlang.NET4라는 dll이 들어 있었고, C# 코드에서 바로 갖다쓰고 있었다. 받은 폴더에서 잘 뒤져보니 그런 dll이 있어서 스리슬쩍 내 솔루션의 참조에 추가를 한 뒤 예제(windows form으로 되어있었다)에서 필요한 부분만 딱 빼서 내 코드에 적용했더니

우왕 ogg가 나온당

나중에 쓸지 모르니 미리 복사해놓는 사운드엔진 method모음 링크 (링크)

 

다 좋다고 생각하고 개발을 계속했는데 한가지 문제가 되는게 있었다. 키보드를 누르면 소리가 나게 해놨는데, 연타를 마구 하니까 메모리가 폭증하는 현상을 보였다. 마침 이전에 List때문에 메모리 올라가는걸 free하려고 삽질하다 찾아낸 Garbage collection (C#의 메모리 관리 기능이라고 한다)을 써보니 사운드가 재생중일 때는 메모리 점유가 안떨어졌다. 그리고 사운드 재생이 다 끝나고 가만히 있었더니 메모리가 매우 서서히 떨어졌다. 이 때 garbage를 모아봤더니 메모리가 확 깎이는 게 보였다.

C#에서는 명시적으로 메모리를 free할 수가 없고, garbage collection이 알아서 판단해서 안쓰는 걸 free해준다고 한다. 근데 BMS 구동기처럼 막대한 갯수와 용량의 음원을 자주 로딩하는 것은 메모리를 제때 free안시키면 막장이 되는수가 있다. 일단은 다음단계에서 시제품을 좀 만들어보고 메모리 부분에 대해서 건드려야 되는지 좀 생각해 봐야겠다.

 

이전 글(링크)에도 언급했지만. 이 구동기를 개발하는 목적이 LR2처럼 맨날 터지는 게 아닌 진정한 구동기를 만들겠다는 생각으로 (사실 ruv-it이 있긴한데 내가 개발한 게 아니니까;) 하는거라서 메모리 관리는 엄청 중요하다. 일단 C#의 garbage collection이 메모리에 계속 쓰고 있을 때는 이미 안쓰는 것도 명시적으로 GC.collect()를 한다고 해서 없어지는 게 아니라는 걸 알았기 때문에 이 문제는 다음 버전에서 어떤 방식으로든 결론이 날 것이다.

'프로그래밍' 카테고리의 다른 글

GitLab 설정  (0) 2018.04.07
BMS구동기 v0.4  (4) 2016.02.13
BMS구동기 v0.2  (0) 2016.01.24
BMS구동기 v0.1  (0) 2016.01.24
02. Git 다운로드 및 GitLab과 연동  (0) 2015.09.02