当我尝试在Android上使用sprite创建动画对象时,它们开始变慢

时间:2013-06-28 15:09:06

标签: android animation bitmap sprite

我使用后面的示例(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 图片:enter image description here

[编辑]

也许我需要在单独的线程中创建每个对象?

1 个答案:

答案 0 :(得分:1)

渲染时你绝对不应该睡觉;它会大大降低性能,尤其是在添加新的动画片段等时。另外,不要在onDraw方法中创建对象并尝试重用Rect对象。在渲染过程中创建对象非常昂贵。