В настоящее время я работаю над пользовательским интерфейсом приложения для создания форм. Основное окно - это форма без полей, площадь поверхности которой почти полностью отображается в событии Form.Paint. Задний буфер создается и рисуется довольно условно:
private void form_Paint(object sender, PaintEventArgs e) {
e.Graphics.DrawImage(BackBuffer, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
}
Некоторые области заднего буфера перерисовываются при различных условиях; эффекты наведения мыши довольно распространены. Класс, который выполняет перерисовку, делает недействительными только применимые области. Несмотря на это, достаточно просто провести мышью по форме, чтобы запустить высокопроизводительный процессор до> 50% использования в течение нескольких секунд.
Я профилировал приложение, и более 80% процессорного времени расходуется при вызове DrawImage выше. Я знал, что GDI + работает медленно и не использует (мало?) Графического процессора ... и целевая платформа для приложения не дает никаких гарантий, что графический процессор не будет интегрирован в первую очередь. Но я понятия не имел, что это так плохо.
Должен ли я столкнуться с тем фактом, что GDI + просто недостаточно быстр для того, что мы хотим сделать, или все же есть возможность улучшить код?
-edit-
BackBuffer представляет собой растровое изображение, которое создается во время запуска системы. Его размер соответствует разрешению экрана. Различные области рисуются на нем во время различных событий, таких как наведение мыши и щелчки. Создано достаточно просто:
this.BufferBmp = new Bitmap(screenWidth, screenHeight);
this.Gfx = Graphics.FromImage(BufferBmp);
Gfx.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;