libgdx开发记录

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 应该算是一个普通图片来显示对应文字.

 

 

 

猜你喜欢

转载自freyja.iteye.com/blog/2001449