【问题标题】:(LibGdx) Screen viewport issue(LibGdx) 屏幕视口问题
【发布时间】:2017-10-15 16:34:51
【问题描述】:

这与 Libgdx 有关。 我正在开发一个逻辑正确的游戏。

问题: 当游戏在 PC 上运行时看起来不错(FPS 61) 但是在android上运行时(FPS从47到30不断下降)(注5)它非常慢并且在一段时间后冻结并关闭(屏幕上出现了太多东西)

问题(很可能) 我没有先在游戏中使用相机或视口。(这会使游戏在手机上挂起一段时间后,而不是电脑上)

后来我将相机和视口放入游戏中,但视口在高分辨率屏幕上显示的游戏场景太少(我使用 1280x720 的视口和相机),现在游戏不会挂起或冻结,但可见的场景非常少

所有 res 设备的视口和相机设置应该是什么?(欢迎示例)

提前感谢您的任何建议

【问题讨论】:

  • 图片显示我的意思ibb.co/dGfarRibb.co/mUivrR
  • 我不认为problem of fps fall down is due to any viewport size,可能是由于您的游戏更新方法中的一些复杂计算
  • FPS 下降是因为场景中的许多内容开始出现在高分辨率设备的屏幕上。低分辨率设备 fps 在 61 60 时很好且稳定。例如。我创建了一个具有重复纹理的墙,它在低分辨率下有 4 次重复,但相同的代码会产生 8 次或更多重复,因为高分辨率(getHeight() 事情使它)所以更多的纹理重复使界面越来越慢。如何解决这个问题?
  • viewPort 中继虚拟宽度和高度,为什么你的同样会产生不同的值,比如 4 到 8,请显示你的代码,这样我就可以理解出了什么问题。
  • 我使用循环来绘制从 0 到 getHeight() 的纹理(纹理大小 64x64)),因此使用更高分辨率的设备可以形成更多图块。所以视口没​​有效果(我正在使用 FitViewport)

标签: android camera libgdx viewport freeze


【解决方案1】:

FitViewport,将纵横比保持在scaling the world 以适应屏幕,为剩余空间添加黑条(信箱),因此始终有恒定数量的对象适合您的视口。

public class GdxTest extends ApplicationAdapter{

    private FitViewport fitViewport;
    private SpriteBatch spriteBatch;
    private OrthographicCamera camera;
    private float virtualWidth=640,virtualHeight=400;
    private Texture texture,bg;
    private Sprite Sprite;

    @Override
    public void create() {

        spriteBatch=new SpriteBatch();
        camera=new OrthographicCamera();
        fitViewport=new FitViewport(virtualWidth,virtualHeight,camera);

        texture=new Texture("badlogic.jpg");        // having dimension of 256 X 256
        bg=new Texture("pixel.png");

        Sprite=new Sprite(bg);
        Sprite.setColor(Color.GOLD);
        Sprite.setSize(virtualWidth,virtualHeight);
    }

    @Override
    public void render() {

        Gdx.gl.glClearColor(0,0,0,1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        spriteBatch.setProjectionMatrix(camera.combined);
        spriteBatch.begin();
        Sprite.draw(spriteBatch);
        spriteBatch.draw(texture,0,0);
        spriteBatch.end();
    }

    @Override
    public void resize(int width, int height) {
        fitViewport.update(width, height,true);
    }

    @Override
    public void dispose() {
        spriteBatch.dispose();
        texture.dispose();
        bg.dispose();
    }
}

我会推荐使用ExtendViewprot,因为它通过向一个方向扩展世界来保持世界纵横比没有黑条。

【讨论】:

    【解决方案2】:

    终于解决了。问题是我将相机和视口分辨率设置为 Gdx.Graphics.getHeight() 和 width()... 这得到了设备的高度和宽度。

    这就是问题的主要原因。

    我需要做的是将相机和视口分辨率设置为 virtualResolutions(自己想要的高度 x 宽度),就像 @Abhishek 指出的那样。 修复此问题后,PC 和 android 设备显示相同的屏幕但

    android 设备上的 FPS 从 45 下降到 30,游戏运行缓慢。(虽然 PC 和移动设备显示相同数量的纹理)我正在使用 ExtendViewport

    对此有何建议?

    解决方案:无论如何都只使用一个 SpriteBatch(我错误地使用了不止一个因此滞后)

    【讨论】:

    • 显示你的代码,你给处理器分配了过多的任务?
    • private void drawSprite(SpriteBatch batch){ for (float y = 0; y
    • 可能 SpriteBatch 是问题所在。我在一个公共变量类中制作了一个静态 SpriteBatch,现在在游戏中随处使用它。似乎解决了低 FPS 问题。
    猜你喜欢
    • 2016-03-24
    • 1970-01-01
    • 2014-11-26
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多