Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
alone_mamont
0 / 0 / 0
Регистрация: 21.03.2014
Сообщений: 2
#1

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

22.03.2014, 01:35. Просмотров 1216. Ответов 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 будет дорого по энергозатратам. Поэтому я все так же открыт для правильных решений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2014, 01:35
Ответы с готовыми решениями:

Libgdx AI
Добрый день , кто нибудь пользовался данной вещью? ...

Подергивание при скролинге
Может кто сталкивался с проблемой, есть хеадер который должен постоянно быть на...

Лагает курсор мыши (подергивание)
Встретился на днях с жуткой проблемой (решить не могу) После перестановки win7...

Подергивание объекта при перемещении
Добрый день! пытаюсь организовать быстрое перемещения объекта из точки а в...

Подергивание ListView в режиме VirtualMode при добавлении элемента
Здравствуйте. Для начала стоит заметить, что более забагованного контрола в...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2014, 01:35

"Подергивание" картинок на форме
Добрый день! Иконки на форме делфи вставлены в виде картинок. Подскажите...

LibGDX на html(5)
Здравствуйте.В libGDX можно делать приложения GWT и выкладывать на Apache или...

Splash на libgdx
Всем привет есть 2 атласа 2048x2048 на андроиде 4.2 и выше, работает все...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru