2014-01-17 3 views
3

Прямо сейчас я копирую графику окна из одного окна в другое через BitBlt из WinApi. Интересно, есть ли какой-нибудь другой быстрый/быстрый способ сделать то же самое в C#.Быстрое копирование GUI в C#?

ключевое слово: вид деятельности здесь. Если бы я остался с WinApi, я бы держал HDC в памяти для быстрого рисования, и если .NET Framework имеет другие возможности, я бы, вероятно, имел Graphics объектов. Прямо сейчас мне нужно что-то замедлить, когда мне приходится копировать окна 1920x1080.

Так как я могу повысить производительность gui-копирования в C#?
Я просто хочу знать, смогу ли я стать лучше этого. Явное аппаратное ускорение (OpenGL, DirectX) здесь не для меня. Я решил остаться чистым .NET + WinApi.

// example to copy desktop to window 
Graphics g = Graphics.FromHwnd(Handle); 
IntPtr dc = g.GetHdc(); 
IntPtr dc0 = Windows.GetWindowDC(Windows.GetDesktopWindow()); 
Windows.BitBlt(dc, 0, 0, Width, Height, dc0, 0, 0, Windows.SRCCOPY); 
// clean up of DCs and Graphics left out 

Ганса вопросы:

  • Как медленно это?
    • Слишком медленно. Ощущается (очень) жестко.
  • Как быстро это должно быть?
    • Программное обеспечение не должно feel slow.
  • Почему это важно?
    • Удобство использования программного обеспечения.
  • Как выглядит оборудование?
    • Любой случайный ПК.
  • Почему вы не можете решить проблему с лучшим оборудованием?
    • Это просто программное обеспечение, которое работает на машинах Windows. Вы не годитесь и не покупаете новый ПК для случайного программного обеспечения, которое работает медленно на вашем старом?
+0

Этот вопрос имеет обычную проблему с первыми вопросами. Как медленно? Как быстро это нужно? Почему это важно? Как выглядит оборудование? Почему вы не можете решить это с помощью лучшего оборудования? –

+0

Вам нужен рубинский инкрустированный пони с этим списком пожеланий? Прежде чем решить, что вам нужен определенный уровень производительности, вам необходимо оценить, возможно ли это. –

ответ

1

Получить лучшее видео карту!

Весь смысл GDI, независимо от того, используете ли вы его из собственного кода или через .Net, заключается в том, что он абстрагирует детали графической подсистемы. Недостатком является то, что операции низкого уровня, такие как блиты, находятся в руках графических драйверов-драйверов. Вы можете смело предположить, что они так же оптимизированы, насколько это возможно (в конце концов, производитель видеокарты хочет сделать свою карту лучше).

Накладные расходы на использование .Net-оболочек вместо использования естественных вызовов, которые непосредственно бледнеют в незначительности по сравнению с временем, затраченным на выполнение самой операции, поэтому вы не получите многого.

Ваш код делает немасштабируемую, без смешивания, которая, возможно, является самым быстрым способом копирования изображений.

Конечно, вы должны профилировать код, чтобы увидеть, какое влияние окажут какие-либо изменения в коде.

Вопрос в том, почему вы копируете такие большие изображения из одного окна в другое? Вы контролируете содержимое обоих окон?

Update

Если вы контролируете оба окна, почему бы не привлечь к одной поверхности, а затем блитирования, что оба окна? Это должно заменить часто дорогостоящую операцию чтения данных с видеокарты (т. Е. Биения из одного окна в другое) двумя операциями записи. Это просто мысль и может не сработать, но вам понадобятся данные синхронизации, чтобы понять, не имеет значения.

+0

Да, я контролирую содержимое. Это больше похоже на отдельные элементы управления с большим размером. Содержимое выводится через Graphics. Также я не могу ожидать от моих клиентов покупать лучшие видеокарты. ;) – Bitterblue

+2

Видеокарта не задействована, это было вчера. Сегодня Windows создает окна для оперативной памяти. Ядро к тому, как работает Aero. –

+0

@HansPassant: У вас есть цитата для этого? Из того, что я прочитал, модель драйвера с Vista также использует Direct3D. Я думаю, вы имеете в виду, что Windows относится к поверхностям D3D, которые могут быть в ОЗУ или на видеокарте. – Skizz

Смежные вопросы