【问题标题】:After TextureAtlas is loaded, it's low fps rate for a while加载TextureAtlas后,有一段时间fps低
【发布时间】:2013-08-08 23:13:42
【问题描述】:

stackoverflowers 和其他好人, 经过两天的尝试,我有一个问题我不知道如何解决: 我有 libgdx 项目(我正在使用阶段和演员,但现在这并不重要)在那里我添加到 cmets 一切没用,问题很简单:

  1. 先设置空屏幕,几 (4-5) 次渲染的增量约为 0.04 秒,然后约为 0.01
  2. 设置屏幕,在调整大小的方法中,我创建了一个新的 TextureAtlas 实例 - 它加载两个 1024 x 1024 纹理大约需要 0.5-0.8 秒,然后开始渲染,前几次渲染 (5) 有大约 delta 时间0.1 秒(在 SGS II 上)或大约 0.2 - 0.3 秒(在 SG ACE 上) - 这确实是一个相当大的问题,因为当您在屏幕开始时有一些 FadeIn 效果或任何动画时,您可能会看到下半部分动画的 - 是的,当它的 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
...

感谢您的帮助。

【问题讨论】:

  • 为什么每次调整大小都要重新加载?你也应该使用assetmanager
  • 同意,你真的应该研究一下 libgdx 资产管理器
  • 感谢您的回答。我不需要assetmanager,因为我不想异步加载一些东西。新的 TextureAtlas 将停止程序,直到它完全加载——我没有加载屏幕(我不需要它们),所以对我来说很好。我已经通过“nEx Software”的回答解决了这个问题。也许在那里寻找我的评论以更好地理解我的问题。现在解决了:)。还是谢谢。

标签: android opengl-es textures libgdx frame-rate


【解决方案1】:

在 Android 上,增量时间在过去 5 帧中被平滑(平均)。如果加载TextureAtlas(或任何其他资产)的过程使该帧需要更长的时间(很可能会这样),那么您将看到接下来的 5 帧左右的增量时间更长。如果您想要未平滑的增量,您可以尝试getRawDeltaTime。当然,您必须忽略传递给 render 方法的 delta 时间,并在您的 render 方法开始时从 Gdx.graphics.getRawDeltaTime() 获取原始 delta。

【讨论】:

  • 你真的是救命稻草。你是对的,问题是真实的增量(RawDeltaTime)是0.01,但平滑的增量时间是0.2,当我调用stage.act(delta)时 - 那是平滑的增量时间,5帧后经过大约0.05-0.1真实秒,但舞台表现得好像是 5*0.2 = 1 秒!现在我明白了这个问题。我不认为我会想到自己。真的谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-25
  • 2012-06-23
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
相关资源
最近更新 更多