1

昨天我问了一个关于 Android 图形的问题,现在我已经启动并运行了基础,我已经在我的自定义视图类中创建了一个渲染循环。

protected void render() {
    long startTime = System.nanoTime();
    long elapsedTime;
    while (Main.running) {
        Bitmap image = Bitmap.createBitmap(Main.WIDTH, Main.HEIGHT, null); //creates new Bitmap to draw onto
        Canvas canvas = new Canvas(image); //new Canvas with the attached blank Bitmap
        long newTime = System.nanoTime();
        elapsedTime = newTime - startTime;
        if (elapsedTime >= 1000000000/60) { //if enough time has passed for it to update
            startTime = newTime;
            Main.player.render(canvas); //this renders a test object, see below
        }
        display = Bitmap.createBitmap(image); //this writes to the display Bitmap that is drawn in onDraw, see below
        invalidate(); //invoke onDraw()
    }
}

这是绘制我的播放器图像的代码(如果我绘制一次而不是循环绘制它就可以工作。)

public void render(Canvas c) {
        int xp = (int) x;
        int yp = (int) y;
        c.drawBitmap(Images.box, xp, yp, null);
    }

在 onDraw 里面:

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(display, 0, 0, null);
    }

如果我只渲染播放器并调用invalidate()一次,而不是循环多次,它显示得很好(而且花花公子)。但是,当我将它放在循环块中时,它不会呈现。

根据我的日志,循环是函数式的并且调用invalidate(),但它在循环期间从未真正进入onDraw方法。

如果有人可以解释为什么会发生这种情况,那将非常重要,如果您需要更多信息,请告诉我,我会提供。

编辑: 在我的主 Activity 类中,我有一个用于游戏逻辑的线程,然后在启动逻辑线程后使用主线程进入渲染循环。

Thread update = new Thread() { //game logic thread
            public void run() {
                loop(); //game logic loop
            }
        };
        update.start(); //start logic thread
        surface.render(); //start render loop (surface is the name of my custom view)

我尝试使用我的主线程创建一个单独的线程来渲染和进入游戏循环,但这仍然不起作用。

4

0 回答 0