Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
alone_mamont
0 / 0 / 0
Регистрация: 21.03.2014
Сообщений: 2
#1

LibGdx. Подергивание спрайта. Не связано с GC - Android

22.03.2014, 01:35. Просмотров 821. Ответов 0
Метки нет (Все метки)

Здравствуйте. Недавно начал использовать LibGdx для написания платформера, как банально)) Создавая десктопное LwjglApplication обнаружил пренеприятнейшее поведение шарика, который отрисовываю на экране управляя его движением стрелками. Периодически, довольно часто, он дергается (будто на мгновение, или кадр , он оказывается в предыдущем положении, а на след кадр уже там где должен быть). Первым делом проверил работу GarbageCollector'а, так как порой дергания возникали периодично, но так как там и вправду нечего было "собирать", сборки мусора происходили редко и не совпадали с подергиванием. Поизучал доступную информацию,как понял, все сводится к тому, что это !типичная! проблема как-то связанная с настройкой lwjglApplicationConfiguration.vSyncEnabled, которая, вроде, отвечает за стабилизацию фрэймрейта приложения. Не уверен, что точно понял как правильно ее использовать, но попробовал в обоих положениях вкл и выкл.
Для стабилизации фрэймрейта ввел следующую типичную конструкцию:
Java
1
2
3
4
5
6
7
8
9
10
11
float accumTime = 0;
float TIME_STEP = 0.016f;// также использовал вариант 1 \ 60f
@Override
public void render(float delta) {
  accumTime += delta;
  while (accumTime >= TIME_STEP) {
    accumTime -= TIME_STEP;
    gameScreenController.update(TIME_STEP);
    gameScreenRender.render();
  }    
}
Как я понял после,хотя может я и не так понял, эта конструкция бессмысленна при включенной синхронизации vSyncEnabled, так как даже если я поставлю TIME_STEP = 1 /30f, эффекта для фпс не будет никакого. Те же 60-61 fps в FPSLogger, только ужасно мерцающая картинка на экране. В сорцах указано:
Java
1
2
/** whether to enable vsync, can be changed at runtime via {@link Graphics#setVSync(boolean)} **/
  public boolean vSyncEnabled = true;
Пробую выкл это во время создания экземпляра моего GameScreen. Все так же плохо) Также где-то сказано "Vsync is not enabled when useCPUSync is false in LWJGLGraphics", но как изменить useCPUSync я не понял.

FPSLogger во время бездействия на экране показывает стабильно 61 fps, во время подергиваний частенько показывает падение до 60fps.
Видимо то, что я вижу подергивания и есть результат изменения fps, но как? ведь мои расчеты позиции а прочего основаны исключительно на величине TIME_STEP за каждый update. Грубо говоря:
Java
1
2
3
float persоnageShiftY += currentVerticalSpeed * elapsedTime;
float persоnageShiftX = elapsedTime * personage.getCurrentSpeed();
personage.getPosition().add(persShiftX, persShiftY, 0);
Особенно тяжело для меня понять то, что визуально это выглядит как маленький "откат" назад. Хотя возможно это чисто мое визуальное восприятие.
Очень хорошо иллюстрирует то, что происходит у меня на экране вот это видео

что то BB-код ютуба не сработал:
http://www.youtube.com/watch?v=JInZ6dhVIgU

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

Добавлено через 10 часов 56 минут
Серия экспериментов показала:
1. Чтобы поставить необходимый вам фпс надо:
Java
1
2
3
4
5
6
int FPS_I_WISH = 90;
/** Target framerate when the window is in the foreground. The CPU sleeps as needed. Use 0 to never sleep. **/
cfg.foregroundFPS = FPS_I_WISH ;
/** Target framerate when the window is not in the foreground. The CPU sleeps as needed. Use 0 to never , -1 to not render. **/
cfg.backgroundFPS = FPS_I_WISH ;
cfg.vSyncEnabled = false;
если оставить
Java
1
cfg.vSyncEnabled = true;
то fps будет стремиться к 61.
2. Повышаю понемногу фпс, количество дерганий сокращается, движение целиком становится как-будто состоящим из серии микро-дерганий, словно видишь отдельные кадры. Повышаю до 90 и наступает блаженство - дерганий практически нет, движение выглядит достаточно слитным.
3. На разных фпс, когда случается дергание, в 90% случаев это сопровождается проседанием фпс на 1-2 кадра.
4. Возникла идея - ставлю фпс например 100-150, но конструкцией
Java
1
2
3
4
5
6
accumTime += delta;
 while (accumTime >= TIME_STEP) {
   accumTime -= TIME_STEP;
   gameScreenController.update(TIME_STEP);
   gameScreenRender.render();
 }
понижаю/выравниваю fps четко до нужного значения через TIME_STEP. Попробовал - получилась страшная жуть. Все жутко дергается.

В итоге, казалось бы, желаемый результат достигнут, но ведь это не прокатит для андроид приложения, там же все вроде выровняется снова до 60. Хотя точно не могу утверждать. Но в любом случае фпс=90 будет дорого по энергозатратам. Поэтому я все так же открыт для правильных решений.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2014, 01:35     LibGdx. Подергивание спрайта. Не связано с GC
Посмотрите здесь:

LibGDX загрузка аудио Android
SQLite и libGDX Android
Android Libgdx AI
Android Splash на libgdx
Android Libgdx polygon
Libgdx. Задержка перед выполнением действия Android
Android LibGDX. TexturePacker. Не пакует текстуры
Android LibGDX, не получается создать apk файл
Android Столкновение в libgdx через overlaps
Компиляция игры, libGDX Android
Android Libgdx уроки посоветуйте
LibGDX вращение текстуры Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru