StreamFromDisk для WWW.audioClip

Общие вопросы о Unity3D

StreamFromDisk для WWW.audioClip

Сообщение VBProgr 14 сен 2012, 15:18

Добрый день!

Я загружаю ogg-файлы с диска с помощью WWW. Так вот, при получении audioClip из загруженного экземпляра WWW, наблюдаю подвисания. Учитывая, что файлы загружаются в процессе игры, хотелось бы избежать подобных вещей.

Пример:
Синтаксис:
Используется csharp
 var www = new WWW(@"file://C:/myfile.ogg");
 yield return www;
 // следующая строчка подвисает
 var clip = www .audioClip;
 


Вынести в другой поток эту операцию юнити не разрешает.

Почему нельзя загрузить всю музыку заранее? Потому что при загрузке 10-15 таких файлов (по 3-5 мб) UnityEngine занимает 1,5 Гб оперативки. А если загружать по одному - тогда можно удалять предыдущий AudioClip и экономить память.

При обычном импорте аудио в юнити можно настроить параметр StreamFromDisk. Тогда аудио будет читаться непосредственно с диска и не занимать память. Можно ли так же застримить файлы, которые я читаю [с диска] с помощью WWW?

Или Вы можете предложить еще какие-нибудь варианты?

StackOverflow
Последний раз редактировалось VBProgr 14 сен 2012, 21:56, всего редактировалось 1 раз.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение Woolf 14 сен 2012, 15:47

Грузите на карутине.

И еще.. Для огг лучше указывать явно www.GetAudioClip (true,false,AudioType.OGGVORBIS)
Юня не всегда корректно распознает оггшки почемуто.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: StreamFromDisk для WWW.audioClip

Сообщение VBProgr 14 сен 2012, 15:57

При чем здесь корутины? Вызов www.audioClip нельзя разделить на части. А тормозит именно эта строчка.

Насчет GetAudioClip - проверю.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение VBProgr 14 сен 2012, 18:29

Помогло свойство www.oggVorbis, но оно obsolete. Может есть другие решения?
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение Woolf 14 сен 2012, 18:35

VBProgr писал(а):При чем здесь корутины? Вызов http://www.audioClip нельзя разделить на части. А тормозит именно эта строчка.

Насчет GetAudioClip - проверю.


Хоть я и не сторонник давать готовый код...

Синтаксис:
Используется csharp
private WWW www = null;
public string path = "";

        public void Play (string url)
        {
                path = url;
                StartCoroutine ("SampleLoaderCoroutine");
        }

        IEnumerator SampleLoaderCoroutine()
        {
                www = new WWW (path);
                yield return www;
       
                AudioClip clip = www.GetAudioClip (true,false,isOgg(path)?AudioType.OGGVORBIS:AudioType.UNKNOWN);
       
                if (www.isDone) {
                                SoundPlay3D (clip);    
                } else {
                        Destroy (gameObject);
                }
                www.Dispose ();
        }

        private void SoundPlay (AudioClip aclip)
        {
                if (aclip != null) {
                        audio.clip = aclip;
                        audio.loop = isLoop;
                       
                        audio.volume = volume;
                        if (isLoop) {
                                audio.Play ();
                        } else {
                                audio.Play (); //PlayOneShot (aclip, volume);
                        }
       
                        int length = (int)(audio.clip.length + 1f);
                        if (!isLoop)
                                Destroy (gameObject, length);
                }
        }
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: StreamFromDisk для WWW.audioClip

Сообщение VBProgr 14 сен 2012, 21:47

В вашем примере тормоза на этой этой строчке:
AudioClip clip = www. GetAudioClip (true,false,isOgg(path)?AudioType.OGGVORBIS:AudioType.UNKNOWN);

Мне кажется, вы не понимаете механизм работы корутин.

Корутины дают возможность разбить метод, так чтобы он выполнялся по частям. Компилятор преобразовывает такие методы в отдельный класс, свойства которого содержат переменные метода, а метод MoveNext() - блок switch, внутри которого выполняется код. Код выполняется в основном потоке и все тормоза, которые происходят внутри него, замедляют выполнение приложения. Суть корутин в том, что можно, к примеру, разбить большой цикл так, чтобы он выполнялся за несколько проходов. В противоположность этому, метод GetAudioClip выполняется за один проход и ничего с этим поделать нельзя.

Пользуюсь вашим примером я частично решил проблему. Если установить второй аргумент (stream) в true (GetAudioClip (true, true)), он будет выполнен мгновенно. Так как файл я загружаю с диска, GetAudioClip я вызываю только после того, как устанавливается www. isDone, т.е. после полной загрузки файла.

Но если использовать аргумент stream, всплывает баг юнити, о котором писали еще здесь с времен версии 2.х. Вкратце - невозможно установить, когда проигрывание клипа в AudioSource завершается, так как значения length и samples у AudioClip всегда равны 0, а свойство isPlaying у AudioSource равно true.

Так что пока остается только вариант с использованием свойства oggVorbis.

Хоть я и не сторонник давать готовый код...
А я не сторонник использовать готовый код :)
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение Woolf 14 сен 2012, 22:04

Корутины дают возможность разбить метод, так чтобы он выполнялся по частям


НЕ МЕТОД! А элементарные инструкции. Разницу чувствуете? В прочем, я играю достаточно длинные треки таким образом, тормозов нет.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: StreamFromDisk для WWW.audioClip

Сообщение VBProgr 14 сен 2012, 22:15

Метод состоит из элементарных инструкций. Допустим есть 10 таких инструкций. Можно разбить метод так, чтобы при первом проходе выполнялись первые 3 инструкции, потом следующие 6, и потом последняя. Но нельзя разбить одну элементарную инструкцию, коей в данном случае является вызов метода GetAudioClip. До того, как он вернет значение, выполнение основной программы (в том же потоке) продолжено не будет.

Прерывание IEnumerable-метода может произойти только в момент вызова внутри него yield. При чем yield должен будет вызван именно в самом методе, а не других методах, которые он может вызывать. Это про C#, в UnityScript немного по другому.

Тормозов нет? А попробуйте обрамить ваш код так:
Синтаксис:
Используется csharp
...
yield return www;
int t = System.Environment.TickCount;      
AudioClip clip = http://www.GetAudioClip (true,false,isOgg(path)?AudioType.OGGVORBIS:AudioType.UNKNOWN);
Debug.Log(System.Environment.TickCount - t);      
if (http://www.isDone) {
...



Что получите в консоль? Это РЕАЛЬНОЕ время в мс, за которое не произойдет ни одной смены фрэйма.

Если число небольшое, тогда это действительно странно. У меня выводит от 500 до 1500, т.е. больше секунды. Возможно, подвисание происходит только при загрузке файлов, а при загрузке из сети - вы ведь из сети грузите? - все нормально.

А может пофиксили уже - у меня юнити 3.5.2 все еще.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение Woolf 15 сен 2012, 01:24

GetAudioClip - это не элементарный метод. Далеко не элементарный. Хоть полчаса он будет отрабатывать на карутине - процесс игровой не останавливается. В общем, чего спорить то.. У меня все отлично работает. Почему не работает у вас - сие не знаю.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: StreamFromDisk для WWW.audioClip

Сообщение VBProgr 15 сен 2012, 13:03

На досуге поэкспериментируйте с IEnumerable в плане пошагового выполнения - узнаете много нового (popcorn)

Ладно, не буду спорить. Значит, должно заработать, когда обновлюсь.
skype: vbprogr
Добавить vbprogr в Skype
VBProgr
UNITрон
 
Сообщения: 319
Зарегистрирован: 24 сен 2011, 14:11

Re: StreamFromDisk для WWW.audioClip

Сообщение Woolf 15 сен 2012, 19:02

VBProgr писал(а):На досуге поэкспериментируйте с IEnumerable в плане пошагового выполнения - узнаете много нового (popcorn)

Ладно, не буду спорить. Значит, должно заработать, когда обновлюсь.


Не забудьте, что www.oggVorbis в 4й юне уже убрано.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: StreamFromDisk для WWW.audioClip

Сообщение seaman 15 сен 2012, 20:25

Ну давай уж до конца. В 4-ке:
Синтаксис:
Используется javascript
WWW.GetAudioClip(threeD : boolean, stream : boolean, audioType : AudioType) : AudioClip

threeD - если да - звук 3d
stream - если да - звук может проигрываться даже если загружен не полностью. Однако при этом выключается поиск в клипе (.time и .timeSamples)
audioType - тип аудио. Поддерживаются Ogg(Web/Standalones), MP3(phones), WAV, XM, IT, MOD или S3M. Хотя заложено расширение форматов.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10