Здравствуйте, Ikemefula, Вы писали:
I>Итого, как происходит отрисовка
I>0. В OnMouseMove управляем флагами для перерисовки, что нужно обновлять. I>1. в OnPaint проверяем, надо ли перерисовать статический контент, если надо — перерисовать основной битмап. I>2. в OnPaint проверяем, надо ли перерисовать динамический контент, если надо — перерисовываем вспомогательный битмап, в качестве фона — основной битмап. I>3. в конце отрисовываем или основной битмап или вспомогательный вот такой функцией
+1
Примерно к такой же схеме я пришел когда занимался ГИС-ом, где была и статическая информация (очень много, до нескольких секунд, или даже до минуты вывода GDI средствами) и динамическая, которая всегда должна быть актуальна, даже во время длительной отрисовки статической. Т.е. паузы в отображении динамической информации быть не должно.
Отличия были в том, что динамической информации было как-правило мало, и она не требовала буферизации. Но само-собой, выводилась не на DC контрола, а в итоговый буфер, где склеивались различные буфера, после чего этот буфер копировался на DC контрола.
А статических буферов было несколько. Так же был D3D рельеф ортогонального вида, который тоже приходилось буферизовывать, т.к. рисовался он немаленьким mesh-ем.
Для комфортных Pan/Zoom/ResizeWindow приходилось держать буферы значительно превышающие размеры окна. Это позволяло при изменениях параметров вида получать превью статической информации с помощью трансформаций буферов. После завершения выбора параметров вида (т.е. когда пользователь повозит мышкой и успокоится), начиналась фоновая отрисовка статических буферов с регулярным (раз 5-10 в секунду) выбросом нарендеренной статики на девайс контрола. Динамическая информация при этом обновлялась от 20и раз в секунду.
Специально для Павла: в 2004м году вся эта кухня позволяла комфортно работать на 4м пне с 256Мб оперативки с интегрированной графикой на 1м тогда фреймворке . Работало и на 3м пне. Но там даже винда сама по себе тормозила.
Ну и как-то на фоне всего происходящего, экономить на том что бы делать Invalidate по ребрам раббера, просто в голову не приходило.