После того, как TextureAtlas загружен, это низкая частота кадров в секунду на некоторое время


Stackoverflowers и другие хорошие люди, У меня есть одна проблема, с которой я не знаю, как решить после двух дней попыток: У меня есть проект libgdx (я использую сцены и актеров, но сейчас это не важно) , где я добавляю в комментарии все, что не полезно и проблема проста:

  1. Установка пустого экрана сначала несколько (4-5) рендеров имеют дельту около 0,04 сек, затем около 0,01
  2. настройка экрана, где в методе 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 2

1 ответ:

На Android время дельты сглаживается (усредняется) за последние 5 кадров. Если процесс загрузки TextureAtlas (или любых других активов) заставляет этот кадр занимать больше времени (что, скорее всего, и произойдет), то вы увидите более высокое Дельта-время для следующих 5 или около того кадров. Вы можете попробовать getRawDeltaTime, Если вам нужны несмазанные дельты. Конечно, вам придется проигнорировать Дельта-время, которое передается в метод рендеринга, и получить сырую дельту из Gdx.graphics.getRawDeltaTime() в начале вашего метода рендеринга.