У меня есть небольшое приложение для экспериментов (по существу, очень урезанная версия LunarLander в Android SDK) с одним SurfaceView
. У меня есть Drawable
«спрайт», который я периодически рисую в SurfaceView
Canvas
объекте в разных местах, не пытаясь стереть предыдущее изображение. Таким образом:
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 (Helios) в Windows 7
- JDK 6
- Android SDK Tools r9
- Приложение нацелено на Android 2.3.1
Тангенциальный вопрос:
Мой метод run()
по сути является упрощенной версией того, как работает пример LunarLander (со всей лишней логикой). Я не совсем понимаю, почему это не приведет к насыщению процессора, так как, похоже, ничто не мешает ему работать на полную мощность. Кто-нибудь может уточнить это?