Быстро движущееся растровое изображение Silverlight не обновляется плавно - PullRequest
0 голосов
/ 16 марта 2011

Когда я перемещаю заполненный растровый путь в Silverlight, обновляя его RenderTransform, изображение обновляется с заиканием / дрожанием примерно каждые полсекунды.

Путь использует BitmapCache, и аппаратное ускорение включено. Аппаратное ускорение проверяется с помощью параметра EnableCacheVisualization и наблюдения за высокой частотой кадров ~ 60 кадров в секунду.

Вы можете видеть, о чем я говорю здесь. Это работающее приложение Silverlight, демонстрирующее поведение при заикании. (Вы можете представить, какую игру я пытаюсь сделать, когда увидите изображение ...)

http://glerok.com/smb/index.html

Вы заметите, что растровое изображение плавно прокручивается, но каждые 0,5-1 секунды оно останавливается, как будто некоторые кадры пропускаются. Я проверил это на двух разных компьютерах.

Это ожидаемое поведение в silverlight или я что-то делаю не так, вручную обновляя RenderTransform объекта? (Пожалуйста, не принимайте это как возможность унижать Silverlight ...)

Заранее спасибо !!!

Вот код, который я использую для генерации пути:

        RectangleGeometry rg = new RectangleGeometry();

        BitmapImage bi = new BitmapImage(new Uri("world.png", UriKind.Relative));

        int WorldWidth = 703;
        int WorldHeight = 240;

        rg.Rect = new Rect(WorldTilePosition, 0, WorldWidth * Scale, WorldHeight * Scale);

        Path p = new Path { RenderTransform = new TranslateTransform { X = 0, Y = 0 } };

        p.Data = rg;
        p.CacheMode = new BitmapCache();
        p.Fill = new ImageBrush { ImageSource = bi };

        canvas.Children.Add(p);

А вот код, который обновляет позицию пути:

        WorldTilePosition-=10;
        TranslateTransform tt = WorldPath.RenderTransform as TranslateTransform;
        tt.X = -WorldTilePosition;

        if (WorldTilePosition < -1000) WorldTilePosition = 1000;

Я наблюдал заикание / дрожание в Silverlight даже для объекта, анимированного с раскадровкой. Я полагаю, это происходит из-за того, что в Silverlight в настоящее время нет никакой обратной буферизации, что делает его в настоящее время непригодным даже для простых игр на основе спрайтов на ПК? Обратите внимание, что общая частота обновления экрана по-прежнему составляет 60 кадров в секунду.

Приведенный ниже код создает анимированный прямоугольник, который мигает во время обновления экрана. Вертикальные объекты лучше видят полосы во время обновления, по крайней мере, на моем ноутбуке.

<Canvas x:Name="LayoutRoot2" Background="White">
    <Rectangle x:Name="myRect" Fill="Red" Width="100" Height="500" CacheMode="BitmapCache" >
        <Rectangle.RenderTransform>
            <TranslateTransform x:Name="myRectTransform" X="0" />
        </Rectangle.RenderTransform>
        <Rectangle.Triggers>
            <EventTrigger RoutedEvent="Rectangle.Loaded">
                <BeginStoryboard>
                    <Storyboard x:Name="myStoryboard" >
                        <DoubleAnimation
        From="0"
        To="1000"
        Storyboard.TargetName="myRectTransform"
        Storyboard.TargetProperty="X"
        Duration="0:0:1"
        AutoReverse="True"
        RepeatBehavior="Forever"
        />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Rectangle.Triggers>
    </Rectangle>
</Canvas>

1 Ответ

1 голос
/ 16 марта 2011

Не могу заметить какого-либо заикания на моем ПК (Core 2 Quad 3 ГГц, Win7 x64, IE9).

Специально для такой игры на основе тайлов с низкими разрешениями и т. Д. Я бы хотел использоватьWriteableBitmap (хорошую расширенную версию можно найти на Codeplex ), а затем обновлять / отображать только эту.Это также решает недостающий буфер.

Также, чтобы избежать заметного заикания, постарайтесь сохранить игровую логику независимой от частоты кадров (используя таймер или определяя количество пройденных миллисекунд с момента последнего кадра).Пропущенные кадры также не должны быть такими заметными.

Также попробуйте нарисовать только видимую часть ландшафта (не уверен, достаточно ли отсечения; не пробовал).

...