Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我尝试在Android上从sprite创建动画对象时,它们开始变慢_Android_Animation_Bitmap_Sprite - Fatal编程技术网

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

当我尝试在Android上从sprite创建动画对象时,它们开始变慢,android,animation,bitmap,sprite,Android,Animation,Bitmap,Sprite,我使用下面的示例()来设置我的精灵表的动画 根据示例,我编写了我的对象: 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;

我使用下面的示例()来设置我的精灵表的动画

根据示例,我编写了我的对象:

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->…->十二,

所以我的生物用翅膀飞翔和移动

如果我只显示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);
}
但代码看起来很混乱

谁能帮我修一下吗

以下是sprite3图像:

[编辑]


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

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

好的,我理解你关于重用
Rect
的观点,但我需要在我的精灵表上以某种方式切换,延迟100毫秒。我不睡觉怎么做?谢谢如果您想严格控制何时绘制下一帧,我建议在更新方法中输入时间,并计算是否绘制以及绘制哪一帧。规则是让渲染尽可能快,但要有选择地绘制。
int sleep = 100/spriteList.size();
Thread.sleep(sleep);