Как получить плавную анимацию в SkiaSharp - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь добиться плавной анимации, используя Xamarin SkiaSharp.Основной проблемой является время между вызовом canvasView.InvalidateSurface ();и нажатие на mathod OnCanvasViewPaintSurface для выполнения перерисовки может варьироваться от 3 до 30 мс, что дает несколько резкий вид при перемещении объекта по экрану.Я попытался смягчить это, добавив мертвый цикл в коде отрисовки, который помогает некоторым, но не является хорошим решением.Я не понимаю, почему время так сильно меняется, и я не вижу в этом никакого пути.Вы не можете заснуть в коде розыгрыша.Как игры достигают плавной анимации?Мой код следует

    async Task DoAnimationLoop()
    {
        while (DoAnimation)
        {
            AccumulatedTime = StopWatch1.ElapsedMilliseconds;

            await Task.Delay(TimeSpan.FromMilliseconds(5));

            if (AccumulatedTime > 50)
            {
                StopWatch1.Restart();
                MoveItems();
                SKCanvasView canvasView = Content as SKCanvasView;
                TotalBounds = new Size(canvasView.Width, 
                                       canvasView.Height);
                canvasView.InvalidateSurface();
            }
        }
    }

    private void OnCanvasViewPaintSurface(object sender, 
                                          SKPaintSurfaceEventArgs e)
    {
        AccumulatedTime = StopWatch1.ElapsedMilliseconds;

        while (AccumulatedTime < 30)
        {
            AccumulatedTime = StopWatch1.ElapsedMilliseconds;
        }

        e.Surface.Canvas.Clear();
        e.Surface.Canvas.DrawBitmap(Background, 0, 0);

        foreach(Item item in AllItems)
        {
            e.Surface.Canvas.DrawBitmap(item.CurrentBitmap, 
            item.CurrentPositionX, item.CurrentPositionY);

        }
    }
...