Какой самый быстрый способ нарисовать изображение на другом изображении? - PullRequest
0 голосов
/ 15 апреля 2009

У меня есть 3 точки растрового изображения.

Bitmap* totalCanvas = new Bitmap(400, 300, PixelFormat32bppARGB);  // final canvas
Bitmap* bottomLayer  = new Bitmap(400, 300,PixelFormat32bppARGB); // background
Bitmap* topLayer = new Bitmap(XXX); // always changed. 

Я нарисую сложный фон на нижнем слое. Я не хочу перерисовывать сложный фон на totalCanvas снова и снова, поэтому я сохранил его в bottomLayer.

TopLayer часто меняется. Я хочу нарисовать bottomLayer для totalCanvas. Какой самый быстрый способ?

Graphics canvas(totalCanvas); 
canvas.DrawImage(bottomLayer, 0, 0);  step1
canvas.DrawImage(topLayer ,XXXXX);   step2

Я хочу, чтобы шаг 1 был максимально быстрым. Кто-нибудь может дать мне образец? Большое спасибо!

Спасибо за ответ. Я пишу следующий код:

Graphics canvas(totalCanvas); 
for (int i = 0; i < 100; ++i)
{
canvas.DrawImage(bottomLayer, 0,0);
}

эта часть занимает 968 мс ... она слишком медленная ...

Ответы [ 2 ]

1 голос
/ 18 апреля 2009

Если это вообще возможно (и похоже из вашего кода), использование DrawImageUnscaled будет значительно быстрее, чем DrawImage. Или, если вы используете одно и то же изображение снова и снова, создайте TextureBrush и используйте его.

Проблема с GDI + заключается в том, что по большей части он не ускоряется. Чтобы получить невероятно высокие скорости рисования, вам действительно нужны GDI и BitBlt, что является серьезной проблемой, но использовать с GDI +, особенно если вы работаете в управляемом коде (трудно сказать, используете ли вы управляемый C ++ или прямой C ++). 1003 *

См. сообщение для более подробной информации о графике в .net.

1 голос
/ 15 апреля 2009

Почти все операции GDI + должны быть реализованы драйвером для максимально возможного запуска на графическом процессоре. Это должно означать, что простая операция 2D-растрового копирования будет «достаточно быстрой», даже для достаточно больших значений «достаточно».

Моя рекомендация очевидна: не переживайте, тратя время на поиски «самого быстрого» способа сделать это. Вы сформулировали проблему очень четко, поэтому попробуйте реализовать ее так четко, выполнив ее, как вы обрисовали в общих чертах в вопросе. Тогда вы, конечно, можете пойти дальше, сравнить его и принять решение продолжить охоту.

Простая иллюстрация:

Размер растрового изображения 32 bpp 400x300 составляет около 469 КБ. Согласно этой удобной таблице , Nvidia GeForce 4 MX от 2002 года имеет теоретическую пропускную способность памяти 2,6 ГБ / с. Предполагается, что копирование выполняется в чистом режиме «перезаписи», то есть без смешивания существующей поверхности (что звучит правильно, поскольку ваша копия - это в основном способ «очистки» кадра от исходных данных копии), и коэффициент накладных расходов равен четырем просто чтобы быть в безопасности, мы получаем:

(2,6 * 2 ^ 30 / (4 * 469 * 2 ^ 10)) = 1453

Это означает, что ваша копия должна работать со скоростью 1453 FPS, что я, к счастью, считаю "достаточно хорошим".

...