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

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

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

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

22.03.2014, 01:35. Просмотров 852. Ответов 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. Подергивание спрайта. Не связано с GC (Программирование Android):

Libgdx AI - Программирование Android
Добрый день , кто нибудь пользовался данной вещью? https://github.com/libgdx/gdx-ai/wiki Просто кроме этой страницы нигде информации...

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

Подергивание объекта при перемещении - Unity, Unity3D
Добрый день! пытаюсь организовать быстрое перемещения объекта из точки а в точку Б, при этом объект при движении немного подергивается. ...

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

.NET 4.x Подергивание ListView в режиме VirtualMode при добавлении элемента - C#
Здравствуйте. Для начала стоит заметить, что более забагованного контрола в винформах встречать не приходилось. Причем одни и те же...

"Подергивание" картинок на форме - Delphi
Добрый день! Иконки на форме делфи вставлены в виде картинок. Подскажите пжст, как заставить подергиваться (дрожать) иконку при...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.03.2014, 01:35
Привет! Вот еще темы с ответами:

Таймер в libgdx - Java ME
Привет всем...пишу игру на libgdx..нужно ,что бы каждые 5 секунд выполнялось какое то действие...Как поставить для этого таймер???

Splash на libgdx - Программирование Android
Всем привет есть 2 атласа 2048x2048 на андроиде 4.2 и выше, работает все отлично, все что ниже версией ошибка, причем инициализации....

LibGDX на html(5) - HTML, CSS
Здравствуйте.В libGDX можно делать приложения GWT и выкладывать на Apache или Nginx. Сделал все как по инструкции, все получилось и я...

Libgdx polygon - Программирование Android
Добрый день, возникла следующая проблема : создаю объект класса Polygon (com.badlogic.gdx.math.Polygon) , поворачиваю его, рисую: poly...


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

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

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