Я разрабатываю игру для Android. Поскольку это моя первая игра для Android, я хотел, чтобы она была максимально простой. Я хочу отобразить последовательность случайных чисел (по одному). Между каждой парой чисел должно пройти заданное количество времени (в настоящее время я использую 500 мс).
Проблема в том, что задержка между двумя числами непостоянна (ни на эмуляторе, ни на реальном устройстве под управлением Android 2.3.4). Большую часть времени цифры изменяются с постоянной скоростью, но иногда появляется значительная и заметная задержка (даже достигающая более 1 секунды).
Я включаю части кода, отвечающие за рендеринг чисел. Я использую SurfaceView, и следующая часть — это метод run()
игрового цикла, реализованный в дополнительном потоке:
while (!mDone) {
long now = System.nanoTime();
if (mLastTime == -1) mLastTime = now;
long delta = now - mLastTime;
if (delta > 500000000) {
mNumberBox.update();
mLastTime = now;
}
if ((w > 0) && (h > 0)) {
Canvas canvas = mSurfaceHolder.lockCanvas();
if (canvas != null) {
mRenderer.drawFrame(canvas);
mSurfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
mNumberBox.update()
обновляет число, которое нужно нарисовать, и предполагается, что оно вызывается каждые 500 мс. Его код очень прост:
mCurrNumber = mRand.nextInt(9) + 1;
mRenderer.drawFrame()
отвечает за отображение числа на экране. Вот код:
canvas.drawRoundRect(mBoxRect, 45, 45, mBoxPaint);
String numStr = String.format("%d", mCurrNumber);
Rect bounds = new Rect();
mTextPaint.getTextBounds(numStr, 0, 1, bounds);
int height = bounds.bottom - bounds.top;
canvas.drawText(numStr, canvas.getWidth() / 2, canvas.getHeight() / 2 + height / 2, mTextPaint);
Я профилировал код, выполняя приложение примерно 260 секунд. Вот результаты, которые я нашел:
- Количество итераций цикла
run()
: 16765 - Среднее время на итерацию: 16 мс
- Максимальное время для всех итераций: 97 мс
Практически 100% этого времени уходит на drawFrame()
, особенно на вызовы lockCanvas()
и unlockCanvasAndPost()
, которых я не могу избежать.
Самое странное, что максимальное время для всех итераций составило 97 миллисекунд, что намного меньше, чем задержки, которые я замечаю при выполнении игры. Так что почему-то я считаю, что проблема может быть не в коде игрового цикла, а, возможно, в конфигурации или еще где-то. Есть ли у кого-нибудь совет?
w
иh
— это всего лишь две переменные, содержащие ширину и высоту холста. Во время создания представления они могут быть не инициализированы и, следовательно, равны нулю, но после этого их значения не меняются. Следовательно, условная проверка всегда истинна. - person betabandido   schedule 07.01.2012