在 libgdx 中有效地加载图像
load images efficiently in libgdx
我想加载一个大字节[] 的颜色。在 opengl 中,我想像视频一样绘制它(用于启动画面)。
现在,我像 GIF 一样加载每个像素图,但它占用太多内存 (RAM)。 (我是在 Android 平台上用 libgdx 做的)。
public ImageSequences(int width, int height, byte[][] pixmaps) {
this.width = width;
this.height = height;
this.frameCount = pixmaps.length;
this.data = new Pixmap[frameCount];
for (int i = 0; i < frameCount; i++) {
this.data[i] = new Pixmap(width, height, mainFormat);
Pixmap p = new Pixmap(pixmaps[i], 0, pixmaps[i].length);
this.data[i].drawPixmap(p, 0, 0, p.getWidth(), p.getHeight(), 0, 0, width, height);
p.dispose();
}
this.base = new Texture(width, height, mainFormat);
}
int lastIndx = -1;
public Texture getKey(float timeState) {
int i = Math.round(timeState * 60) % frameCount;
if (lastIndx == i)
return base;
lastIndx = i;
base.draw(data[i], 0, 0);
return base;
}
和
int I = 574 + 1;// 574
byte[][] dats = new byte[I][];
int width = 1400;
int height = 720;
for (int i = 0; i < I; i++) {
dats[i] = Gdx.files.internal(String.format("seq/anim_%05d.jpg", i)).readBytes();
}
anim = new ImageSequences(width, height, dats);
使用视频播放器方法看起来效率更高。有什么解决办法吗?
我希望,它可以在多平台上完成并且不需要额外的库。
编辑:有 500 多张图片和 1280x720 像素或更高。
抱歉英语不好,谢谢。
您应该尝试使用 AssetManager。
AssetManager 将为您处理资产(示例多次使用)。
您必须在使用前加载您的资产。
this.assetManager.load("Your internal Path", Texture.class);
assetManager.finishLoading();//optional but he just wait the end of assetLoading
然后你就可以得到你的资产了。
资产的加载可以在应用程序或屏幕启动时提前异步完成。
您可以在 libGdx gitHub wiki
中查看更多相关信息
另外我认为你应该使用 Texture 而不是 PixMap
和
更改 ImageSequence 构造函数
public ImageSequences(int width, int height, List<Texture> textures) {
....
}
之后 imageSequence 只需更改当前纹理即可制作动画。
纹理class 将直接为您处理位。而Texture Object可以直接由assetManager创建
Teture texture = assetManager.get("Your internal Path", Texture.class);
我想加载一个大字节[] 的颜色。在 opengl 中,我想像视频一样绘制它(用于启动画面)。 现在,我像 GIF 一样加载每个像素图,但它占用太多内存 (RAM)。 (我是在 Android 平台上用 libgdx 做的)。
public ImageSequences(int width, int height, byte[][] pixmaps) {
this.width = width;
this.height = height;
this.frameCount = pixmaps.length;
this.data = new Pixmap[frameCount];
for (int i = 0; i < frameCount; i++) {
this.data[i] = new Pixmap(width, height, mainFormat);
Pixmap p = new Pixmap(pixmaps[i], 0, pixmaps[i].length);
this.data[i].drawPixmap(p, 0, 0, p.getWidth(), p.getHeight(), 0, 0, width, height);
p.dispose();
}
this.base = new Texture(width, height, mainFormat);
}
int lastIndx = -1;
public Texture getKey(float timeState) {
int i = Math.round(timeState * 60) % frameCount;
if (lastIndx == i)
return base;
lastIndx = i;
base.draw(data[i], 0, 0);
return base;
}
和
int I = 574 + 1;// 574
byte[][] dats = new byte[I][];
int width = 1400;
int height = 720;
for (int i = 0; i < I; i++) {
dats[i] = Gdx.files.internal(String.format("seq/anim_%05d.jpg", i)).readBytes();
}
anim = new ImageSequences(width, height, dats);
使用视频播放器方法看起来效率更高。有什么解决办法吗?
我希望,它可以在多平台上完成并且不需要额外的库。
编辑:有 500 多张图片和 1280x720 像素或更高。
抱歉英语不好,谢谢。
您应该尝试使用 AssetManager。 AssetManager 将为您处理资产(示例多次使用)。
您必须在使用前加载您的资产。
this.assetManager.load("Your internal Path", Texture.class);
assetManager.finishLoading();//optional but he just wait the end of assetLoading
然后你就可以得到你的资产了。
资产的加载可以在应用程序或屏幕启动时提前异步完成。
您可以在 libGdx gitHub wiki
中查看更多相关信息另外我认为你应该使用 Texture 而不是 PixMap
和
更改 ImageSequence 构造函数
public ImageSequences(int width, int height, List<Texture> textures) {
....
}
之后 imageSequence 只需更改当前纹理即可制作动画。
纹理class 将直接为您处理位。而Texture Object可以直接由assetManager创建
Teture texture = assetManager.get("Your internal Path", Texture.class);