Как повысить производительность по сравнению с DrawImage GDI (Unscaled)? - PullRequest
5 голосов
/ 07 апреля 2010

В обработчике рисования моего пользовательского элемента управления я перебираю коллекцию предопределенных растровых объектов и отрисовываю их таким образом в клиентскую область:

C # версия:

private void Control_Paint(object sender, PaintEventArgs e) {
    Graphics g = e.Graphics;
    foreach (BitmapObj bmpObj in _bitmapObjCollection) {
        g.DrawImageUnscaled(bmpObj.Bitmap, bmpObj.Location);
    }
}

Версия VB.NET:

Private Sub Control_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
    Dim g As Graphics = e.Graphics

    For Each bmpObj As BitmapObj In _bitmapObjCollection
        g.DrawImageUnscaled(bmpObj.Bitmap, bmpObj.Location)
    Next
End Sub

Код работает нормально, но начинает тормозить, когда в коллекцию добавляется около десятка объектов.Мой вопрос: есть ли способ ускорить это?Можно ли использовать функцию Win32 bitblt для замены DrawImageUnscaled?И если да, то как?

Спасибо!

Примечание: поиск в Google для использования BitBlt пока дал мне только образцы экранной шапки ...

1 Ответ

6 голосов
/ 13 сентября 2010

Слишком поздно, но, возможно, кому-то все еще нужно решение.

Я создал небольшую библиотеку GLGDI + с похожим синтаксисом GDI +, которая работает на OpenTK: http://code.google.com/p/glgdiplus/

Я не уверен насчет стабильности, у него есть некоторые проблемы с DrawString (проблема с TextPrint из OpenTK). Но если вам нужно повышение производительности для вашей утилиты (например, редактор уровней в моем случае), это может быть решением.

...