Android - плавная трансляционная прокрутка холста на основе движения асинхронного объекта
-
25-10-2019 - |
Вопрос
У меня есть игра в Android, в которой мяч движется на основе акселерометра. Мяч движется с переменной скоростью. В игре есть уровни, намного больше, чем экран смартфона, и поэтому я перевожу холст, когда мяч приближается к краю экрана, чтобы соответствовать большим уровням. Прокрутка работает, проблема плавно прокручивается на основе мяча.
Вот попытка, которая меняется на основе изменения позиции мяча между обновлениями:
// RIGHT SHIFT
shiftFactor = Math.abs(xCoor - prevXCoor);
if (ball.x + translateX > rightX * 0.8
&& rightX < levelWidth + padding) {
translateX -= shiftFactor;
leftX += shiftFactor;
rightX += shiftFactor;
}
Это выглядит нервным.
Вот попытка, которая меняется на основе какой -то постоянной.
int shiftFactor=2;
//SHIFT SCREEN RIGHT
if (ball.x + translateX > RightPerimeter * 0.8 && rightPerimeter < levelWidth) {
translateX -= shiftFactor;
viewPortLeft += shiftFactor;
viewPortRight += shiftFactor;
}
Для более низких значений Shiftfactor, он плавно прокручивает, но мяч может легко «опередить» прокрутку. Для более крупных Shiftfactors прокрутка становится постепенно Choppier.
Какие-либо предложения? Спасибо.
Решение
Ваша проблема в том, что ваша частота кадров слишком низкая. По моему опыту, Canvas не очень подготовлен для игры в реальном времени с хорошей частотой кадров. Вы увидите большой прирост производительности, если переключитесь на рендеринг с OpenGL.