Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Корректная очистка Sound (http://www.flasher.ru/forum/showthread.php?t=213861)

juliaplayrix 06.02.2017 14:07

Корректная очистка Sound
 
Ребята! Подскажите, пожалуйста, по звуку - утекает память из-за звука. Звук останавливаю, ссылку на канал удаляю, но память похоже не чистится. Есть ли какие-то трики? На всякий случай кидаю кусок по остановке звука у меня в коде:

Код AS3:

_soundChannel.removeEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
_soundChannel.stop();
_soundChannel = null;

где _soundChannel это

Код AS3:

_soundChannel = _sound.play(0, getLoopsCount(), _audioTransform.soundTransform);

Буду рада любым советам и ответам!

Tails 06.02.2017 14:26

Звук потоковый?

juliaplayrix 06.02.2017 15:03

Грузятся mp3-шки, и ещё часть звука упакована в swf-ки

juliaplayrix 06.02.2017 15:07

нет, не потоковый

Tails 06.02.2017 16:30

Почему вы решили, что память утекает? Сборщик мусора не чистит память сразу же, как только вы присвоите null. Выложите весь код целиком, или попробуйте собрать минимальный пример, демонстрирующий утечку.

caseyryan 06.02.2017 16:58

Во флеше со звуком все плохо, да. Память там утекает изза того, что для каждого вызова sound.play() создается новый звуковой канал. Невозможно сохранить ссылку на старый. Мне этот механизм тоже дико не нравится и доставляет много проблем, но увы, с этим ничего не поделать.
Потом она конечно отчищается сборщиком мусора, но если каналов успевает накопиться много, то приложение в этот момент "фризит"

juliaplayrix 07.02.2017 11:47

caseyryan, вот меня и смущает пересоздание потоков каждый раз после паузы туда-сюда. Утечка там, где снимается с паузы, в моей игре это место, когда персонаж ходит, и открываешь какое-либо окно поверх персонажа, то звуки ставятся на паузу (птицы, шаги, строительство идёт, много звука). Эту логику я менять не могу, так задумано. Просто выключать не могу громкость тоже, потому что анимации, к которым привязаны все звуки, тоже ставятся на паузу. Ну и вот если открывать закрывать окошки, то естественно пауза в звуках (вернее последующее снятие с паузы) вызывает создание нового потока. Может можно как-то всё же пооптимизировать работу звуков? Как считаете?

Добавлено через 11 минут
Tails, самый обыкновенный запуск, запуск звука

Код AS3:

_soundChannel = _sound.play(_pausePosition, getLoopsCount(), _audioTransform.soundTransform);

где _audioTransform.soundTransform, это штуковина, отдающаяя SoundTransform с заданными значениями громкости и панорамы.

Постановка на паузу такая -

Код AS3:

_playbackComplete = false;
_pausePosition = _soundChannel.position;
_currentState = AudioState.ACTUAL_PAUSED;
clearChannel();

А очистка это метод clearChannel, вот он

Код AS3:

protected function clearChannel():void
{
        if (isChannelValid()) //_soundChannel != null
        {
                _soundChannel.removeEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
                _soundChannel.stop();
                _soundChannel = null;
        }
}


undefined 07.02.2017 12:05

Цитата:

Просто выключать не могу громкость тоже, потому что анимации, к которым привязаны все звуки, тоже ставятся на паузу.
А что мешает уменьшить громкость до 0?Вообще странная логика привязываться к позиции воспроизводимого звука.При определенных условиях звук может и не заиграть вообще.

juliaplayrix 07.02.2017 12:13

undefined, я имела ввиду то, что звук привязан к анимациям логически, то есть мне нужно всё равно запускать с того места, где поставили анимацию на паузу, иначе звук оторван по логике будет от своей анимации

Добавлено через 2 минуты
И так как нативного метода паузы нет, то я при паузе запоминаю место -

Код AS3:

_pausePosition = _soundChannel.position;

и потом при вызове плэй играю звук с того места -

Код AS3:

_soundChannel = _sound.play(_pausePosition, getLoopsCount(), _audioTransform.soundTransform);

И снова создаётся поток

Tails 07.02.2017 12:37

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

Так в чём конкретно проявляется утечка, у вас не очищается память? Вы пробовали смотреть дебаггером состояние массивов, может быть, они не очищаются где-то у вас.


Часовой пояс GMT +4, время: 21:27.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.