如何在画布上有效地绘制许多像素?

时间:2011-07-19 16:44:49

标签: java android

我正在Android上使用Java制作我的第一款游戏。我需要绘制很多像素,它们应该共同创建一条线。我的第一种方法是制作一大堆布尔值,创建一个循环,并在关联的布尔值为真时绘制一个像素。

当然不是一个好主意(阵列大约是200x300)。现在我只记得线的第一个像素的位置,并且每个下一个像素都必须记住他的追随者。它工作得很好,但是当线路变长(但仍然不是很长)时,效率很差(在4000帧之后<20 fps)。

这是我用来绘制一条线的功能(现在只有一条线)。有人可以帮助我提高效率吗?

public void drawLine(Canvas canvas, int beginx, int beginy) {
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(Color.RED);
    paint.setStrokeWidth(3);

    int x = beginx;
    int y = beginy;
    while(C.mGrid[x][y].nx != -1) {
        //canvas.drawLine(x, y, C.mGrid[x][y].nx, C.mGrid[x][y].ny, paint);
        canvas.drawPoint(x, y, paint);
        Grid temp = C.mGrid[x][y];
        if ((C.mGrid[x][y].nx == x) && (C.mGrid[x][y].ny == y)) break;
        x = temp.nx;
        y = temp.ny;
    }
}

和Grid.java:

package com.qwak.achtung;

public float x = 0,y = 0;
public int px = -1, py = -1, nx = -1, ny = -1;

public Grid(float x, float y) {
    this.x = x;
    this.y = y;
}

public void set(int px, int py, int nx, int ny) {
    this.px = px;
    this.py = py;
    this.nx = nx;
    this.ny = ny;
}

public void setp(int px, int py) {
    this.px = px;
    this.py = py;
}

public void setn(int nx, int ny) {
    this.nx = nx;
    this.ny = ny;
}

PS:看起来这http://c.wrzuta.pl/wi10559/11f7d10b00110e504e25ebd3/0/andek 14是fps(在我的手机上(三星Spica)它运行得更好 - 40但是一段时间后它减少到20甚至更少)和983是帧数。

2 个答案:

答案 0 :(得分:4)

canvas对象中有一个drawLine方法。

使用此处的示例:How to draw a line in android

canvas.drawLine(0, 0, 20, 20, paint);

如果要绘制曲线。找到曲线的功能。例如抛物线是x = y ^ 2。你可以从曲线中得到点:1 = 1,2 = 4,3 = 9,4 = 16 ......等。如果你的像素逐像素,你可以插入你的x并得到你的y并绘制它。

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setColor(Color.RED); paint.setStrokeWidth(3);

for(int i = beginx; i < CanvasWidth; i++)
{
    int x = i;
    int y = i * i; //x=y^2
    canvas.drawPoint(x, y, paint);
}

要记录所访问的积分,您可以执行以下操作:

class Point
{
    int x;
    int y;
}


List<Point> points = new List<Point>();

onMove(int newX, int newY)
{
    Point p = new Point();
    p.x = newX;
    p.y = newY;

    points.add(p);
}


onDraw()
{
    for(Point p : points)
    {
        canvas.drawPoint(p.x, p.y, paint);
    }
}

答案 1 :(得分:0)

您想查看bresenham算法。 bresenham算法是绘制或栅格化线的方法。它与某个角度的网格细分有点不同,例如莫顿曲线。这有点像计算每个角度的标量积,如回忆Traversing a 2D array in an angle