【发布时间】:2011-03-17 01:37:26
【问题描述】:
当我在 Silverlight 中通过更新其 RenderTransform 来移动一个位图填充路径时,图像大约每半秒更新一次。
Path 使用 BitmapCache,并且硬件加速已打开。使用 EnableCacheVisualization 选项验证硬件加速,并观察帧速率高达 60 fps。
你可以在这里看到我在说什么。这是一个显示口吃行为的有效 Silverlight 应用程序。 (当你看到图片时,你可能会想象我正在尝试制作什么游戏......)
http://glerok.com/smb/index.html
您会注意到位图滚动流畅,但每隔 0.5 到 1 秒就会出现断断续续的情况,就好像跳过了某些帧一样。我在两台不同的 PC 上验证了这一点。
这是 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目前没有后台缓冲,这使得它目前甚至不适合在PC上进行简单的基于精灵的游戏?请注意,报告的整体屏幕刷新率仍为 60 fps。
下面的代码会生成一个在屏幕刷新期间闪烁的动画矩形。至少在我的笔记本电脑上,垂直对象在刷新率期间显示更好的条带。
<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>
【问题讨论】:
-
您的真正意思是“闪烁”还是“口吃”或“抖动”?我很少看到口吃/抖动,但没有闪烁。你能澄清或确认吗?谢谢。
-
你说得对,口吃和抖动是描述问题的更好词。我已经更新了原始描述。确实,整个屏幕不闪烁。问题是某些帧被跳过并且屏幕刷新是明显的水平带......
标签: c# silverlight bitmapimage