У меня есть небольшое экспериментальное приложение (по сути, очень урезанная версия LunarLander в Android SDK) с одним SurfaceView
. У меня есть "спрайт" Drawable
, который я периодически рисую в объекте Canvas
SurfaceView
в разных местах, не пытаясь стереть предыдущее изображение. Таким образом:
private class MyThread extends Thread {
SurfaceHolder holder; // Initialised in ctor (acquired via getHolder())
Drawable sprite; // Initialised in ctor
Rect bounds; // Initialised in ctor
...
@Override
public void run() {
while (true) {
Canvas c = holder.lockCanvas();
synchronized (bounds) {
sprite.setBounds(bounds);
}
sprite.draw(c);
holder.unlockCanvasAndPost(c);
}
}
/**
* Periodically called from activity thread
*/
public void updatePos(int dx, int dy) {
synchronized (bounds) {
bounds.offset(dx, dy);
}
}
}
Запустив эмулятор, я наблюдаю, что после того, как произошло несколько обновлений, несколько старых "копий" изображения начинают мерцать, т.е. то появляются, то исчезают. Сначала я предположил, что, возможно, я неправильно понял семантику Canvas
, и что он каким-то образом поддерживает «слои», и что я забивал его до смерти. Однако затем я обнаружил, что получаю этот эффект, только если пытаюсь обновлять быстрее, чем примерно каждые 200 мс. Итак, моя следующая лучшая теория заключается в том, что это, возможно, артефакт эмулятора, который не может идти в ногу и разрывает дисплей. (У меня пока нет физического устройства для тестирования.)
Верна ли какая-либо из этих теорий?
Примечание: на самом деле я не хочу делать это на практике (т. е. рисовать сотни наложенных друг на друга копий одного и того же объекта). Однако я хотел бы понять, почему это происходит.
Окружающая среда:
- Eclipse 3.6.1 (Гелиос) в Windows 7
- JDK 6
- Инструменты Android SDK r9
- Приложение предназначено для Android 2.3.1.
Касательный вопрос:
Мой метод run()
по сути представляет собой урезанную версию того, как работает пример LunarLander (с удаленной лишней логикой). Я не совсем понимаю, почему это не будет насыщать ЦП, поскольку, похоже, ничто не мешает ему работать на полную мощность. Кто-нибудь может это прояснить?