1

LibGDX を使用して (ゲーム用の) スプラッシュ スクリーンを作成しています。私は.png形式の画像を使用していますが、それらのいくつかで動作します(画像はアセットフォルダーに適切に配置されています)使用したい画像のいくつかでこのエラーが発生します:

    Exception in thread "LWJGL Application" com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: devlogo.png
    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
    at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
    at com.badlogic.gdx.graphics.GLTexture.createTextureData(GLTexture.java:185)
    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:103)
    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:95)
    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:91)
    at com.GunRun.Screens.Splash.show(Splash.java:34)
    at com.badlogic.gdx.Game.setScreen(Game.java:61)
    at com.mynewgame.game.GunRun.create(GunRun.java:16)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:143)
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:120)
Caused by: java.io.IOException: Error loading pixmap: decoder init failed for stream
    at com.badlogic.gdx.graphics.g2d.Gdx2DPixmap.<init>(Gdx2DPixmap.java:57)
    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:138)
    ... 10 more

スプラッシュ スクリーン クラスのコード:

public class Splash implements Screen{

private Sprite devlogo;
private SpriteBatch batch;

@Override
public void render(float delta) {
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    batch.begin();
    devlogo.draw(batch);
    batch.end();
}

@Override
public void resize(int width, int height) {

}

@Override
public void show() {
    batch = new SpriteBatch();

    Texture texture = new Texture("devlogo.png");
    devlogo = new Sprite(texture);
    devlogo.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
}



@Override
public void pause() {

}

@Override
public void resume() {

}

@Override
public void hide() {

}

@Override
public void dispose() {

}

}

動作する画像は深度が 24 ビットで、他の画像は深度が 64 ビットではありませんが、問題はありますか?

4

3 に答える 3

1

私も最近この問題に遭遇したので、そのエラーメッセージがどこから来たのかを掘り下げました. エラーは、jpgd.cpp の次の行から発生します。

jpeg_decoder decoder(pStream);
if (decoder.get_error_code() != JPGD_SUCCESS) {
    err_reason = "decoder init failed for stream";
    return NULL;
}

興味深いのは、これらは PNG であるため、画像を JPG としてロードしようとしている可能性が高いということです。LibGDXが最初の試行でイメージをメモリにロードできなかった場合、次のようになります

const unsigned char* pixels = stbi_load_from_memory(buffer, len, &width, &height, &format, 0);
if (pixels == NULL) {
    pixels = jpgd_decompress_jpeg_image_from_memory(buffer, len, &width, &height, &format, 3);
}

ゲームの一部で大規模なメモリ リークが発生したため、これに当たったことが判明したため、LibGDX は単にイメージをロードするためのメモリの割り当てに失敗していました。メモリリークを修正すると、問題が修正されました。

これはスプラッシュ スクリーンで発生しているため、メモリ リークが問題の原因ではないと推測しますが、アプリケーションに十分なメモリが割り当てられていることを確認する価値があるかもしれません。

于 2017-04-24T01:49:34.393 に答える