android - 加载TextureAtlas后,有一段时间帧率较低

标签 android opengl-es textures libgdx frame-rate

stackoverflowers 和其他好人, 我有一个问题,经过两天的尝试后我不知道如何解决: 我有 libgdx 项目(我正在使用阶段和 Actor ,但这现在并不重要),我在评论中添加了所有无用的内容,问题很简单:

  1. 首先设置空屏幕,几个 (4-5) 渲染的增量大约为 0.04 秒,然后大约为 0.01
  2. 设置屏幕,在调整大小方法中我创建了一个新的TextureAtlas实例 - 它加载两个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
...

感谢您的帮助。

最佳答案

在 Android 上,增量时间在最后 5 帧上进行平滑(平均)。如果加载一个进程TextureAtlas (或任何其他 Assets )使该帧花费更长的时间(很可能会如此),然后您会看到接下来的 5 个左右帧的增量时间更高。您可以尝试getRawDeltaTime如果你想要未平滑的三角洲。当然,您必须忽略传递给渲染方法的增量时间,并从 Gdx.graphics.getRawDeltaTime() 获取原始增量。在渲染方法的开头。

关于android - 加载TextureAtlas后,有一段时间帧率较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18137782/

相关文章:

android - 获取 java.lang.ClassCastException : android. widget.FrameLayout$LayoutParams 无法转换为 android.widget.RelativeLayout$LayoutParams

android - 如何在 fragment android中实现视差滚动

opengl-es - 如何在 opengl/egl 中更改渲染表面的大小?

c++ - 使用 OpengGLES2(角度)从帧缓冲区对象中读取

ios - iOS 上的动态 PVRTC 压缩

android - 使用 PreferenceFragment 时如何启用/禁用选项菜单

javascript - Jquery 显示隐藏在大屏幕上无法正常工作。并且根本无法在移动设备上工作

ios - OpenGL格式纹理

ios - 如何在 UIView 中绘制 opengl es

android/opengles alpha 纹理不是半透明的而是二进制透明的