private void Render(double interpolate = 1)
        {
            if (!surfaceHolder.Surface.IsValid)
            {
                return;
            }

            Canvas canvas;

            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
            {
                canvas = surfaceHolder.LockHardwareCanvas();
            }
            else
            {
                canvas = surfaceHolder.LockCanvas();
            }
            canvas.DrawBitmap(background.Bitmap, background.X, background.Y, null);

            for (int i = 0; i < birds.Count; i++)
            {
                Bird bird = birds.ElementAt(i);
                canvas.DrawBitmap(bird.Bitmap, (float)(bird.X), bird.Y, null);
            }

            canvas.DrawBitmap(hero.Bitmap, (float)(hero.X), hero.Y, null);

            if (stones.Count > 0)
            {
                for (int i = 0; i < stones.Count; i++)
                {
                    Stone stone = stones.ElementAt(i);
                    // Interpolate is used to render object at place where player expects to see object,
                    // but not, where the object actually is!
                    canvas.DrawBitmap(stone.Bitmap, (float)(stone.X), (float)(stone.Y - (stone.Speed * interpolate)), null);
                }
            }

            canvas.DrawText(score.ToString(), 5, 35, scorePaint);

            surfaceHolder.UnlockCanvasAndPost(canvas);
        }