RoboGame blog [RIP]Статьи

Архив блога: Апрель 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).

Вот в исходном состоянии (оранжевыми линиями показано положение физической оболочки):

Изображение

А вот после большого количества поворотов:
Изображение

Что примечательно – при единичных поворотах – всё нормально. При простом перемещении такого глюка вообще замечено не было. Сначала я думал что это из-за накоплении ошибки в матрице - ортонормировал её, но проблема не исчезала… тем более было странно что на динамических объектах такого глюка не возникало! Начал курить доки и вот что я заметил:

Изображение

Вы видите маленькое неприметное слово «dynamic»? Вот и я его заметил только после шестой зачитки документации. Начал гуглить проблему – оказывается у многих такие глюки замечены – на официальном сайте нвидии заметил 3 подобные темы. К слову которые остались без ответа.
Вообщем после на официальном сайте нашёл мелким шрифтом надпись в FAQ что статические объекты НЕЛЬЗЯ двигать после их создания, т.к. они там очень хитро оптимизируются и при их передвижении придётся много чего перерасчитывать.

Решение проблемы было простое – при создании NxActor в редакторе все статические объекты создаются как динамические с флагом NX_BF_KINEMATIC. После этого глюки волшебном образом исчезли! Объекты можно вертеть сколько хочешь и они не рассинхронизируются со своими физическими оболочками :)

Изображение

А теперь несколько риторических вопросов:
1) Почему в документации нет никаких Warling! крупным красным шрифтом насчёт всего этого?
2) Почему вообще библиотека физикса позволяет мне двигать и вращать статические объекты если это приводит к глюкам? Сэкономили на одной проверке if-ом?
3) Почему мне не дают возможности «перерасчитывать чегото там» или отключать всю эту оптимизацию статических объектов по моему желанию? Ведь передвижение статических объектов в редакторе уровня – думаю обычная и часто встречающаяся задача.


---

+ Показать

5 июля 2009 (Обновление: 7 фев 2012)