【问题标题】:Silverlight Fast Moving Bitmap Does Not Update SmoothlySilverlight 快速移动位图不平滑更新
【发布时间】: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


【解决方案1】:

在我的 PC(Core 2 Quad 3 GHz、Win7 x64、IE9)上看不到任何卡顿。

特别是对于这种具有低分辨率精灵等的基于瓷砖的游戏。我会考虑使用WriteableBitmap(可以在Codeplex 上找到一个不错的扩展版本),然后只更新/显示那个。这也解决了缺少的后备缓冲区。

此外,为避免明显的卡顿,请尽量让您的游戏逻辑独立于帧速率(使用计时器或检测自上一帧以来经过的毫秒数)。跳帧也不应该那么明显。

还尝试仅绘制风景的可见部分(不确定剪裁是否足够;没有尝试过)。

【讨论】:

  • 我说的跳帧是指可见屏幕的上半部分属于第1帧,中部分属于第2帧,下半部分属于第3帧。看来帧更新在内存比它们在屏幕上绘制的速度更快。根据您的报告,我的硬件似乎与它有关,但我对此表示怀疑。我将添加一些 xaml 代码,即使在一个简单的矩形上也会显示相同的撕裂,至少在我的系统上是这样。
  • 同样,用实心画笔填充的路径也会发生同样的情况,而不仅仅是位图。感谢您的推荐!
  • 啊,所以你说的是撕裂。这真的很奇怪,确实可能与您的显卡(驱动程序)有关。在任何插件中都没有看到类似的东西(由于禁用了 vsync 或其他原因,最多 1 次撕裂)。
  • 我们现在意见一致,马里奥。 :) 我正在在 BootCamp(双启动)上运行 Windows 7 的 MacBook Pro 上测试我的代码。显卡和处理器非常不错,我不希望它们有驱动程序问题(尽管Apple硬件驱动程序可能存在问题......)。奇怪的是,撕裂大约每 0.5 到 1 秒才会出现一次。它很微妙,但它使屏幕看起来很水。我兄弟的戴尔显示了类似的问题,但它结结巴巴而不是撕裂。不过,他的规格比我的笔记本电脑低得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多