На прошлой неделе компания Microsoft представила публичную бета-версию новой версии WPF. С тех пор, как в конце прошлого года компания представила .NET Framework 3.5, команда разработчиков усердно работала над добавлением многих дополнительных функций, исправлением обнаруженных ошибок, увеличением производительности и реализацией нового модернизированного установщика для подмножества профилей .NET Framework, оптимизированных для клиентских сценариев. Этот новый релиз будет поставляться как часть .NET Framework 3.5 SP1, который выйдет этим летом. В бета-версии представлена только часть новых функций. В данной статье мы поговорим о грядущих в .NET Framework 3.5 SP1 изменениях, делая основной упор на WPF.
В течение последнего года-двух было очень интересно наблюдать за балансом между WPF-приложениями, созданными для бизнеса и для обычных пользователей. Первоначально мы ожидали, что WPF в основном будет использоваться для потребительских приложений: предпосылкой для этого была анимация, богатая поддержка мультимедиа, потоковые документы, двух- и трехмерная графика и так далее, которые могли стать основной причиной интереса для создания подобных приложений. Даже удивительно, насколько много корпоративных приложений тоже используют все эти преимущества: структура архитектуры, например, возможность шаблонирования данных, модель компоновки и отделение пользовательского интерфейса от кода приложения, оказались достаточными причинами, чтобы во многих случаях перейти на WPF.
Хотя Windows Vista включает в себя WPF по умолчанию, мы увидели необходимость предоставить легкий способ развертывания платформы на компьютерах, работающих под управлением Windows XP. Если вы распространяете пользовательское приложение через Интернет, то очень важно иметь установочный пакет, который быстро скачается и установится, в то же время предоставив пользователю данные о прогрессе. Наряду с полным .NET Framework, у нас есть Client Profile, который весит около 25 Мб (то есть, примерно, как и Acrobat Reader) и устанавливается за пару минут.
Как мы настолько уменьшили размер .NET Framework? Мы убрали множество компонентных узлов, которые обычно не используются в пользовательских приложениях (приложениях, которому надо было бы запускать локально ASP.NET). Список файлов для дистрибутива был выбран с помощью изучения множества пользовательских приложений. Если говорить на более высоком уровне, то данный дистрибутив включает в себя ядро CLR, базовые библиотеки классов, WPF, Windows Forms и WCF. Мы также использовали некоторые новейшие технологии сжатия, чтобы существенно уменьшить размер дистрибутива. Конечно же, вы по-прежнему можете использовать полную версию .NET Framework, просто это дополнительная опция. Важно отметить, что и в Client Profile и в .NET Framework все поставляемые компоненты одинаковы.
В Visual Studio 2008 SP1, который находится в состоянии бета-теста, вы также можете ориентироваться на Client Profile с помощью соответствующего пункта в меню настройки шаблона. Если во время сборки обнаружится, что вы ссылаетесь на компоненты, которых нет в Client Profile, то вы, конечно же, получите предупреждение. При компилировании приложения у вас будет возможность интегрировать установщик Client Profile в ваше приложение, сделав, таким образом, бесшовный, единый установщик для лучшего пользовательского опыта. Мы обеспечили очень небольшой - примерно 200 Кб - размер загрузочного установщика, который сводит к минимуму время между тем, когда пользователь запускает установщик и получает результат. Мы даже сделали движок доступа к файлам во время установки .NET Framework полностью асинхронным, так что ничто не будет конкурировать с вашим приложением во время первого запуска.
Как приложение может знать, достаточно ли установленных компонентов .NET Framework для его работы? Только приложение, которое было скомпилировано для работы с Client Profile будет содержать специальный манифест, в котором будет обозначено, что данное приложение может работать на компьютерах даже только с данным подмножеством .Net. Если вы запустите приложение, которое не будет должным образом маркировано, то Client Profile покажет пользователю всплывающее окно, которое поможет пользователю обновиться до полной версии среды выполнения. Также важно отметить, что Client Profile полностью совместим с ClickOnce.
Для конечных пользователей, которые решат использовать Windows Update, .NET Framework, Client Profile будет обновлен до полной версии .NET Framework с помощью фонового процесса, так что приложения, которые используют полную версию среды исполнения, смогут использовать все преимущества растущего количества пользователей WPF.
И наконец, вскоре после выпуска Visual Studio 2008 SP1, мы выпустим дополнение, которое позволит разработчикам полностью настраивать вид и ощущения установщика Client Profile - изменять фоновый рисунок, графику, и т.д. Также мы сотрудничаем с разработчиками сторонних установщиков, такими как InstallShield, для реализации поддержки Client Profile в их технологиях упаковки.
И об еще одной функции, не связанной с развертыванием Client Profile - мы слегка ослабили политику запуска управляемых приложений из сети, позволив им запускаться с полным уровнем доверия. Как показал опрос Бреда Абрамса (Brad Abrams), этого изменения ждали многие.
Графика
Версия .NET Framework 3.5 включает несколько крупных изменений в графическом движке WPF. В частности, были добавлены классы UIElement3D и Viewport2DVisual3D, которые обеспечивают полную поддержку двухмерных элементов на трехмерных поверхностях. Мы также сделали существенные улучшения в производительности в работе с многослойными окнами и исправили проблему со случайными запинками анимации. Но в этой версии мы пошли дальше и добавили множество интересных графических функций.
Как уже демонстрировалось на MIX2008, в .NET 3.5 SP1 добавлена поддержка HLSL-шейдеров и класса ShaderEffect, что позволит применить к WPF-содержимому бесконечное количество фильтров. Шейдеры полностью просчитываются на видеокарте (если она поддерживает Pixel Shader 2.0) или по эффективной программной реализации - это значит, что вы можете добавлять блики, фокусирование, искажение или размытие, при этом абсолютно не нагружая процессор.
Вы можете задать свойства шейдера связанным данным или анимации, что позволит реализовать еще более совершенные эффекты, и так как WPF - полностью интегрированная платформа, то любой элемент управления, к которому применен шейдер, останется полностью активным.
Если бы этого не было достаточно для финальной версии .NET 3.5 SP1, мы бы обеспечили даже более глубокую поддержку интеграции с Direct X. По сути любая Direct3D-поверхность может быть использована как кисть для WPF-контента при помощи нового класса D3DImage, который позволяет вам накладывать или смешивать Direct3D-контент взаимозаменяемо с WPF-контентом. Вы можете использовать множество классов D3DImage одновременно, и так как они визуализируются с помощью Direct X, на производительность особо эффекта их использование не влияет. Вы даже можете использовать альфа-смешивание для Direct3D-контента. Если даже этого не достаточно, то вы можете взять Direct3D-поверхность и использовать ее как текстуру в трехмерной WPF-сцене. Больше информации доступно в блоге Грега Шехтера (Greg Schechter)
Мы очень сильно усовершенствовали класс WriteableBitmap, который позволяет реализовать эффективные манипуляции с изображениями. WriteableBitmap представляет собой растровое изображение, размещенное в системной памяти, что позволяет вам изменять его содержимое и автоматически выводить его на экран, используя преимущества модели хранения в памяти в WPF. Оригинальная реализация данного класса размещала в памяти новое изображение при каждом изменении кадра, что делало его довольно медленным для большинства сценариев. Новый механизм замены изображения быстр, синхронизируется с изменениями в пользовательском интерфейсе и имеет постоянное стабилизированное потребление памяти, что позволяет реализовать в WPF множество новых сценариев - например, программы для рисования, рендеры фракталов и ПО для работы с веб-камерами.
Мы также сделали некоторые улучшения в связующие API, позволив вам, например, проверять, поддерживает ли аппаратное обеспечение пиксельные шейдеры. Мы также добавили возможность семплирования ближайшего изображения как режим масштабирования изображения. Последнее, но не менее важное - мы исправили наиболее частый растровый эффект в WPF - размытие и тени больше не визуализируются программно: если вы используете новые API размытия и теней, реализованные в SP1, то они будут обсчитываться полностью мощностями видеокарты. Унаследованные API размытия и тени тоже стали считаться аппаратно, ознаменовав серьезное улучшение в производительности приложений, которые используют данные эффекты.
Производительность
Как любит говорить Иен Эллисон-Тейлор (Ian Ellison-Taylor), директор по разработке WPF, над производительностью мы никогда не прекратим работать. Как и с любой другой высокоуровневой графической платформой, у нас всегда есть оптимизации, которые можно реализовать. В данной области мы сделали серьезные улучшения во всех областях, связанных с производительностью и потреблением памяти WPF-приложений. Вы заметите эти улучшения независимо от того, разработано ваше приложение для WPF 3.5 SP1 или более ранней версии.
Холодная загрузка приложения - область, в которой люди очень чувствительны к производительности. За короткое время необходимо выполнить очень много операций: необходимо прочитать компоненты с диска, проверить их манифесты на строгое соответствие имени, а кроме того, проверить и загрузить все зависимости. Как автор приложения вы можете существенно повлиять на время загрузки вашего приложения: вы должны загружать только те компоненты, которые нужны, чтобы отобразить первоначальное окно вашего приложения, и отложить загрузку других компонентов, пока они не будут необходимы. Если вам нужен Windows Forms для отображения нескольких форм, спрятанных в приложении, не добавляйте зависимость в первый запускаемый файл - это увеличит время загрузки приложения. Мы прошлись по компонентам WPF и сделали большую работу по оптимизации, чтобы убедится, что вы увидите свои первые пиксели как можно быстрее: к RTM-версии мы надеемся, что время холодной загрузки улучшится на 45% в зависимости от размера приложения и сценария. В общем, чем больше приложение, тем быстрее оно загрузится.
Для XBAP-приложений первоначальное окно загрузки мы сделали в HTML, так что вы немедленно видите прогресс загрузки при клике на XBAP, вместо того, чтобы видеть в течение нескольких секунд сбивающую с толку пустую страницу. Кроме тех улучшений, о которых мы упоминали, также мы реализовали несколько дополнительных изменений в загрузке приложений с холодного старта для XBAP-сценариев, что дает дополнительные 10% увеличения скорости загрузки.
В RTM мы также реализуем поддержку окна заставки (splash screen) в Visual Studio 2008 SP1, чтобы минимизировать работу по построению приложения, немедленно отображая первоначальное окно, что имеет большое влияние на восприятие быстроты реакции приложения и уменьшает риск того, что пользователь запустит два экземпляра приложения одновременно. Вы также можете сделать окном заставки изображение, обозначив растровый источник с помощью элемента загрузки SplashScreen, или поддерживать ваш собственный полностью настраиваемый класс, основанный на нашем шаблоне, который загружается до Application object во время загрузки.
В оптимизации WPF мы работали не только над холодной загрузкой. Теперь у нас есть контейнер, удаляющий элементы управления, основываясь на классе VirtualizingStackPanel (таком как ListBox, ListView и TreeView). Это опциональная функция, вы должны включить свойство VirtualizationMode, из-за некоторых небольших семантических изменений в поведении этих элементов управления, но эта функция может улучшить производительность скроллинга вплоть до 40%, если возможно повторно используя элементы управления, которые выходят за пределы экрана во время скроллинга. Также мы теперь предлагаем такую опцию, как отложенный скроллинг, похоже на то, как работает скроллинг в папке "Входящие" в Outlook.
Также было сделано много оптимизаций в других элементах управления виртуализации: TreeView теперь предлагает виртуализацию сценариев типа Explorer, а колонки отныне могут быть виртуализированы, что позволяет намного проще создать эффективный элемент DataGrid. Мы также нашли и исправили несколько других причин падений производительности, улучшив визуализацию текста и частые проблемы с манипуляциями Z-типа.
Новые элементы
На это ушло много времени, но мы таки добавили элемент DataGrid в WPF. Данный элемент выйдет в ближайшее время, после выхода 3.5 SP1. DataGrid позволит использовать множество оптимизаций виртуализации, о которых я упоминал выше, так что данный элемент должен быть относительно эффективным, и, конечно, как и со всеми элементами WPF, с помощью шаблонов можно будет полностью изменить поведение и ощущение от работы с элементом. Мы внесли множество улучшений в API для улучшения поддержки сценариев DataGrid: мультиселекторы, автоматические конвертеры нулевых значений, междейственный элемент редактирования, альтернативная поддержка строк, подтверждение уровня элемента, и, конечно, все эти улучшения доступны сторонним компаниям для улучшения их высокоуровневых элементов управления таблицами данных.
Еще одним элементом, который у нас просили реализовать, является Office Ribbon, и мы рады сообщить, что также выпустим и этот элемент, но уже к концу года. Ленты будут реализованы полностью на WPF, совместимы с гидом по разработке пользовательского интерфейса и иметь интуитивно понятные API.
Третьим элементом управления, который поставляется в комплекте с .NET Framework 3.5 SP1, является многофункциональный элемент WebBrowser. Со времен первого релиза WPF позволяет отображать интернет-контент с помощью элемента Frame, который, по правде говоря, имеет множество ограничений: вы не можете взаимодействовать с контентом фрейма программно, HTML-содержимое могло отображаться только с URL-адреса, а не из потока или строчки памяти, вы не могли программно просматривать историю и не могли взаимодействовать с каким-либо JavaScript. Элемент управления WebBrowser предлагает вам все эти возможности, позволяя реализовать намного более гладкую интеграцию WPF и HTML-контента. Также данный элемент управления предоставляет отличный способ для хранения Silverlight в WPF - просто укажите это в Silverlight .XAP-файле. Еще одна приятная мелочь: этот элемент управления поддерживает режим частичного доверия для XBAP, что позволяет включать в XBAP внутренний фрейм HTML-контента, с которым он может взаимодействовать.
Другие изменения
В данном релизе есть множество маленьких, но не менее полезных изменений, которые нельзя отнести к какой-либо категории. Теперь WPF поддерживает форматирование строки текста связанного с данными: это позволяет обойтись без написания класса, который реализует IValueConverter просто для того, чтобы реализовать что-то настолько простое, как форматирование числа. Мы провели кое-какую работу над облегчением и углублением поддержки LINQ в XML, и LINQ в DataSet для объединения данных. И наконец, мы расширили поддержку браузера Firefox, добавив полную поддержку ClickOnce (файлов приложений), а не только XBAP-файлов.
Дизайнер WPF в Visual Studio 2008 SP1 также был серьезно пересмотрен - теперь он загружается быстрее. Мы также сделали большую работу по поддержке некоторых наиболее редких сценариев работы XAML, которые вызывали проблемы с редактором. В панели-окне свойств теперь есть вкладка событий, которая реализует равенство с Windows Forms по созданию и просмотру обработчиков событий в дизайнере. Одна функция, которая будет оценена по достоинству, - рефакторинг XAML, что раньше было заданием сложным и требующим много сил. Наконец, мы добавили поддержку отладки BAML во время отладки, что позволит вам вылавливать ошибки, которые иначе вам было очень сложно выловить.
Итоги
Может это и слегка неподходящее выражение, но .NET Framework 3.5 SP1 представляет собой абсолютно новую ревизию WPF, которая позволит вывести WPF в прайм-тайм. Я искренне верю, что с данной версией WPF мы сможем искоренить всю критику о WPF, ведь новый релиз обладает следующими достинствами: намного лучшее развертывание, некоторые новые возможности графики, повсеместные улучшения производительности, три наиболее часто запрашиваемых элемента управления и новые возможности при редактировании. Когда вы объедините все эти факторы вместе, то поймете, почему данный сервисный релиз настолько большой шаг вперед для WPF - он позволяет открыть новые горизонты, демонстрируя зрелость нашей стратегической платформы следующего поколения пользовательского интерфейса для Windows.
На данный момент SP1 находится в состоянии бета-теста, финальную версию мы намерены выпустить этим летом. Как и с любой бета-версией, всегда есть множество рисков безопасности. И это я очень хочу подчеркнуть еще раз. Я не рекомендую устанавливать эту бета-версию на ваш основной компьютер для разработки. Из-за некоторых проблем с нехваткой времени, данная версия несовместима с Silverlight 2 Beta 1, однако будет совместима с Beta 2, которая выйдет через несколько недель. Во время недавних тестирований мы обнаружили проблему, которая может вызвать сбой Blend. Для предварительной версии 2.5 есть обновление, которое исправляет данную проблему, и, конечно, до выхода SP1 мы разработаем полноценное решение. Наконец, если вы работаете в Windows Vista, то должны установить Vista SP1 перед тем, как устанавливать Visual Studio 2008 SP1 Beta. И учтите, что если бы все было готово - мы бы так и сказали, не зря же мы называем это бета-версией.
И еще одно, хотя я упоминал об усовершенствованиях в самом WPF, данное обновление содержит в себе изменения для ASP.NET, ADO.NET, WCF и Team Foundation Server. За дополнительными подробностями обращайтесь в блог Скотта Гутри (Scott Guthrie).
Итак, где же вы можете получить дополнительную информацию о данной версии? Если этой статьи недостаточно, милости просим на Week of WPF на Channel 9. В течение недели мы будем публиковать интервью с основной командой WPF, говоря и демонстрируя изменения в данной версии. Адам Кинни (Adam Kinney) и я получили истинное удовольствие, снимая эти ролики, поэтому мы искренне надеемся, что и вы его получите. В первом интервью с Иенам Эллисон-Тейлором (Ian Ellison-Taylor) и Кевином Гъерстадом (Kevin Gjerstad) мы обсуждали философию данной версии и будущее WPF.
Ссылки по теме