Архив блога: Апрель 2009
Автор: Олег Антипов
Звуковой модуль. Девять кругов ада.
Собственно две последних недели были потрачены не зря. За это время я пришил к движку поддержку звука на основе библиотечки Audiere. И скажу я вам это было весьма не лёгким занятием :) Траблов было не много, а очень много.
Ну для начала после приделывания звуковых эффектов приложения начало самопроизвольно падать во внутренней audiere.dll. Разматывая стек в дебаг-режиме я обнаружил что эти падения связаны с тем, что звуковой буфер самостоятельно может приравняться к NULL. От чего это происходит – понять так и не удалось, проблему же решил просто – при обнаружении NULL звуковой буфер перебиндивается к нужному sound source, тем самым восстанавливая указатель.
Далее я случайно заметил что память у меня подтекает. И сурово так – 1-2 метра на 10 свежедобавленных роботов. Начал гуглить проблему – конечно весь интернет был усеян об течках памяти в аудиере. Решения проблемы не было. И вот когда я уже начал подумывать об смене саунд-движка – я наткнулся на одинокий пост на каком то буржуйском форуме, где какойто умелец пересобрал dll аудиера и вроде как пофиксел проблему с утечками. Я конечно её сразу скачал и начал тестировать – и, о чудо! Эти кошмарные утечки действительно прекратились :)
Но это было только начало мучений. Потом я начал прикручивать Sounds Streams – это новая сущность моего движка, позволяющие эмулировать 3d звук с помощью изменения Volume, Pan и Pitch (сам audiere 3д звук не умеет). Особенность их в том что они ПОСТОЯННО должны менять pitch. И вот тут началась жесть :)
При большом количестве роботов находящихся рядом и синхронно проигрывающие один и тот же саунд мотора – звук в колонках начал трещать. И заметно так, с надрывом. Вот что я тут не делал: и затухатие дальних источников, и интеллектуальное отсечение не важных звуков, и настройки самого звука, всё было бестолку. Решение оказалось простым – я забыл что отключил аппаратное ускорение звука в системе. Всего навсего )
Поставил ускорение на максимум – никаких щелчков и хрипения колонок :)
Но всю эту хитромудрую систему я оставил, всё таки существенно снижает нагрузку на проц.
Вообщем что в итоге за эти две недели:
1) Прикрутил поддержку как управляемых звуков (Sound Streams) так и нет (Sound Effects). Различие между ними в том, что стримы можно контролировать на всём протяжении их работы, а на эффекты после их запуска уже повлиять никак нельзя. Вот такой оптимизейшн.
2) Сделал самопальную поддержку 3D звука.
3) Сделал наконец то Collision Report физики с поддержкой проталкивания информации по всех иерархии объектов от agePhysicsObject до высокоуровневых ageDynObject и ageActor. Это всё надо для того что когда например бочка падает – проигрывался звук падения бочки )
4) Сделал архиудобную систему загрузки и проигрывания звуков - Sound Mapper. (правда надо её будет помониторить в VTunes на предмет оверхеда производительности… но на глаз с фпс пока всё вроде в полном порядке, никаких проседаний не замечено)
Вообще надо сказать API у Audiere весьма приятный. Если бы он не был таким удобным я бы уже на середине своих страданий забил бы на него :)
Видео же со звуком пока НЕ будет. На днях выпущу звуковой патч для демки03, тогда и видео выложу.
Offtopic
В последнее время стал замечать, что во время отладки игры, я пока не завалю 3-4 волны роботов не отключаю игру, хотя это и не требовалось для отладки фичи… странно, к чему бы это…
Патч для Демки03. Добавление звука
Патч для добавления звуков: http://www.anegmetex.com/RoboDev/Demo03_SoundPatch.rar (1.8 Мб)
Ставить поверх демки с заменой файлов.
Отпишите пожалуйста работает ли у вас нормально звук.
Если самой демки03 у вас нет, то вот ссылка: http://www.anegmetex.com/RoboDev/Demo03.rar (14.8 Мб)
Превьюшка на youtube:
Редактор уровней
Пару недель назад начал неспешно работать над редактором уровней. Вспоминая редакторы от прошлых моих игр, я твёрдо решил, что в этот раз он будет более-менее адекватным и по стилю управления\редактирования объектами будет похож на обычный 3d редактор (читай – 3д макс).
В былые то годы, мои тулузы для клепания уровней отличались замысловатым функционалом, причудливыми Ынженерными решениями типа 3d курсора и убийственным количеством горячих клавиш. Но даже в них я умудрялся как то клепать вполне сносные уровни ))
Делать стандартные элементы 3д редактора к удивлению оказалось весьма интересным занятием. Например манипулятор со стрелочками. Я с таким упоением изучал в 3д максе особенности проекции экранного вектора скорости мыши на оси объекта, воздействие на объект в момент захвата… и сразу же переносил полученные знания прямиком в код своей программы :)
Что же касается интерфейса редактора – то тут я сохраняю трогательную верность традициям. Схема интерфейса «Вьюпорт-главнаяПанель-инфоПанели» выработанная на редакторе от Scary Nightmare показала себя в боевых условиях весьма не плохо, поэтому я решил её кардинально не менять.
Выкладываю ниже скрины трёх редакторов, расположенные в хронологическом порядке, эволюция так сказать… сложно сейчас поверить, но редактор для Technozes целиком обходился только горячими клавишами :)
Technozes (2007):
Scary Nightmare (2008):
Robogeddon (2009):
Подводные камни физикса
Занимаюсь своим редактором. Реализовываю перемещение и поворот объектов. Перемещение работает отлично а вот поворот начал давать на статических объектах интересный глюк – после большого количества поворотов шейпы статического объекта начали не совпадать с их матрицей поворота (та что возвращается функцией getGlobalOrientation).
Вот в исходном состоянии (оранжевыми линиями показано положение физической оболочки):