java - 如何有效地在 Canvas 上绘制多个像素?

标签 java android

我正在 Android 上使用 Java 制作我的第一个游戏。我需要绘制很多像素,它们一起应该创建一条线。我的第一个方法是创建一个大型 boolean 值数组,创建一个循环,并在关联的 boolean 值为 true 时绘制一个像素。

这当然不是一个好主意(数组大约为 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 是帧数。

最佳答案

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.ANTI_ALIAS_FLAG); 油漆.setColor(颜色.红色); 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);
    }
}

关于java - 如何有效地在 Canvas 上绘制多个像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6750820/

相关文章:

java - 在 java 类的 main 方法中按名称访问和填充数组(通过成员函数创建)

java - session.flush 在这里如何帮助释放内存?

java - 尝试从 JSONArray 中检索 JSONObject 时返回 null?

java - 在 for 循环之外访问数组索引

android - 此应用与三星 GT-P3110 不兼容

java - Android Studio 二次方程NaN

android - react native firebase 创建用户然后将其他数据添加到实时数据库

android - TextView TextAllCaps 崩溃的应用程序

android - 如何在 React Native 应用程序名称中添加空格?

android - 有没有办法在android中通过图像设置操作栏背景?