Хм, это довольно много.
Самый простой, но, вероятно, очевидный ответ заключается в том, что программисты этих приложений с графическим интерфейсом действительно плохие программисты. Вы можете пойти по пути написания кода, который делает самые странные вещи, и это будет быстрее, но, похоже, мало кто заботится о том, как это сделать, или они считают это дорогостоящим, не выгодным занятием времени.
Чтобы установить все вычисления без загрузки в GPU, не обязательно устраните какие-либо проблемы. Графический процессор подобен центральному процессору, за исключением того, что он имеет менее общее назначение и больше параллельный процессор данных. Он может делать графические вычисления исключительно хорошо. Какая бы ни была у вас комбинация графического API / ОС и драйвера, это не имеет большого значения ... хорошо, на примере Vista они изменили механизм компоновки рабочего стола. Этот механизм гораздо лучше компостирует только то, что изменилось, и, поскольку перерисовка номер один для графических приложений перерисовывается, это аккуратная стратегия оптимизации. Эта идея виртуализации ваших вычислительных потребностей и обновления только самых маленьких изменений каждый раз.
Win32 отправляет сообщения WM_PAINT в окна, когда их нужно перерисовать, это может быть результатом того, что окна перекрывают друг друга. Однако это зависит от самого окна, чтобы выяснить, что на самом деле изменилось. Более того, ничего не изменилось, или внесенное изменение было достаточно тривиальным, так что его можно было просто предварительно сформировать поверх самой верхней поверхности, которая у вас была.
Этот вид обработки графики не обязательно существует сегодня. Я бы сказал, что люди воздерживаются от написания действительно эффективных и виртуализированных решений рендеринга, потому что соотношение выгод / затрат довольно низкое / высокое (плохое).
Что-то, что делает Windows Presentation Foundation (WPF), что, на мой взгляд, намного превосходит большинство других API-интерфейсов GUI, состоит в том, что оно разбивает обновления макета и отображает обновления в два отдельных этапа. И хотя WPF является управляемым кодом, механизм рендеринга - нет. Что происходит с рендерингом, так это то, что управляемый механизм рендеринга WPF создает очередь команд (это то, что делают DirectX и OpenGL), которая затем передается в собственный механизм рендеринга. Что еще более элегантно, так это то, что WPF попытается сохранить любые вычисления, которые не изменили визуальное состояние. Трюк, если можно, когда вы избегаете дорогостоящих рендерингов вызовов для вещей, которые не нужно рендерить (виртуализация).
В отличие от WM_PAINT, который сообщает окну Win32 о необходимости перекрасить себя, приложение WPF проверяет, какие части этого окна требуют перекраски, и перерисовывает только самое маленькое изменение.
Теперь WPF не является лучшим, это серьезное усилие со стороны Microsoft, но это еще не Святой Грааль ... код, который запускает конвейер, все еще может быть улучшен, и объем памяти любого управляемого приложения все еще больше, чем я хотел бы , Но я надеюсь, что это именно тот ответ, который вы ищете.
WPF может делать некоторые вещи асинхронно, довольно прилично, что очень важно, если вы хотите создать действительно отзывчивый пользовательский интерфейс с низкой задержкой / низким быстродействием. Асинхронные операции - это больше, чем разгрузочная работа в другом потоке.
Подводя итог, можно сказать, что медленный и дорогой GUI означает слишком много перерисовки и перерисовки, что очень дорого, т. Е. Всю площадь поверхности.