게임 개발 포에버 : : 게임 개발 포에버 ( 6 Page ) 
 게임 사운드 , 매번 발생 하 는 오류 정리 # 1 
 사운드 2015 . 1 . 6 . 18 : 09 
 Posted by 낄 님 
 안녕 하 세요 . 오래간만 에 돌아온 낄 님 입니다 . 
 근 2 년 간 글 을 올리 지 못했 는데 , 현실 의 아바타 를 본래 캐릭터 를 포함 해서 부 가 캐릭터 까지 키우 느라 복귀 가 늦 어 졌 습니다 . ( _ _) 
 딸 , 아들 을 둔 아빠 가 되 었 습니다 . 
 한국 에 mmorpg 가 부흥기 부터 지금 까지 10 년 의 세월 이 흘렀 는데요 
 스마트폰 게임 이 주류 가 되 면서 사운드 는 그동안 조금 소홀 했었 던 점 이 있 었 으나 
 다시 좋 은 게임 들 과 높 은 사운드 경험 을 요구 하 는 개발 사 들 이 많 아 져서 사운드 가 좀 더 힘 을 보탤 수 있 는 환경 이 되 었 습니다 . 
 많 은 관계자 분 들 과 사운드 연출 과 제작 에 관한 이야기 를 나누 고 싶 습니다 . : ) 
 이번 에 는 그동안 제작 해 오 면서 , 기술 적 으로 문제 가 발생 한 경우 들 에 대해 풀 어 보 려 합니다 . . 
 다행 이 커뮤니케이션 문제 가 아니 여서 해답 을 찾 는 게 상대 적 으로 쉽 습니다 . 
 다만 시간 이 많이 들어가 게 되 고 , 정확 한 원인 을 파악 하 는 데 까지 버리 는 시간 을 생각 하 면 지난 젊음 이 참 아깝 네요 . 
 비긴 어게인 의 LOST STARS 의 가사 가 생각나 는 하루 입니다 
 신 이 시 여 , 우리 에게 어린 날 이 어린 날 의 낭비 인 이유 를 말 해줘요 
 여자 와 문제 해결 을 했었 다면 더 유익 한 ( ? ) 시간 을 보냈 을 텐데 . ... 라고 하 면 이제 집 에서 OUT 되 는 사태 가 ( 흑흑 ) 
 그래서 젊음 을 이성 과 함께 유익 하 게 보낼 수 있 도록 
 삽질 을 예방 하 는 글 을 적 었 습니다 . 
 부제 # 1 
 어째서 그 들 은 고통 받 는가 ? - 소리 가 튀 면 튄다고 왜 말 을 못 해 ! 
 사운드 제작 의 대부분 은 영상 이 나오 고 나 서 제작 이 들어가 게 됩니다 . 
 따라서 영상 이 제작 되 기 전 까진 사운드 는 놀 아도 됩니다 ( ? ) 가 아니 라 , 
 기획 이나 영상 이 제작 될 때 , 참여 하 여 어떤 방향 으로 진행 이 될 지 미리 파악 해 두 는 것 도 좋 고 , 
 사운드 재생 에 문제 가 발생 할 소지 들 을 미연 에 방지 해 주 는 게 좋 습니다 . 
 그럼 . 이제 영상 이 나왔 습니다 . 
 굉장히 짧 고 , 엄청난 반복 을 하 는데 , 루프 포인트 를 잡 기 가 모호 합니다 . 
 그래서 기획 팀 에 문의 해 보 니 제작 도구 에서 찍 은 건데 , 플레이 하 면 계속 반복 되 는지라 이렇게 찍혔 다고 하 네요 . 
 마르 지 않 는 눈물 입니다 . ( 게임 영상 을 올리 자니 보안 상 … . ) 
 이런 영상 인 경우 엔 , 타임 라인 이 밑 에 있 어서 ' 초 ' 또는 ' 프레임 ' 정보 가 적히 도록 제작 도구 를 고쳐 주 시 는 게 현명 합니다 . 
 어렵 다면 , 이 영상 의 프레임 정보 와 시작 위치 를 확인 할 수 있 도록 영상 을 찍 어 주 시 는 게 좋 겠 네요 . 
 하지만 사운드 는 언젠가 제작 도구 에 심 게 되 는데 , 이런 상황 이 라면 감 으로 심 는 방법 뿐 이 어서 , 
 도구 를 개선 하 는 게 필수 적 입니다 . 
 어쨌든 저 짧 은 영상 에 맞춰서 사운 들 을 제작 했 고 적용 했 습니다 . 
 그런데 어느 날 확인 해 보 니 , 소리 가 반복 되 는 지점 에서 ' 툭 ' 튀 는 현상 이 발생 했 습니다 . 
 분명 사운드 자체 는 루프 포인트 를 잘 잡 아서 흔히 ' 튀 지 않 게 ' 제작 을 했는데도 , 게임 에 넣 은 것 은 이상 하 게 튑니다 . 
 ' 뭐 지 , 나 의 존재 가 왜 이리 가볍 게 느껴 지 는가 . ...' 
 팀원 들 의 눈빛 이 루프 하나 못 잡 는 잉여 인력 으로 보여 지 는 것 같 고 왠지 해결 못 하 면 이 자리 를 떠야 할 것 같 네요 . 
 흔한 오류 인데 , 
 다음 과 같 은 상황 중 의 하나 일 가능 성 이 높 습니다 . 
 1 . 영상 을 찍 어 준 프레임 과 실제 게임 에서 구동 되 는 프레임 이 다르 다 . 
 2 . 사운드 포맷 이 WAV 나 GOG 가 아닌 MP 3 다 . 
 3 . 영상 의 길이 가 나중 에 수정 되 어서 좀 더 길 어 졌 거나 짧아졌 다 . 
 4 . 사운드 재생 설정 이 루프 가 아니 라 , 원샷 을 계속 시작 지점 에서 PLAY 를 하 고 있 었 다 . 
 5 . 사운드 칩셋 이나 메인보드 에 문제 가 있 었 다 ( ...) 
 네 . 무척 어처구니없 는 상황 이 아닐 수 없 습니다 . 
 제작 과 관련 한 문제 는 하등 없 었 고요 . 대부분 의 사운드 오류 는 디자인 과정 에서 발생 하 는 것 보다 , 실 구현 에서 생기 는데 
 그동안 가장 황당 한 오류 는 - 메인보드 업데이트 였 습니다 . 
 누구 도 예상 하 지 못한 문제 였 는데 , 이렇게 적 고 보 니 그동안 의 헤딩 이 여기 에서 빛 을 발하 려나요 … . 
 # 좀 더 구체 적 인 해결 방법 
 답 1 : 영상 을 찍 어 준 담당자 의 PC 가 너무 느리 거나 , 코덱 의 문제 가 크 다 . 가능 하 면 MOV 포맷 으로 영상 을 준비 하 도록 하 는 게 좋 다 . ( 요즘 엔 이런 문제 는 거의 없 죠 ) 
 답 2 : MP 3 는 재생 시점 에 코덱 정보 를 읽 어 드리 면서 지연 시간 이 발생 함 ( 즉시 재생 이 필요 하 거나 루프 가 필요 하 다면 WAV , 나 GOG 를 활용 ) 
 답 3 : 영상 이 수정 되 면 , 바뀌 었 다고 사운드 쪽 에 이야기 좀 … … . ( 내부 팀 인데 도 얘기 를 안 해 주 면 혼나 야 함 ) 
 답 4 : 플레이 방식 을 루프 로 재 설정 
 답 5 : 메인보드 업데이트 ( ..) 
 진정 별것 아닌 상황 으로 고통 받 는 사운드 분 들 에게 힘 이 되 었 으면 합니다 . 
 대부분 구현 과 관련 된 부분 에서 발생 하 는 문제 들 은 미연 에 방지 가 가능 합니다 . 
 영상 이 바뀌 든 말 든 사운드 는 튀 지 말 아야 하 고 , 
 프로파일링 을 통해서 사운드 오류 가 있 는 부분 을 제작 도구 에서 확인 을 할 수 있 다면 모두 가 행복 하 겠 죠 
 우리 스스로 가 오디오 프로그래밍 을 직접 하 지 않 는 이상 , 꾸준 한 치킨 상납 으로 유능 한 프로그래머 님 을 모시 고 있 는 게 좋 습니다 . 
 다음 은 거리 에 따른 사운드 조율 이 이상 할 때 발생 하 는 문제 들 에 대해 이야기 하 겠 습니다 . 
 # 새해 복 많이 받 으세요 ~~ 
 BY EIM 낄 님 
 ' 사운드 ' 카테고리 의 다른 글 
 게임 사운드 , 매번 발생 하 는 오류 정리 # 1 ( 0 ) 
 게임 에서 사운드 ( 오디오 ) 디렉터 는 어떤 일 을 하 는가 ? # 4 ( 0 ) 
 게임 에서 사운드 ( 오디오 ) 디렉터 는 어떤 일 을 하 는가 ? # 3 ( 3 ) 
 게임 에서 사운드 ( 오디오 ) 디렉터 는 어떤 일 을 하 는가 ? # 2 ( 9 ) 
 게임 에서 사운드 ( 오디오 ) 디렉터 는 어떤 일 을 하 는가 ? # 1 ( 13 ) 
 sort 와 stable _ sort 
 프로그래밍 2014 . 12 . 25 . 18 : 58 
 최근 sort 와 stable _ sort 를 써볼 일 이 있 어서 포스팅 해 봅니다 . 일반 적 으로 sort 알고리즘 을 자주 쓰 는데 , stable _ sort 라는 것 도 있 더군요 . MSDN 에 나와 있 는 stable _ sort 의 특징 으로 는 아래 와 같 습니다 . 
 복잡도 에 따라 많 은 양 의 메모리 를 필요 로 한다 
 최적 의 상황 ( 충분 한 메모리 / 정렬 된 원소 ) 에서 는 O ( N log N ) 의 성능 을 보여준다 
 그렇 지 못한 경우 에 는 O ( N ( log N ) 2 ) 의 성능 을 보여준다 
 일반 적 인 경우 sort 가 더 빠르 다 
 정렬 후 동일 값 의 원소 순서 를 보장 해준다 
 sort 와 stable _ sort 를 벤치마크 한 결과 를 보 더라도 sort 가 더 빠르 다는 것 을 알 수 있 습니다 . 그렇 다면 stable _ sort 는 언제 쓰 는 걸까요 ? sort 와 stable _ sort 의 큰 차이점 은 바로 같 은 원소 값 의 순서 를 보장 해 주 냐 안 해 주 냐 에 있 습니다 . 이게 무슨 말 이 냐면 설명 보다 아래 코드 의 결과 값 을 보 시 면 어떤 차이 인지 바로 알 수 있 습니다 . 
 void PrintFoo ( ) 
 void PrintVector ( const vector < CFoo *> & vec ) 
 for ( auto it : vec ) 
 new CFoo ( 3 , " "), new CFoo ( 3 , " ") , new CFoo ( 4 , " "), new CFoo ( 2 , " ") 
 , new CFoo ( 6 , " "), new CFoo ( 3 , " ") , new CFoo ( 5 , " "), new CFoo ( 4 , " ") 
 , new CFoo ( 2 , " "), new CFoo ( 2 , " ") , new CFoo ( 6 , " "), new CFoo ( 3 , " ") 
 , new CFoo ( 5 , " "), new CFoo ( 4 , " ") , new CFoo ( 2 , " "), new CFoo ( 6 , " ") 
 , new CFoo ( 3 , " "), new CFoo ( 5 , " ") , new CFoo ( 1 , " A "), new CFoo ( 1 , " B ") 
 , new CFoo ( 1 , " C "), new CFoo ( 1 , " D ") , new CFoo ( 1 , " E "), new CFoo ( 1 , " F ") 
 , new CFoo ( 1 , " G "), new CFoo ( 1 , " H ") , new CFoo ( 1 , " I "), new CFoo ( 1 , " J ") 
 , new CFoo ( 4 , " "), new CFoo ( 2 , " ") , new CFoo ( 6 , " "), new CFoo ( 3 , " ") 
 , new CFoo ( 3 , " "), new CFoo ( 5 , " ") , new CFoo ( 4 , " "), new CFoo ( 2 , " ") 
 , new CFoo ( 2 , " "), new CFoo ( 6 , " ") , new CFoo ( 3 , " "), new CFoo ( 5 , " ") 
 , new CFoo ( 4 , " "), new CFoo ( 2 , " ") 
 if ( lhs -> GetNum ( ) > rhs -> GetNum ( ) ) 
 sort 로 정렬 된 값 을 보 시 면 같 은 1 의 값 을 갖 고 있 는 알파벳 순서 가 뒤바뀐 것 을 확인 할 수 있 습니다 . 그 에 반해 stable _ sort 는 알파벳 순서 가 변하 지 않 은 것 을 확인 할 수 있 습니다 . 
 http : / / msdn . microsoft . com / ko - kr / library / z 02 ba 27 t . aspx 
 https : / / solarianprogrammer . com / 2012 / 10 / 24 / cpp - 11 - sort - benchmark / 
 http : / / ohyecloudy . com / pnotes / archives / 294 / 
 http : / / www . soen . kr / lecture / ccpp / cpp 4 / 42 - 3 - 1 . htm 
 TAG c ++, STL , 친절 한 티스 
 C # ASP . NET MVC 4 핫 링크 방지 ( Hotlink Protection ) 
 프로그래밍 2014 . 6 . 15 . 14 : 50 
 웹 서버 구축 시 골치 거리 중 하나 가 바로 핫 링크 ( Hotlink ) 입니다 . 이미지 나 동영상 같 은 미디어 파일 의 링크 를 따 서 외부 사이트 에 걸 어 놓 는 거 죠 . 이 로 인해 엄청난 양 의 불 필요 한 트래픽 이 발생 할 수 있 습니다 . MVC 4 에서 는 web . config 수정 을 통해 이 를 방지 할 수 있 습니다 . 
 방법 은 간단 합니다 . web . config 파일 에 아래 의 rule 을 추가 해 주 면 , 해당 url 에서 오 는 요청 이 아닌 것 들 은 rewrite 에 지정 된 이미지 로 교체 해서 전송 됩니다 . 이 이미지 는 저 용량 의 불 펌 금지 ! !! 같 은 이미지 로 설정 해 두 면 좋 겠 죠 . 
 // mydomain 에서 오 는 요청 이 아닌 것 은 noimage . jpg 로 전송 
 TAG ASP . NET , MVC 4 , 친절 한 티스 
 손님 2015 . 02 . 27 15 : 29 댓글 주소 수정 / 삭제 댓글 쓰 기 
 C # Mock 을 이용 한 테스트 환경 조성 
 프로그래밍 2014 . 5 . 18 . 13 : 50 
 아래 와 같이 DB 에서 학생 의 성적 들 을 얻 어 와 점수 의 평균 을 구하 여 출력 하 는 로직 이 있 습니다 . 
 / / 학생 성적 모델 
 public class StudentResult 
 / / 학생 성적 DB 컨텍스트 
 / / DB 에서 학생 들 의 성적 을 얻 어 와 평균 을 구합니다 . 
 public float GetStudentAvr ( ) 
 foreach ( var student in cont . StudentResultTable ) 
 이제 이 로직 을 테스트 해 보 겠 습니다 . 
 public void GetStudentAvrTest ( ) 
 간단 한 테스트 로직 입니다 . 하지만 예상 한 대로 기대 값 을 주 어도 위 테스트 는 실패 하 게 됩니다 . 왜냐하면 테스트 환경 에서 는 실제 DB 가 갖춰져 있 지 않 기 때문 이 죠 . 실제 DB 에 접속 을 할 수 없 으니 School 클래스 에서 사용 하 고 있 는 StudenDBContext 객체 에 예외 상황 이 발생 하 게 됩니다 . 
 그렇 다면 위 와 같이 DB 를 사용 하 는 로직 은 테스트 를 못 하 는 것 인가 ? 아닙니다 . 바로 Mock 을 이용 하 면 됩니다 . Mock 이 란 단어 그대로 실제 그것 인 것 마냥 흉내 를 내주 는 장치 입니다 . 이 를 이용 하 면 실제 DB 에 접속 해서 데이터 를 가져오 는 것 처럼 흉내 를 낼 수 있 습니다 . 
 먼저 Mock 을 사용 하 기 위해서 는 해당 라이브러리 를 설치 하 여야 합니다 . 저 는 많이 애용 되 고 있 다는 Moq 4 라이브러리 를 설치 하 였 습니다 . 
 도구 - 라이브러리 패키지 관리자 - 솔루션 용 NuGet 패키지 관리 를 통해 Moq 을 설치 합니다 . 
 이제 Mock 을 이용 해 진짜 DB 를 사용 하 는 듯 하 게 해 줄 모형 을 만들 어 보 겠 습니다 . 먼저 아래 와 같이 인터페이스 를 하나 만듭니다 . 기존 에 는 직접 DBContext 를 다뤘 지만 , 앞 으로 만들 Mock 을 사용 하 기 위해서 는 약간 의 추상화 가 필요 합니다 . 
 public interface I S tudentDBContextController 
 다음 , 실제 로직 에서 직접 DBContext 를 사용 하 던 부분 을 인터페이스 를 이용 하 도록 아래 와 같이 수정 하 여 줍니다 . 
 / / 인터페이스 구현 
 public class S tudentDBContextController : I S tudentDBContextController 
 public int GetStudentsCount ( ) 
 public IQueryable < studentresult > GetStudentResultsAll ( ) 
 / / 인터페이스 를 사용 한 변경 된 School 클래스 
 public School ( ) : this ( new S tudentDBContextController ( ) ) 
 public School ( I S tudentDBContextController n e w S tudentDBContextController ) 
 foreach ( var student in studentResultTable ) 
 실제 코드 부분 은 이걸로 됐 습니다 . 다음 테스트 코드 를 보 겠 습니다 . 위 에서 만드 는 I S tudentDBContextController 의 Mock 을 만들 어 인터페이스 를 함수 를 호출 했 을 때 실제 DB 에서 값 을 얻 어 오 는 것 처럼 셋 팅 을 해 줍니다 . 
 // Mock 함수 셋 업 
 / / Mock 객체 로 사용 하 도록 수정 
 아래 GetStudentAvrTest 를 살펴 보 시 면 School 객체 생성자 초기 값 을 Mock 객체 로 넘겨 주 고 있 습니다 . 이 를 통해 GetStudentAvr 로직 에서 Mock 에 셋 팅 된 함수 값 을 리턴 받 게 되 고 , 실제 DB 에 접속 된 듯 한 환경 을 조성 할 수 있 게 됩니다 . 이 로서 해당 로직 이 제대로 값 을 계산 하 는지 테스트 할 수 있 게 되 었 습니다 . 
 참조 : https : / / github . com / Moq / moq 4 / wiki / Quickstart 
 TAG C #, 단위 테스트 , 친절 한 티스 
 봄 소풍 2014 . 05 . 20 09 : 19 댓글 주소 수정 / 삭제 댓글 쓰 기 
 Unity 때문 에 NUnit 과 NSubstitute 사용 하 는데 
 이것 도 가독성 좋 아 보여서 좋 네요 . 
 2014 . 05 . 22 01 : 00 댓글 주소 수정 / 삭제 댓글 쓰 기 
 [ KGC 13 ] 쿠 킹 스타 제작 사례 로 보 는 cocos 2 d - x 소개 
 프로그래밍 2014 . 3 . 5 . 04 : 39 
 KGC 13 에서 발표 했 던 쿠 킹 스타 제작 사례 로 보 는 cocos 2 d - x 소개 자료 입니다 . 한참 지난 건데 게 데포 에 는 안 올려 뒀 더군요 ㅋ 뒷 북 이 지만 살포시 올려 둡니다 . 
 Introduce coco 2 dx with cookingstar from ozlael ozlael 
 TAG cocos 2 D , ozlael , 오즈 라엘 , 쿠 킹 스타