欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

libgdx开发记录

程序员文章站 2022-03-06 22:16:32
...

libgdx开发各种记录,对客户端开发一窍不通:

1.发现libgdx开发的游戏场景有内存泄露的情况,一开始以为是某些性能问题.但是没有仔细查找原因.

后来打开jvirtualvm,查看什么对象在不停的增长.结果发现Texture 在不停的被创建.说明有地方在不停的加载贴图资源? 想不出什么原因.然后通过排除法一个stage 一个actor 的排除.最终定位在一个 "血条"的actor实现上.

不会画血条,代码是从网上copy的.

 

public void draw(SpriteBatch batch, float parentAlpha) {

Pixmap pixmap = new Pixmap(64, 8, Format.RGBA8888); //生成一张64*8的图片
pixmap.setColor(Color.BLACK); //设置颜色为黑色
pixmap.drawRectangle(0, 0, titleWidth, pixHeight); //绘制边框
Texture pixmaptex = new Texture(pixmap); //生成图片
TextureRegion pix = new TextureRegion(pixmaptex, titleWidth, pixHeight); //切割图片
batch.draw(pix, this.getX(), this.getY() + this.titleHeight
        + this.margin); //绘制

}

 这里每帧都创建一次Texture 并且没有销毁.  不应该每帧都 进行一次这种逻辑.而是血量发生变化才create Texture. 客户端开发应该注意这种问题.

 

 

 

2.我喜欢用arrayList,而libgdx大量的运用了自己实现的 Array.看了下注释.是说删除的时候如果不需要保持顺序能避免内存拷贝. 对于需要对list进行添加 删除的地方能起到一个优化作用.

 

3.显示FPS

	@Override
	public void act() {
		super.act();
		fpsLabel.setText("FPS:"
				+ Gdx.graphics.getFramesPerSecond());
	}

 fps本身就是每帧就要刷新一次.写法倒是没问题.但是出于上面问题1的忧虑.我看了下 setText方法.结果发现在这里作者有一个优化过程:

public void setText (CharSequence newText) {
		if (newText instanceof StringBuilder) {
			if (text.equals(newText)) return;
			text.setLength(0);
			text.append((StringBuilder)newText);
		} else {
			if (newText == null) newText = "";
			if (textEquals(newText)) return;
			text.setLength(0);
			text.append(newText);
		}
		invalidateHierarchy();
	}

 如果是StringBuilder对象则直接比较是否需要重新绘制.对比普通的CharSequence 比较方法有一个优化的提升.

 

4.中文问题

输入中文问题还没处理过,中文文件名.文件中文字符问题 有一些重写方法.

作者的一些读取文件方法采用的是ISO-8859-1 编码. 所以该重写就重写. 中文文件名 android直接不支持 .所以不要取中文的文件夹和的名称

 

5.读取文件夹问题.

很多人可能没这个必要.但是如果你的资源文件很多.例如一个文件夹里面有一堆的音频文件.

办法A,在代码里面一个名字一个名字的写读取方法.

办法B,读取文件夹.然后listFiles().

 

选择方法B的时候,你就会遇到一个读取文件夹问题.android里面读取文件夹 list()方法会返回空数组.读不到子文件夹列表.但是把文件夹读取会得到一个子文件名的字符串.然后通过分割来知道文件夹内有哪些文件.

在桌面程序导出为jar则不能读取文件夹.经过不懈的努力.我发现把文件夹放在jar同级目录.然后通过

Gdx.files.local 可以顺利读取.

 

6.int与float

客户端最好用浮点数计算.因为会产生微小的变化而被int给约去.遇到一个奇怪的问题,计算与预期有偏差.不过很快就排查出来是int类型约去的小数点.

 

7.api问题.

作者提供了部分api,最好都看看

例如

 

	static public final int random (int range) {
		return random.nextInt(range + 1);
	}

 

这个就是产生 0-n 而不是0-n-1的随机数.

 

8.该重写的就重写

例如TmxMapLoader 不支持ImageLayer

TextureAtlas不支持根据名字前缀查找.就重写实现.

 

9.字体问题.

字体问题没搞明白 字体大小和颜色问题.BitmapFont 应该算是一个普通图片来显示对应文字.