纹理未显示在应用程序中
Texture is not displayed in the application
在研究框架的过程中libgdx我发现了一个构建项目的绝妙方法。这是我加载纹理并显示它的示例。
实现AssetManager的单例模式
public class GameAsssetManager extends AssetManager {
private static GameAsssetManager instance;
public static GameAsssetManager getInstance(){
if(null == instance)
instance = new GameAsssetManager();
return instance;
}
public void init(){}
}
正在加载图片
public class LoadScreen implements Screen{
private void loadAssets(){
GameAsssetManager.getInstance().load("badlogic.jpg",Texture.class);
}
@Override
public void show() {
GameAsssetManager.getInstance().init();
loadAssets();
}
@Override
public void render(float delta) {
//Метод update возвращает true в том случаи, если все ресурсы загружены
if(GameAsssetManager.getInstance().update()){
ScreenManager.getInstance().show(CustomScreen.GAME);
}
}
...
}
最后显示图片
public class GameScreen implements Screen {
...
@Override
public void show() {
batch = new SpriteBatch();
texture = GameAsssetManager.getInstance().get("badlogic.jpg");
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 1, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(
texture,
Gdx.graphics.getWidth()/2 - texture.getWidth()/2,
Gdx.graphics.getHeight()/2 - texture.getHeight()/2
);
batch.end();
}
...
所以问题如下。编译应用程序时,一切正常。但是如果你关闭应用程序并重新启动安装的应用程序,在应该显示纹理的地方显示黑色方块。
Android 暂停 activity 后丢失 GLContext。请参阅
http://www.badlogicgames.com/wordpress/?p=1073
如果您的目标是 Android 或 iOS,则不应为您的资产使用单例(或任何静态引用)。它们会泄漏,当您离开应用程序并恢复它时,您最终会得到 corrupted/blank 纹理。
例如,在 Android 上,当您关闭游戏(结束托管它的 Activity)时,Android 会保持您的应用程序打开,因此静态引用会被保留。当游戏再次打开时,一个新的 Activity 正在实例化以承载一个新的 OpenGL 表面。您所有的旧纹理和着色器都将来自过时的表面,但您的游戏并不知道这一点。此外,您可能已经泄露了所有的纹理内存。
这不仅发生在您关闭游戏时。类似的事情(GL 上下文丢失)有时可能仅在多任务离开和回来时发生。
尝试为您的 GameAsssetManager 实施 Disposable class 并释放 dispose() 方法中的所有资源。对于我的资产管理器,我也使用单例,而且我没有任何内存问题和其他问题。我的意思是,在 "onPause"、"onStop"、"onDestroy" 等生命周期方法中发布。并确保在再次启动应用程序时重新加载资源。
在研究框架的过程中libgdx我发现了一个构建项目的绝妙方法。这是我加载纹理并显示它的示例。
实现AssetManager的单例模式
public class GameAsssetManager extends AssetManager {
private static GameAsssetManager instance;
public static GameAsssetManager getInstance(){
if(null == instance)
instance = new GameAsssetManager();
return instance;
}
public void init(){}
}
正在加载图片
public class LoadScreen implements Screen{
private void loadAssets(){
GameAsssetManager.getInstance().load("badlogic.jpg",Texture.class);
}
@Override
public void show() {
GameAsssetManager.getInstance().init();
loadAssets();
}
@Override
public void render(float delta) {
//Метод update возвращает true в том случаи, если все ресурсы загружены
if(GameAsssetManager.getInstance().update()){
ScreenManager.getInstance().show(CustomScreen.GAME);
}
}
...
}
最后显示图片
public class GameScreen implements Screen {
...
@Override
public void show() {
batch = new SpriteBatch();
texture = GameAsssetManager.getInstance().get("badlogic.jpg");
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(0, 1, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.draw(
texture,
Gdx.graphics.getWidth()/2 - texture.getWidth()/2,
Gdx.graphics.getHeight()/2 - texture.getHeight()/2
);
batch.end();
}
...
所以问题如下。编译应用程序时,一切正常。但是如果你关闭应用程序并重新启动安装的应用程序,在应该显示纹理的地方显示黑色方块。
Android 暂停 activity 后丢失 GLContext。请参阅 http://www.badlogicgames.com/wordpress/?p=1073
如果您的目标是 Android 或 iOS,则不应为您的资产使用单例(或任何静态引用)。它们会泄漏,当您离开应用程序并恢复它时,您最终会得到 corrupted/blank 纹理。
例如,在 Android 上,当您关闭游戏(结束托管它的 Activity)时,Android 会保持您的应用程序打开,因此静态引用会被保留。当游戏再次打开时,一个新的 Activity 正在实例化以承载一个新的 OpenGL 表面。您所有的旧纹理和着色器都将来自过时的表面,但您的游戏并不知道这一点。此外,您可能已经泄露了所有的纹理内存。
这不仅发生在您关闭游戏时。类似的事情(GL 上下文丢失)有时可能仅在多任务离开和回来时发生。
尝试为您的 GameAsssetManager 实施 Disposable class 并释放 dispose() 方法中的所有资源。对于我的资产管理器,我也使用单例,而且我没有任何内存问题和其他问题。我的意思是,在 "onPause"、"onStop"、"onDestroy" 等生命周期方法中发布。并确保在再次启动应用程序时重新加载资源。