-1

我有一个不同的过程会生成很多位图(最终它会模拟视频),我希望它显示在 C# 应用程序上。

我认为在内存映射文件中提供位图是最快的方法。当我运行以下代码时,我发现直接从磁盘构建位图更快。

    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。

这怎么可能?有没有更有效的内存映射方式?

4

1 回答 1

2

这并不奇怪。从从内存映射文件读取的数组中创建内存流会增加数据必须通过的额外层。

内存映射文件充当文件和视图访问器之间的层,提供对文件的随机访问。您没有使用此功能,因为您一次读取所有数据,因此直接从文件中读取数据到数组中会比从内存映射文件中读取数据更快。

内存流充当数组和从中读取的流之间的另一层。基本上,它在将所有数据传递给 Bitmap 对象之前通过另一个缓冲区复制所有数据。

于 2013-05-05T12:18:22.233 回答