当我通过更新其RenderTransform在Silverlight中移动位图填充路径时,图像会每隔半秒更新一次口吃/抖动。
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>
答案 0 :(得分:1)
我的电脑上没有任何卡顿声(Core 2 Quad 3 GHz,Win7 x64,IE9)。
特别是对于具有低分辨率精灵等的这种基于图块的游戏。我考虑使用WriteableBitmap
(可以在Codeplex上找到一个很好的扩展版本),然后只更新/显示那个。这也解决了丢失的后备缓冲。
另外,为避免明显的口吃,请尽量保持游戏逻辑与帧速率无关(使用定时器或检测自上一帧以来经过的毫秒数)。跳过的帧不应该那么明显。
还尝试仅绘制景观的可见部分(不确定裁剪是否足够;没有尝试)。