我有一个不同的过程会产生很多位图(最终它会模拟一个视频),我希望它显示在一个C#应用程序上。
我认为在内存映射文件中提供位图是最快的方法。当我运行以下代码时,我发现直接从磁盘构建Bitmap更快。
int length = 153718;
var mmf1 = MemoryMappedFile.CreateFromFile(@"C:\tests\test.bmp",
FileMode.OpenOrCreate,
null);
var reader = mmf1.CreateViewAccessor(0, 0, MemoryMappedFileAccess.Read);
byte[] buffer = new byte[length];
MemoryStream memstream = new MemoryStream(buffer);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
reader.ReadArray<byte>(0, buffer, 0, length);
Bitmap bmp = new Bitmap(memstream);
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}",
stopwatch.Elapsed);
stopwatch.Reset();
stopwatch.Start();
Bitmap bmp2 = new Bitmap(@"C:\tests\test2.bmp");
stopwatch.Stop();
Console.WriteLine("Time elapsed: {0}",
stopwatch.Elapsed);
结果是:
已过去的时间:00:00:00.0074231
时间流逝:00:00:00.0023245
我只定时运行的重复代码(不包括设置)
两个位图都是相同的图像,相当小的640 * 480 bmp。
怎么可能?是否有更有效的内存映射方式?
答案 0 :(得分:2)
这并不奇怪。从内存映射文件中读取数组中的内存流会添加数据必须通过的额外层。
内存映射文件充当文件和视图访问器之间的层,提供对文件的随机访问。您没有使用此功能,因为您一次读取所有数据,因此直接从文件读取数据到数组将比从内存映射文件中读取数据更快。
内存流充当数组和从中读取的流之间的另一层。基本上,它会在将所有数据传递到Bitmap对象之前通过另一个缓冲区复制所有数据。