【问题标题】:WriteableBitmap SetValue performance / Texture2D SetDataWriteableBitmap SetValue 性能/Texture2D SetData
【发布时间】:2012-02-17 11:43:20
【问题描述】:

我只是想知道是否有人知道(wp7 上的性能明智)逐像素更新 WriteableBitmap 的最佳方法...我可以看到 Pixels.SetValue 方法,它可以采用颜色和单个位置。但当然更快的选择是先设置一个数组,然后一次性设置 SetValue(theArray) ......像这样......

Int32[] pixels = bmp.Pixels;
for(Int32 y = 479; y > 0; y--)
    for (Int32 x = 0; x < 480; x++)
    {
        pixels[x + (y * 480)] = 0;
    }
bmp.Pixels.SetValue(pixels);

但似乎没有那个选项???

在这里,我只是将所有内容都设置为黑色......但如果我想做更多......

所以基本上,我只是问逐像素操作/创建位图并获得最佳性能的最佳方法是什么? (考虑在每个刻度上更新位图)

编辑:我刚刚注意到 Texture2D.SetData(theArray) 具有此功能,任何人都可以评论它的性能吗?或者推荐一种更好的方法?

【问题讨论】:

  • 我不认为位图和出色的性能会一起出现。是否要以 60fps 刷新整个屏幕?
  • 一个方法不会因为你传递一个数组而神奇地变快。 WriteableBitmap.Pixels 只是一个数组,当您尝试从 WriteableBitmap 生成实际图像时,处理完成。因此,自己编写 Pixels 数组中的所有值,或调用将复制 Pixels 数组中数组内容的方法在性能方面大致相同。
  • 我稍微改变了它.. UpdateInterval 设置为 TimeSpan(60000) 我只是操纵一个 Int32[] _pixels = new Int32[230400] 并且在绘图事件中我只是调用 myTexture2D.SetData(_pixels) 看起来很流畅...虽然我还没有在设备上测试过...
  • 好的,我制作了 gameTimer.UpdateInterval = TimeSpan.Zero ... 现在它就像... 超快 :D 在 TimeSpan 中放低数字似乎会导致延迟... 我猜什么时候它的 TimeSpan.Zero 它做了一些不同的事情......现在我必须自己拖延,因为它太快了;)

标签: c# performance windows-phone-7 graphics writeablebitmap


【解决方案1】:

您可以创建一个位图,为其提供一个字节数组。 Bitmap 的构造函数之一允许这样做。查看thisthis

因此,最好的方法可能是对数组进行操作并在需要时从中创建位图。但当然要画线、圆等,最好使用一些绘图功能。

【讨论】:

  • 不错,看看这是否比更新 Texture2D 更快会很有趣(尽管我猜每帧创建一个新的位图类会占用几个周期?)跨度>
  • 有趣的是你可以使用 IntPtr 结构,但你不能使用不安全的代码,因此不能在 windows phone 7 中创建经典意义上的指针(即 Int32* myInt)
  • 逐像素修改位图感觉很慢。如果你想更快地使用尽可能简单和原始的方法。找出答案的最好方法是运行一些测试。
  • 是的,看起来我能得到的最好的纹理是 240x300 左右的纹理......然后我在 spritebatch.Draw 方法中对其进行非均匀缩放......并且 UpdateInterval 设置为 66666跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2020-07-30
  • 2017-03-20
  • 2013-11-03
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多