Вопрос не совсем обычный и касается "кишков" .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