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