После того, как TextureAtlas загружен, это низкая частота кадров в секунду на некоторое время
Stackoverflowers и другие хорошие люди, У меня есть одна проблема, с которой я не знаю, как решить после двух дней попыток: У меня есть проект libgdx (я использую сцены и актеров, но сейчас это не важно) , где я добавляю в комментарии все, что не полезно и проблема проста:
- Установка пустого экрана сначала несколько (4-5) рендеров имеют дельту около 0,04 сек, затем около 0,01
- настройка экрана, где в методе resize я сделал новый экземпляр TextureAtlas-it загрузка двух текстур 1024 x 1024 занимает около 0,5-0,8 секунды, а затем начинается рендеринг, и первые несколько рендеров (5) имеют Дельта - время около 0,1 секунды (на SGS II) или около 0,2 - 0,3 секунды (на SG ACE) - и это действительно довольно большая проблема, потому что когда у вас есть какой-то эффект Фадеина или какая-то анимация в начале экрана, вы увидите, возможно, вторую половину анимации-да, когда она имеет такой низкий рейтинг fps...ничего не рисует (я ничего не вижу, даже это говорит о том, что рендеринги имеют был вызван даже через 0,3 сек)
Мой вопрос: TextureAtlas должен загружать каждое изображение страницы, когда он называется так почему он влияет на запуск после того, как он был загружен? Или хотя бы могу ли я знать, когда он будет работать, рисуя нормально?
Большое спасибо за ваш ответ!
Послушно вот код, но он прост, как это:
public class App extends Game {
@Override
public void create() {
Gdx.app.log( this.LOG, "Creating game" );
fpsLogger = new FPSLogger();
setScreen( new IntroScreen(this) );
}
}
Интроскрин:
public class IntroScreen implements Screen {
@Override
public void resize(
int width,
int height )
{
super.resize( width, height );
Gdx.app.log("IntroScreen", "Resize start: " );
atlas = new TextureAtlas( Gdx.files.internal( "image-atlases/pages-info.atlas" ) );
Gdx.app.log("IntroScreen", "Resize finished: " );
}
@Override
public void render(
float delta )
{
Gdx.gl.glClearColor( 0f, 0f, 0f, 1f );
Gdx.gl.glClear( GL20.GL_COLOR_BUFFER_BIT );
Gdx.app.log( "IntroScreen", "Delta: " + delta );
// stage is empty
stage.act( delta );
stage.draw();
}
}
А вот вывод из LogCat:
08-09 01:09:53.689: I/IntroScreen(9757): Resize start:
08-09 01:09:54.004: I/IntroScreen(9757): Resize finished:
08-09 01:09:54.009: I/IntroScreen(9757): Delta: 0.10668343
08-09 01:09:54.009: I/IntroScreen(9757): Delta: 0.1037551
08-09 01:09:54.024: I/IntroScreen(9757): Delta: 0.1006427
08-09 01:09:54.039: I/IntroScreen(9757): Delta: 0.09953054
08-09 01:09:54.054: I/IntroScreen(9757): Delta: 0.099971004
08-09 01:09:54.074: I/IntroScreen(9757): Delta: 0.009933725
08-09 01:09:54.089: I/IntroScreen(9757): Delta: 0.012701442
08-09 01:09:54.104: I/IntroScreen(9757): Delta: 0.015878525
08-09 01:09:54.124: I/IntroScreen(9757): Delta: 0.016689042
08-09 01:09:54.144: I/IntroScreen(9757): Delta: 0.017476525
08-09 01:09:54.159: I/IntroScreen(9757): Delta: 0.017719833
08-09 01:09:54.174: I/IntroScreen(9757): Delta: 0.017750284
08-09 01:09:54.189: I/IntroScreen(9757): Delta: 0.017803017
...
Спасибо за любую помощь.
1 ответ:
На Android время дельты сглаживается (усредняется) за последние 5 кадров. Если процесс загрузки
TextureAtlas
(или любых других активов) заставляет этот кадр занимать больше времени (что, скорее всего, и произойдет), то вы увидите более высокое Дельта-время для следующих 5 или около того кадров. Вы можете попробоватьgetRawDeltaTime
, Если вам нужны несмазанные дельты. Конечно, вам придется проигнорировать Дельта-время, которое передается в метод рендеринга, и получить сырую дельту изGdx.graphics.getRawDeltaTime()
в начале вашего метода рендеринга.