昨天我问了一个关于 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)
我尝试使用我的主线程创建一个单独的线程来渲染和进入游戏循环,但这仍然不起作用。