.Net 3.5 Roadmap: Улучшения WPF

Scott Guthrie в своем блоге написал о доработках WPF, которые будут реализованы в ближайшем будущем:

Наконец то в WPF будут добавлены контролы для выбора даты и календарь, а также Риббон и DataGrid.

Later this year we are also planning to release a number of new controls for WPF. Included in the list we are working on are DataGrid, Ribbon, and Calendar/DatePicker controls.

Также будут сделана оптимизация BitmapEffects на уровне железа.

Но больше всего меня интересует новый класс WriteableBitmap:

We’ll be including a new WriteableBitmap API that enables real-time bitmap updates from a software surface. We’ll also be adding support for a powerful new effects API that enables you to build richer graphics scenarios.

Пока рано говорить о том, что он может дать.

Бесплатный сыр для студентов

Микрософт решил раздать свои продукты студентам бесплатно. Инициатива DreamSpark уже доступна в 11 странах, но наша, естественно, в список стран пока не входит. Официальный пост и видео с Биллом можно найти тут

Доступные продукты: Windows Server, Expression Suite, XNA Game Studio, SQL Server и новая Visual Studio.

Остается надеяться, что русским студентам все это тоже вскоре будет доступно.

Тест производительности простейших операций: Модуль числа

Всякий раз, когда я пользовался Math.Min() или Math.Abs(), я думал о том, а не лучше было бы написать эти операции простым неравенством.  Наконец, я решил просто написать небольшой тестик, который должен раз и навсегда расставить все на свои места.

В качестве основы я взял почти пустой цикл:

int N = 100000000;

 

Start = DateTime.Now;

//Almost nothing!

for (int i = -N; i < N; i++)              

  result = i;

End = DateTime.Now;

Почти пустой для того чтоб компилятор не сделал каких нить слишком умных действий по его оптимизации. В первую очередь испытанию подверглась функция вычисления модуля числа. Реализовать эту простую операцию можно так:

for (int i = -N; i < N; i++)

{

  result = i;

  result = Math.Abs(i);

}

 

 

или, например, так:

for (int i = -N; i < N; i++)

{

  result = i;

  result = (i >= 0) ? i : -i;

}

 

Из времени выполнения этих циклов я вычел время выполнения пустого цикла. Получились интересные результаты:

Continue reading

Полезный Xaml

Все таки Xaml – это полезная вещь. Я написал коротенькую функцию, с помощью которой можно задавать содержимое TextBlock’ов с помощью xaml кода. Это нужно, когда содержимое нужно менять походу выполнения программы. Например, написав:

SetInlines(MyCuteTextBlock, "Крутой текст с <Bold>выделениями</Bold>, переносами строк,<LineBreak/><Underline>подчеркиваниями</Underline> и тому подобными стильными вещицами.");

получаем следующий результат:

 

А добиться такой простой записи позволяет простая функция:

using System.IO;
using System.Windows.Markup;
using System.Xml;
//Create inlines from xaml string
private void SetInlines(TextBlock tb, string XamlCode)
{
    string Op = "<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">";
            string Ed = "</TextBlock>";
            StringReader stringReader = new StringReader(Op + XamlCode + Ed);
            XmlReader xmlReader = XmlReader.Create(stringReader);
            TextBlock TempTB = (TextBlock)XamlReader.Load(xmlReader);
            //Lets copy inlines
            tb.Inlines.Clear();
            List<Inline> inls = new List<Inline>(TempTB.Inlines);
            foreach (Inline nl in inls)
                tb.Inlines.Add(nl);
}

Здесь используется класс XamlReader, который позволяет парсить XAML динамически, то есть уже на этапе исполнения программы.

Пример оптимизации цикла на С#

Многие любят валить вину за то, что их код медленно работает, на .Net Framework. А между тем во многих случаях ситуацию можно исправить поменяв пару строк кода.

Рассмотрю практический пример функции по обработке фотографии. Есть некий цикл, который обходит все пикселы изображения и преобразует их хитрым образом.

Вначале пару слов о границах цикла. Хотя в первой версии фреймворка и были какие-то проблемы с функцией Length, то сейчас все хорошо. Главное, чтоб это не была какая-нибудь хитрая функция, которая выполняется на каждой итерации цикла и замедляет его в несколько раз.

for (i=0; i<Data.Length; i++)
{
    //Обработка
}

Я вообще использую следующую конструкцию, так как цикл распараллелен на несколько ядер (пост):

int i1 = GetFirstIndex();
int i2 = GetLastIndex();
for (i=i1; i<=i2; i++)
{
    //Обработка
}

Далее за границы цикла стоит по возможности вынести все операции по выделению памяти. Кроме того при вызове функций внутри цикла, по возможности нельзя дублировать данные, особенно массивы.
Пример плохого кода:

Continue reading

Баг поворота BitmapImage

Вчера обнаружилось, что простой код, который поворачивает картинку средствами декодера, будучи примененным к обычной фотографии с цифровика(3mpix jpeg) просто виснет под Windows XP загружая процессор при этом на 100%.

BitmapImage bmp = new BitmapImage();
bmp.BeginInit();
bmp.UriSource = new Uri(FileName);
bmp.CacheOption = BitmapCacheOption.OnLoad;
bmp.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
bmp.Rotation = Rotation.Rotate90;
bmp.EndInit();

Это происходит только под Windows XP, под Vista все работает прекрасно.

WPF и DPI

Не для кого не секрет, что в Висте можно менять DPI (dots-per-inch) для более удобной работы на мониторах с большим разрешением. Я не мог и подумать, что это может проявиться самым неожиданным образом при просмотре изображений под WPF. Любое изображение (обыкновенный JPEG) может нести в себе информацию о DPI внутри метаданных. По умолчанию равно 96 и именно это значение будет использоваться если данных нет.

Однако, некоторые программы для обработки фотографий решили, что неплохо бы 180 dpi прописать в jpg файлы. Если открыть такую фотку в классе Image, то размер ее окажется раза в два меньше ваших ожиданий (естественно, имеется ввиду режим без растяжения Stretch.None). И это еще пол беды. Хотя DPI у изображения в явном виде выставить нельзя, но можно обойти эту проблему либо использовав класс DrawingImage, либо получив PixelData и сгенерировав новый битмап из нее.

Далее меня ждал еще один сюрприз. Если выравнивание фотографии стоит по центру и разрешение ее не кратно двум, то мы получаем мыло изза того что центр изображения попадает между пикселами. Особенно это заметно при просмотре скриншетов текста. Опция SnapsToDevicePixels=Trueне помогает ничем! Пришлось в зависимости от кратности разрешения изображения изменять маргин на 1. В общем, еще то извращение, но прекрасно работает.

В завершении скажу, что пока искал решение вышеописанных проблем, наткнулся на блог, где написано, что вообще не стоит в wpf и silverlight использовать картинки с плохой масштабируемостью, то есть качество которых страдает от небольшого ресайза. Речь идет о любых изображениях с четкими гранями и текстом! Так что be aware!

Математика в ворде – Word 2007 Add-in: Microsoft Math

Прочитал сегодня тут о бесплатном аддоне к офису, который позволяет производить простейшие математические вычисления прямо в Word 2007. Самая полезная вещь – можно строить графики функций не отходя от кассы. Я обычно для этих целей пользуюсь Mathmatica 6.0, но если нужно построить простейший график, то зачем палить из пушки по воробьям.  

Но, естественно, не стоит надеяться на чудо:

Оно вышло! VS2008 и .NET 3.5

Финальные версии Visual Studio 2008 и .Net 3.5 уже можно скачать.

Отдельно оговаривается, что тулзы для Silverlight 1.1 не работают и нужно подождать недели две, пока выпустят новую версию Silverlight 1.1 Tools Alpha for Visual Studio. Предлогают пока сидеть на бете тем, для кого это критично.

Надо заметить, что третий дотнет еще не вошел в массы, а уже вышел 3.5.

F# – новый язык в Visual Studio

Новость не нова, но в скором времени в Visual Studio будет добавлен новый язык – F#.  Еще не объявлены сроки этого нововведения, но это не может не радовать.

Попробовать язык в действии можно уже сейчас. Лицензия позволяет создавать коммерческие приложения на его основе.

Описание:

F# is a variant of the ML programming language for .NET and has a core language that is similar to that of OCaml. It is a mixed functional/imperative/object-oriented programming language which is excellent for medium-advanced programmers and for teaching. In addition, you can access hundreds of .NET libraries using F#, and the F# code you write can be accessed from C# and other .NET languages. This release of F# includes a command line compiler as well as ‘F# for Visual Studio’, which provides interactive syntax highlighting, parsing, typechecking and intellisense for F# code inside Visual Studio 2003/2005/Orcas, and ‘F# Interactive’, a command-line top level environment for F#.

По языку уже написана книга: Expert F#.

 

Так что, возможно, у него большое будущее.