Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

как сделать из слона муху

ФЛЕНОВ МИХАИЛ AKA HORRIFIC

Спецвыпуск: Хакер, номер #071, стр. 071-048-2


Как вариант, для хранения динамического массива указателей можно использовать класс TList (в данном случае совет относится к программистам Delphi).

На самом деле, алгоритмов создания списков очень много, но мы выделили эти два, как наиболее эффективные и достаточно простые в реализации. В зависимости от задачи можно придумать и другой алгоритм: все зависит от того, как хранятся данные, нужно ли их сортировать, есть ли необходимость удалять из середины, куда добавляются новые элементы (в конец или могут вставляться в середину списка) и т.д.

[по чуть-чуть.]

Допустим, что ты пишешь программу воспроизведения/записи звука или видео. На первый взгляд, для воспроизведения mp3-файла необходимо столько же памяти, сколько данные занимают в файле. Достаточно только загрузить все в память и отправить данные звуковой карте. Ошибочка вышла. Не факт, что звуковая карта сможет понять сжатые данные. Придется производить декомпрессию самостоятельно и направлять звуковой карте несжатые данные. Если разложить по полочкам mp3-файл, то для хранения всех данных может понадобиться 60, а то и все 100 мегабайт памяти. Такого расточительства тебя ни один пользователь не простит.

Еще один пример – простой ZIP-архиватор. Что если необходимо сжать файл размером в 500 метров? Загрузить его в память, а потом заархивировать его там будет достаточно проблематично.

Во всех этих случаях вполне логичным будет выделить два небольших участка памяти. В первый необходимо загружать данные из файла для последующей манипуляции (компрессии/декомпрессии), а во второй будет помещаться результат работы. Тут нужно быть аккуратным, потому что размеры сжатых и несжатых данных разные и легко выйти за границу буфера. Не стоит пытаться запихнуть в оперативку все сразу, потому что это бессмысленно. Всегда загружай данные небольшими порциями.

[циклическое использование памяти.]

При работе со звуком Microsoft предоставляет нам очень удобные механизмы работы с памятью, которые мы сейчас и рассмотрим.

Итак, MMSystem получает при воспроизведении и возвращает при записи звуковые данные через специализированные буферы. Так как данные загружаются порциями, для предотвращения задержек в воспроизведении/записи музыки используется очередь из буферов. Для нормальной работы достаточно двух блоков памяти, но можно сделать и больше.

Как пример, выделяем память для хранения двух буферов данных. Размер памяти можно выбрать любой, но он должен быть не слишком маленьким, дабы избежать слишком частой смены буферов, и не слишком большим, чтобы сэкономить память для других целей. Точный размер подбирается в зависимости от качества звука, потому что от этого зависит и размер необходимых данных. Из личного опыта — выделяй столько, чтобы хватило на воспроизведение/запись не менее 5 и не более 10 секунд звука.

Назад на стр. 071-048-1  Содержание  Вперед на стр. 071-048-3