Быстро движущееся растровое изображение Silverlight не обновляется плавно

Когда я перемещаю путь с растровым изображением в 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>

person Eugenio De Hoyos    schedule 16.03.2011    source источник
comment
Вы действительно имеете в виду мерцание или заикание или дрожание? Я вижу заикание / дрожание очень редко, но не мерцает. Можете уточнить или подтвердить? Благодарю.   -  person DuckMaestro    schedule 16.03.2011
comment
Вы правы, заикание и дрожание - лучшие слова для описания проблемы. Я уже обновил исходное описание. Действительно, весь экран не мерцает. Проблема в том, что некоторые кадры пропускаются и обновление экрана заметно в виде горизонтальных полос ...   -  person Eugenio De Hoyos    schedule 16.03.2011


Ответы (1)


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

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

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

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

person Mario    schedule 16.03.2011
comment
Под пропущенными кадрами я подразумеваю то, что верхняя часть видимого экрана принадлежит кадру 1, средняя часть - кадру 2, а нижняя часть - кадру 3. Кажется, что кадры обновляются в памяти быстрее, чем они отображаются на экране. . Судя по тому, что вы сообщили, мое оборудование могло иметь какое-то отношение к этому, но я сомневаюсь в этом. Я добавлю код xaml, который показывает такое же разрывы даже на простом прямоугольнике, по крайней мере, в моей системе. - person Eugenio De Hoyos; 16.03.2011
comment
То же самое происходит с контурами, заполненными сплошной кистью, а не только с растровыми изображениями. Спасибо за рекомендации! - person Eugenio De Hoyos; 16.03.2011
comment
Ах, значит, вы говорите о слезах. Это действительно странно и действительно может иметь какое-то отношение к вашей видеокарте (драйверам). Не встречал ничего подобного ни в одном плагине (не более 1 разрыва из-за отключения vsync или чего-то еще). - person Mario; 16.03.2011
comment
Мы сейчас на одной волне, Марио. :) Я тестирую свой код на MacBook Pro под управлением Windows 7 на BootCamp (двойная загрузка). Видеокарта и процессор более чем приличны, и я не ожидал, что у них будут проблемы с драйверами (хотя могут быть проблемы с драйверами оборудования Apple ...). Странно то, что разрыв появляется только один раз примерно каждые 0,5–1 секунду. Это незаметно, но из-за этого экран выглядит водянистым. Лоща моего брата показывает аналогичную проблему, но не рвется, а заикается. Однако его характеристики намного ниже, чем у моих ноутбуков. - person Eugenio De Hoyos; 16.03.2011