Войти
ПрограммированиеФорумЗвук

Как лучше хранить звуки (DirectSound)

Страницы: 1 2 Следующая »
#0
9:57, 21 сен. 2009

Пока видится 3 способа хранения (может еще что-то получше есть, выслушаю):

  • читаем данные из файла, заливаем их в буффер, когда нужно проиграть: дублируем буфер и играем, при окончании проигрывания освобождаем созданный буфер
  • читаем данные из файла, когда нужно проиграть: заливаем данные в буффер и играем, при окончании освобождаем буфер
  • когда нужно проиграть: читаем данные из файла, заливаем в буффер и играем, при окончании освобождаем буффер и данные

  • Как лучше, быстрее, разумнее?)


    #1
    10:13, 21 сен. 2009

    нужно разделение на короткий звук и поток.
    поток играется понятно - прочитали кусок, декодировали, засунули в буфер и т.д. пока не закончица.
    короткие звуки:
    читаем, декодируем, создаем буффер под весь звук.
    когда проигрываем - дублируем буффер или берем из пула(см ниже) отигрался - не удаляем а помещаем в пул.
    т.е. каждый звук может играться паралельно в N инстансах. аллоцировать их по надобности или сразу - опционально.
    если все инстанцы заняты(уже играют звук) выбираем тот что тише или "старее" других.
    кактотак.
    см исходники недавно выложенного шквала + пеар

    #2
    11:43, 21 сен. 2009

    Sokal
    Зачем в первом варианте дублировать буфер??? Воспроизводи из первого. Читать файл прямо перед воспроизведением имеет смысл только при больших объёмах данных.

    #3
    11:46, 21 сен. 2009

    Mikle
    ну там с поправкой на то что буффер сейчас играет

    #4
    11:47, 16 окт. 2009

    Я пахоже кривее всех сделал, но что-то мне в своё время не понравилась идея копировать буфер при каждом выстреле. Если у меня 16 человек и все шмаляют из автоматов 15раз в секунду, то конечно я даже пытаться не буду воспроизвести весь этот беспредел. Но штук 8 воспроизвести надо. То-же касается звуков шагов/прыжков. И для каждого оружия и для каждого игрока эти звуки свои. И прикидывал - получалось под 3-5 метров в секунду в относительно спокойных сценах. Поэтому сделал хуже, но спокойнее:
    15 буферов под выстрелы пулемёта, 10 под звуки гильз, 10 под выстрелы ракет, 5 для летящей ракеты ... и т.д. На одно только оружие приходится хранить в памяти три сотни буферов. Около 50-и метров.
    И с такого ракурса вопрос становится прозрачнее: что выгоднее - хранить 50 метров постоянно, либо хранить и перезагружать 10 метровые куски по 5 раз в секунду.
    Я выбрал первое.

    #5
    14:14, 16 окт. 2009

    Ejeg
    > 15 буферов под выстрелы пулемёта, 10 под звуки гильз, 10 под выстрелы ракет, 5
    > для летящей ракеты
    Достаточно 3-4 буфера на каждый звук, только воспроизводить те, что громче (ближе). Остальные на их фоне не слышны.

    #6
    14:56, 16 окт. 2009

    никто же не мешает сделать класс звука, в нем при проигрывании ищется свободный буффер (у каждого звука они свои), или создается новый, кол-во буфферов ограничивается полем maxBuffers к примеру

    #7
    18:17, 16 окт. 2009

      Не ну мыж в любом случае изначально еще при разработке должны прикинуть сколько примерно, например, пулемётных выстрелов, будем озвучивать. И как ты говоришь в соответствии с этим выставим константу maxBuffers.  Это будет означать, что в критической, самой шумной ситуации у нас будет воспроизведено maxBuffers звуков, и именно столько может свободно выдержать наш движок. ... Затем наступает затишье, враги мертвы, потом рождаются снова, набегают толпой и снова шум-гам и снова копируем maxBuffers  буферов.
      Вопрос - зачем их по сто раз копировать/очищать(?) если потом снова копировать, очищать, копировать, очищать..
      Почему сразу при загрузке не скопировать maxBuffers  буферов и держать их в памяти? Ведь мы рассчитали, что способны на это в критической ситуации!

      Sokal, к тебе тоже вопрос - почему ты изначально в перечисленных вариантах не указал такой? )))

      Mikle, сагласен! Просто пока мой звукавик не сделал нормальные звуки, я юзаю чужие, в которых в конце много лишней тишины... Поэтому так много буферов. Потом да, изменим на 3-4.

    #8
    22:14, 16 окт. 2009

    Ejeg
    я когда писал первый пост был еще так молод...)))

    #9
    0:39, 17 окт. 2009

    Sokal, по большому счету я должен извиниться за свою неделикатную манеру задавать вопросы. Я на самом деле часто вижу, что люди копируют буферы лишь  при необходимости и склонен сомневаться, что мой метод верен.

    #10
    4:14, 17 окт. 2009

    Работающий способ:
    1. Короткие звуки. Загружаем целиком в буффер, дублируем, играем. Число копий - сколько надо играть звуков одновременно. Копии лучше называть "каналами".
    2. Поток.
    При копировании DS-буффера не происходит копирования данных.

    #11
    9:25, 17 окт. 2009

    Ejeg
    главное чтоб метод работал))

    zlos
    > 2. Поток.
    > При копировании DS-буффера не происходит копирования данных.
    всмысле?

    #12
    12:57, 17 окт. 2009

    Sokal
    > zlos
    > > 2. Поток.
    > > При копировании DS-буффера не происходит копирования данных.
    > всмысле?

    Занимался этим вопросом. В SDK написано что при клонировании DS буфера создается только ссылка на существующий буфер.

    #13
    15:03, 17 окт. 2009

    Sokal
    В прямом. Загруженный мегабайт звука будет в одном экземпляре сколько ты его ни копируй. При копировании, как сказали выше, происходит только создание нового экземпляра управляющих структур, данные будут в единственном экземпляре.

    #14
    23:00, 17 окт. 2009

    вы об этом: "DuplicateSoundBuffer" ? серьёзно чтоли? тогда действительно не стоит скромничать в количестве предустановленных каналов? ))

    Страницы: 1 2 Следующая »
    ПрограммированиеФорумЗвук

    Тема в архиве.