Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 18.01.2015, 20:50
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 1  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Question Провисания FPS из-за звука. Способы обойти?

Готовим мобильную игру к продакшену, и проводим закрытые альфа тесты. И вот сейчас при тестировании на довольно слабом устройстве Samsung Galaxy Ace 3, обнаружилось, что при стрельбе FPS часто провисает с 60 до 47 - 45. Конечно это не так критично, но все равно не приятно. Покопавшись и оптимизировав все, что только можно, пришел к выводу, что провисания происходят не из-за расчетов, а из-за звука.
Каждое оружие имеет объект Sound, который воспроизводится при выстреле, _sound.play(). Есть автоматы, которые стреляют до 15 раз в секунду. Соответственно, каждую секунду, метод Sound#play() создает до 15 новых объектов SoundChannel.
Если звук отключить, то FPS не провисает даже при наличии на экране одновременно 10 и более персонажей, которые двигаются и атакуют.

Есть у кого-нибудь идеи, как это можно решить?

Старый 18.01.2015, 21:36
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 2  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Я всегда думал, что все делают звук с помощью SoundManager)
Это - класс, в котором находится список звуков, и можно вызывать тот или иной звук по константам с помощью одного метода.
И в нём проводи всю оптимизацию вместо этих саундов, к примеру один и тот же звук не воспроизводи два раза одновременно. Гаси предыдущий. Если критично, то поставь ограничение на кол-во звуков, воспроизводящихся одновременно.
__________________
There is no thing in this world that is not simple.

Старый 19.01.2015, 01:27
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 3  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
делать наложение звуков через gpu, либо как то кешировать два накладываемых звука в один.

например 15 выстрелов подряд можно кешировать и проигрывать как один.
игрок прострелял 7 выстрелов, перестал, проигрывание прерываем, находим время, включаем одиночный выстрел и перематываем так что бы тютелька в тютельку. или просто выключаем по таймеру(но таймер не точный)

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

Старый 19.01.2015, 02:17
GBee вне форума Посмотреть профиль Отправить личное сообщение для GBee Найти все сообщения от GBee
  № 4  
Ответить с цитированием
GBee
 
Аватар для GBee

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Оптимизацию чисто эстетическую провести. Я на слух определю стрельбу из 2 автоматов, а дальше 3 и больше даже считать не буду. Имеет смысл устраивать какофонию из отдельных выстрелов?
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

Старый 19.01.2015, 05:47
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Я на слух определю стрельбу из 2 автоматов, а дальше 3 и больше даже считать не буду. Имеет смысл устраивать какофонию из отдельных выстрелов?
Не не. Стрельба ведется только из одного. По сути стреляющее оружие есть только у главного персонажа. Все остальные - дикари без оружия). Казалось бы мелочи, но на телефоне подтормаживает.
Цитата:
Я всегда думал, что все делают звук с помощью SoundManager)
Это - класс, в котором находится список звуков, и можно вызывать тот или иной звук по константам с помощью одного метода.
SoundManager у меня включает музыку и регулирует громкость, глобальную для всей игры. Для оружия делать через него озвучку смысла нет, это только создаст большую связанность, и тормозить все будет гораздо сильнее. Обратиться к приватной переменной проще, чем к переменной в другом классе. Да и проблема-то не в этом. А в том, что метод Sound#play() в любом случае возвращает новый объект SoundChannel, будь то локальный вызов или обращение к статическому полю. Тут и никакого пула не создашь.
Цитата:
например 15 выстрелов подряд можно кешировать и проигрывать как один.
Можно. Но только это не позволит регулировать скорострельность. Или придется для всех видов оружия делать свой кэш. Что ж, пока это самый доступный способ решения


Последний раз редактировалось caseyryan; 19.01.2015 в 07:36.
Старый 19.01.2015, 13:12
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 6  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Можно использовать один Sound, с однажды вызванным play() (или эпизодически вызываемым), и скармливать ему семплы в SAMPLE_DATA.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 19.01.2015, 20:52
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
alatar, это как? Можно по-подробнее? В доках нашел запись в поле data, объекта SampleEvent. Но что-то я не могу допереть как можно без события, по вызову метода это сделать

Старый 20.01.2015, 00:10
alatar вне форума Посмотреть профиль Отправить личное сообщение для alatar Найти все сообщения от alatar
  № 8  
Ответить с цитированием
alatar
 
Аватар для alatar

блогер
Регистрация: Dec 2008
Адрес: Israel, Natanya
Сообщений: 4,740
Записей в блоге: 11
Событие будет наступать постоянно, если играть нечего, то ничего не делаем. Если есть что играть, начинаем скармливать семплы. Т.е. звук будет храниться в сыром виде (после Sound#extract или сразу их хранить в сыром виде или в WAV), если надо проиграть сразу несколько звуков, то семплы смешиваются перед записью в поле data.
__________________
משיח לא בא
משיח גם לא מטלפן

Старый 20.01.2015, 08:02
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 9  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Событие наступает только один раз. Далее после скармливания ему байт массива оно отправляется снова. Опять один раз. Даже если создать новый звук и вызывать у него метод play, указав количество повторений int.MAX_VALUE, оно все равно отправится один раз. Но в том то и проблема, что мне нужно не по каждому проходу события кормить его семплами, а через строго определенные промежутки времени. Для каждого оружия свои, а так как событие проходит единоразово, я не мого подождать наступления нужного момента, чтобы "разрешить" передачу ему байтмассива звука


Последний раз редактировалось caseyryan; 20.01.2015 в 08:13.
Старый 22.01.2015, 19:38
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 10  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
caseyryan, а что если сделать 2 версии выстрела - короткую и полную(или "множественную" и полную), и вместо воспроизведения нового звука подсчитывать кол-во вызовов в секунду/четверть секунды, в зависимости от этого формировать серию из порядка звуков? Я это имел в виду под "оптимизацией".
Завершающий выстрел должен быть полным, а множественный - промежуточным, когда выстрелов было больше 1-2 за одну единицу времени.

И выбрать единицу времени, например, 50-100 мс, засчитать это как небольшую задержку.
В энтерфрейме каждые 50/100 мс проверять кол-во выстрелов(запросов к этому семплу), и в зависимости от этого играть нужный семпл?
Или получается в итоге много операций?
Можно при слишком уж большом кол-ве запросов просто увеличивать громкость множественного, чтобы подчеркнуть "сочность"
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 22.01.2015 в 20:06.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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