- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个应用程序,其中使用 WriteableBitmap
进行对性能敏感的绘图。使用 CompositionTarget.Rendering
调用一个事件来实际更新 WriteableBitmap
的后台缓冲区。根据 MSDN 文档,这意味着事件在每帧触发一次,就在呈现控件之前。
我遇到的问题是 WriteableBitmap 的 Lock()
函数需要很长时间,尤其是在位图尺寸较大的情况下。我之前读到 AddDirtyRegion()
有一个错误,会导致整个位图无效,从而导致性能不佳。但是,这里似乎并非如此。从大量的低级检查来看,Lock()
似乎打开了位图的后台缓冲区以在渲染线程上写入,这意味着每次调用我的事件处理程序时,它都必须线程阻塞直到渲染线程已准备就绪。这会导致更新位图图形时明显滞后。
我已经尝试使用 TryLock()
向事件处理程序添加超时,这样它就不会阻塞这么长时间而导致性能下降。然而,这会导致类似的效果,因为它看起来滞后,因为大量的位图更新被集中在一起。
这是事件处理程序中的相关代码,以显示我在做什么。编写 UpdatePixels()
函数是为了避免使用可能有问题的 AddDirtyRect()
:
void updateBitmap(object sender, EventArgs e)
{
if (!form.ResizingWindow)
{
// Lock and unlock are important... Make sure to keep them outside of the loop for performance reasons.
if (canvasUpdates.Count > 0)
{
//bool locked = scaledDrawingMap.TryLock(bitmapLockDuration);
scaledDrawingMap.Lock();
//if (locked)
//{
unsafe
{
int* pixData = (int*)scaledDrawingMap.BackBuffer;
foreach (Int32Rect i in canvasUpdates)
{
// The graphics object isn't directly shown, so this isn't actually necessary. We do a sort of manual copy from the drawingMap, which acts similarly
// to a back buffer.
Int32Rect temp = GetValidDirtyRegion(i);
UpdatePixels(temp, pixData);
}
scaledDrawingMap.Unlock();
canvasUpdates.Clear();
}
//}
}
}
}
private unsafe void UpdatePixels(Int32Rect temp, int* pixData)
{
//int* pixData = (int*)scaledDrawingMap.BackBuffer;
// Directly copy the backbuffer into a new buffer, to use WritePixels().
var stride = temp.Width * scaledDrawingMap.Format.BitsPerPixel / 8;
int[] relevantPixData = new int[stride * temp.Height];
int srcIdx = 0;
int pWidth = scaledDrawingMap.PixelWidth;
int yLess = temp.Y + temp.Height;
int xLess = temp.X + temp.Width;
for (int y = temp.Y; y < yLess; y++)
{
for (int x = temp.X; x < xLess; x++)
{
relevantPixData[srcIdx++] = pixData[y * pWidth + x];
}
}
scaledDrawingMap.WritePixels(temp, relevantPixData, stride, 0);
}
我似乎无法弄清楚如何避免 WriteableBitmap 的线程阻塞问题,而且我在我编写的代码中看不到任何明显的错误。任何帮助或指示将不胜感激。
最佳答案
看起来您实际上并没有使用 BackBuffer 进行写入 - 仅用于读取。
WritePixels 写入“前端”缓冲区并且不需要锁定。我不知道您是否有其他原因要锁定它(其他线程正在做某事),但是对于此处的代码,我不明白您为什么需要这样做。
关于c# - WriteableBitmap.Lock() 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291233/
我想弄清楚如何释放 WriteableBitmap 内存。 在下一段代码中,我用来自“BigImage”(3600 * 4800 px,仅用于测试)的大量数据填充 WriteableBitmap 的后
我可以像这样成功加载以下位图并将其显示在 View 上的图像控件中。 var bitmapImage = new BitmapImage {
我目前有一个这样的循环: foreach(var item in theList) { //create writeablebitmap from item.GetPicture() which re
我正在将分形作为一个私有(private)项目来练习(离开初学者水平^^)。我有一个包含图像的 Canvas ,该图像绑定(bind)到 WriteableBitmap: 我的 View 模
问题来了。我想从本地驱动器打开一个文件,然后将它变成一个 WritableBitmap 以便我可以编辑它。但问题是,我无法从 Uri 或类似的东西创建 WritableBitmap。我也知道如何将文件
我正在用 WPF (C#) 编写一个应用程序,它对位图集合执行长时间操作。为了让我的应用程序保持响应,我决定使用另一个线程来执行位图操作并在主 UI 线程的进度条上报告进度。我原以为 Backgrou
我有一个 WritableBitmap,它在单独的线程上更新,特别是响应事件。 myWritableBitmap.Lock(); CopyMemory(myWritableBitmap.BackBuf
我正在 WP7 芒果中编写应用程序,并尝试将从绑定(bind)加载的图像转换为 XAML 中的 WriteableBitmap,例如:
我正在使用下面的代码创建一个基于 UI 元素的动态磁贴。它在 WriteableBitmap 上呈现 uiElement,保存位图 + 返回文件名。此方法在 Windows Phone 后台任务代理中
有一个简单的MSDN example关于可写位图。 它展示了如何通过在按下鼠标并在 WPF 图像控件上移动时仅更新一个像素来使用光标绘制手绘线。 writeableBitmap.Lock();
我创建了一个 Gray16 格式的 WriteableBitmap。我想将此 WriteableBitmap 调整为我已知的尺寸,保留像素格式(Gray16)。 有人致力于调整 WriteableBi
我有一些 WriteableBitmap 对象。假设实际上位于 WriteableBitmap 对象上的图像是 600x400。 我想复制部分图像 - 一些矩形(例如 WriteableBitmap
有没有办法将 WriteableBitmap 转换为字节数组?如果有办法从中获取可写位图,我也将其分配给 System.Windows.Controls.Image 源。我试过这个但是在 FromHB
我正在使用 PhotoChooserTask 从图库中挑选图像,这是我的设置 private void ApplicationBarIconButton_Click(object sender, Ev
我有一个应用程序,其中使用 WriteableBitmap 进行对性能敏感的绘图。使用 CompositionTarget.Rendering 调用一个事件来实际更新 WriteableBitmap
我已经尝试了几个小时,但我无法解决这个问题。 我有一个 UserControl,它是 800x369,它只包含一条形成世界地图的路径。我将其放在横向页面上,然后将其呈现为 WriteableBitma
我正在修改 ColorBasic Kinect 示例,以便显示覆盖到视频流的图像。所以我所做的是加载一个图像具有透明背景(现在是一个 GIF,但它可能会改变),并写入显示的位图。 我得到的错误是我正在
目标是渲染 2 行以 ... 结尾的文本。我认为问题是高度不会按照我告诉它的大小呈现(参见 maxHeight=30,但 actualHeight 82)。 “canvas”变量是一个可写的位图。 我
我在连接到图像控件的 Windows Phone 8 应用程序中有一个 WriteableBitmap。我循环遍历图像的每一行并一次异步绘制一行像素,然后安排下一行进行绘制。但是,更改基础像素数据似乎
我正在开发一个用于将图像上传到网络服务器的 Windows Phone 应用程序。我正在从我的设备中选择所有图像到一个列表对象。我正在将所有位图图像一张一张地转换为 byte[]。 我的代码 publ
我是一名优秀的程序员,十分优秀!