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