Я определил этот вызов как узкое место в функции высокого давления.
graphics.DrawImage(smallBitmap, x , y);
Существует ли более быстрый способ смешать маленькие полупрозрачные растровые изображения в более крупную полупрозрачную?
Пример использования:
XY[] locations = GetLocs();
Bitmap[] bitmaps = GetBmps(); //small images sizes vary approx 30px x 30px
using (Bitmap large = new Bitmap(500, 500, PixelFormat.Format32bppPArgb))
using (Graphics largeGraphics = Graphics.FromImage(large))
{
for(var i=0; i < largeNumber; i++)
{
//this is the bottleneck
largeGraphics.DrawImage(bitmaps[i], locations[i].x , locations[i].y);
}
}
var done = new MemoryStream();
large.Save(done, ImageFormat.Png);
done.Position = 0;
return (done);
Вызовы DrawImage принимают небольшие растровые изображения 32bppPArgb и копируют их в большие растровые изображения в местах, которые различаются, и небольшие растровые изображения могут лишь частично перекрывать видимую область больших растровых изображений. Оба изображения имеют полупрозрачное содержимое, которое смешивается с помощью DrawImage таким образом, который важен для вывода. Я провел некоторое тестирование с BitBlt, но не увидел значительного улучшения скорости, и альфа-смешение не получилось таким же в моих тестах. Я открыт практически для любого метода, включая лучший вызов bitblt или небезопасного кода на C #.