C# 使用WriteableBitmapEx呈现TextBlock时OutOfMemoryException
我又和OutOfMemoryException打架了 我有一个代码片段,可以通过在WindowsPhone后台代理任务中使用来呈现一些图像,该任务的内存使用限制接近10M 以下几点效果不错:C# 使用WriteableBitmapEx呈现TextBlock时OutOfMemoryException,c#,windows-phone-8,C#,Windows Phone 8,我又和OutOfMemoryException打架了 我有一个代码片段,可以通过在WindowsPhone后台代理任务中使用来呈现一些图像,该任务的内存使用限制接近10M 以下几点效果不错: Deployment.Current.Dispatcher.BeginInvoke(() => { var wbBG = BitmapFactory.New(0, 0); var bmp = BitmapFactory.New(0, 0); for (int i = 0; i
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
var wbBG = BitmapFactory.New(0, 0);
var bmp = BitmapFactory.New(0, 0);
for (int i = 0; i < 30; i++)
{
using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{
wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg");
wbBG.Invalidate();
for (int j = 0; j < 6; j++)
{
bmp = BitmapFactory.New(0, 0).FromContent("Assets/" + j + ".png");
bmp = bmp.Resize(60, 60, WriteableBitmapExtensions.Interpolation.Bilinear);
wbBG.Blit(new Rect(j * 65, 0, 60, 60), bmp, new Rect(0, 0, 60, 60));
wbBG.Invalidate();
}
string filenameBG = "/Shared/" + i + ".jpg";
using (var stream = iso.CreateFile(filenameBG))
{
wbBG.SaveJpeg(stream, 480, 800, 0, 85);
stream.Close();
}
wbBG = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
}
NotifyComplete();
});
知道为什么文本块会导致更多的内存使用吗
此外,我认为没有更好的方法在图像上渲染文本
此外,文本块不可识别
嗯,这是我的意见,可能是错的,我会感谢任何帮助,谢谢 我不知道这个库,但是您忘记了在资源不再使用时释放它们,所以请尝试以下方法:
for (var i = 0; i < 30; i++)
{
using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg"))
{
wbBG.Invalidate();
for (int j = 0; j < 6; j++)
{
var tb = new TextBlock()
{
Text = j.ToString(),
//FontSize = 13,
//Height = 20,
//Width = 240,
//FontWeight = System.Windows.FontWeights.Bold,
//HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
//Foreground = new SolidColorBrush(Colors.White)
};
wbBG.Render(tb, new TranslateTransform() { X = j * 65, Y = 350 });
wbBG.Invalidate();
}
using (var stream = iso.CreateFile("/Shared/" + i + ".jpg"))
{
wbBG.SaveJpeg(stream, 480, 800, 0, 85);
}
}
}
}
什么是BitmapFactory?您知道您正在尝试渲染30个图像,并且有180个渲染调用吗?另外,为什么不在内部循环中构造控件并将6个调用减少为一个呢?另外,如果在第一个循环之前加载一次图像,就不会加载30次。那么为什么第一个可以工作呢?顺便说一句,我必须在每个循环中加载不同的图像。嗨,彼得,谢谢你的帮助,很抱歉延迟回复,我被一些紧急任务卡住了。是的,我同意我需要释放我使用的资源,但是,BitmapFactoryWriteableBitmap以及TextBlock不可识别,因此我不能使用using block或Close方法。
for (var i = 0; i < 30; i++)
{
using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg"))
{
wbBG.Invalidate();
for (int j = 0; j < 6; j++)
{
var tb = new TextBlock()
{
Text = j.ToString(),
//FontSize = 13,
//Height = 20,
//Width = 240,
//FontWeight = System.Windows.FontWeights.Bold,
//HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
//Foreground = new SolidColorBrush(Colors.White)
};
wbBG.Render(tb, new TranslateTransform() { X = j * 65, Y = 350 });
wbBG.Invalidate();
}
using (var stream = iso.CreateFile("/Shared/" + i + ".jpg"))
{
wbBG.SaveJpeg(stream, 480, 800, 0, 85);
}
}
}
}