Double Buffering в System.Windows.Forms.Control
От: McSeem2 США http://www.antigrain.com
Дата: 22.10.02 19:04
Оценка:
Вопрос не совсем обычный и касается "кишков" .NET.

Я делаю свой контрол и включаю в SetStyle DoubleBuffer чтобы не мельтешило. Рисую простую и короткую линию и прямоугольник на все окно. При этом в OnPaint все перерисовывается по-новой.
Далее. Как известно, в C++-ном GDI+ (тот который в обычном C++, про managed не уверен, но в хелпе тоже ничего не нашел), единственный способ сделать двойную буферизацию — это сделать ее вучную. То есть, типа:

   Bitmap bmp(rect.right,rect.bottom);

   // Create a Graphics object that is associated with the image.
   Graphics* graphBmp = Graphics::FromImage(&bmp);
   
   //. . . Draw a line into graphBmp
   //. . . Draw a rectangle into graphBmp

   // Draw the altered image.
   graphics.DrawImage(&bmp, rect.left, rect.top, rect.right, rect.bottom);
   delete graph;


Так вот, контрол с двойным буфером рисует значительно быстрее, чем Graphics::DrawImage, и это касается только лишь вывода битмапа на экран, поскольку в данном случае рисование линии и прямоугольника — просто ничто. Можно в конце концов ничего не рисовать — результат тот же. Так вот, можно ли где-нибудь почерпнуть сокровенное знание, как он это делает? Ведь двойная буферизация присутствует и видеобуфер расположен явно в памяти, причем он очень похож на полноценный RGBA, то есть, 32 бита на пиксел. Такой вывод я сделал на основе наблюдений за поедаемой памятью с- и без двойной буферизации.

И вообще, возможно ли отображать большие битмапы значительно быстрее чем BitBlt, SetDIBitsToDevice и прочих низкоуровневых функций?

Меня бы даже устроил вариант получения raw-поинтера на этот буфер, чтобы я сам мог там резвиться. Просто GDI+ меня по некоторым причинам не устраивает (я сам умею ренденить гораздо быстрее и качественнее)

McSeem
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.