我使用后面的示例(described here)为我的精灵表设置动画。
从示例中我写了我的对象:
public class Sprite {
private int x, y;
private int width, height;
private Bitmap b;
MainGamePanel ov;
int currentFrame = 0;
public Sprite(MainGamePanel mainGamePanel, Bitmap blob) {
this.ov = mainGamePanel;
this.b = blob;
// 1x12
height = b.getHeight();
width = b.getWidth()/12;
x = y = 50;
}
private void update(int dist) {
currentFrame = ++currentFrame % 12;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//return _b;
}
public void draw(int shift, Canvas canvas, int dist) {
update(dist);
int srcX = currentFrame * width;
Rect src = new Rect(srcX, 0, srcX+width, height);
Rect dst = new Rect(x, y+shift, x+width, y+height+shift);
canvas.drawBitmap(b, src, dst, null);
}
这里每100毫秒我从图像(位图)中获取不同的部分并显示它。
1 - > 2 - > 3 - > 4 - > ... - > 12
所以我的生物飞翔,翅膀移动。
如果我只显示 1 对象,那么看起来不错,但是当我尝试在循环中运行20个生物时:
Bitmap blob = BitmapFactory.decodeResource(getResources(), R.drawable.sprite3);
for(int i=0; i<20; i++){
spriteList.add(new Sprite(this, blob));
}
....
for(int i=0; i<spriteList.size(); i++){
sprite = spriteList.get(0);
sprite.draw(canvas, dist);
}
根据绘制的对象数量,我的对象开始变慢。
我认为这是因为Thread.sleep(100);
。
我没有看到任何性能问题。
听起来每个对象的睡眠都会暂停所有对象。
对于20个物体,这个睡眠会增加到2秒。
我确实使用的解决方法如下:
int sleep = 100/spriteList.size();
Thread.sleep(sleep);
但代码看起来很乱。
任何人都可以帮我解决问题吗?
这是 sprite3 图片:
[编辑]
也许我需要在单独的线程中创建每个对象?
答案 0 :(得分:1)
渲染时你绝对不应该睡觉;它会大大降低性能,尤其是在添加新的动画片段等时。另外,不要在onDraw方法中创建对象并尝试重用Rect对象。在渲染过程中创建对象非常昂贵。