Между созданием объекта, наследующегося от Geometry, и отображением на экране существует множество этапов. Один из них - преобразование числовых данных в отображаемые примитивы. Выполнив преобразование заранее, можно повысить производительности.
Геометрия - математическое описание формы, а меш - её аппаратно-оптимизированное представление для GPU.

Кодо-пример:

D2D1_POINT_2F points[3] = {
    D2D1::Point2F(100, 100),
    D2D1::Point2F(200, 100),
    D2D1::Point2F(150, 200)
};

ID2D1PathGeometry* geometry;
factory->CreatePathGeometry(&geometry);

ID2D1GeometrySink* sink;
geometry->Open(&sink);

sink->BeginFigure(points[0], D2D1_FIGURE_BEGIN_FILLED);
sink->AddLines(&points[1], 2);
sink->EndFigure(D2D1_FIGURE_END_CLOSED);
sink->Close();

// Позже, при рисовании
renderTarget->FillGeometry(geometry, brush);

Очевидно, что если рисовать динамическую фигуру, польза от меша будет невелика.

Масштабирование

Как следует из названия, это изменение геометрии объекта. Но выполняемое только для целей отрисовки. Оно задаётся через функцию SetTransform с помощью матрицы, которая позволяет изменять поворот, масштаб (увеличение/уменьшение), угол наклона (скос) и сдвиг. Заполнять матрицу вручную нам не нужно.

Важно: Преобразования применяются в обратном порядке относительно их создания (как при перемножении матриц в математике).

Вот простой пример кода, где мы хотим: 1) повернуть на 30°, 2) увеличить в 2 раза, 3) сдвинуть на (100, 50). Порядок преобразований в цепочке будет таким: Исходный объект → Наклон → Поворот → Масштаб → Сдвиг.

Кодо-пример:

// Хотим: 1) Повернуть на 30°, 2) Увеличить в 2 раза, 3) Сдвинуть на (100,50)
//Исходный объект → Наклон → Поворот → Масштаб → Сдвиг
D2D1_MATRIX_3X2_F finalMatrix = 
    D2D1::Matrix3x2F::Translation(100, 50) *
    D2D1::Matrix3x2F::Scale(2, 2) *
    D2D1::Matrix3x2F::Rotation(30) *
    D2D1::Matrix3x2F::Skew(15, 10); 

renderTarget->SetTransform(&finalMatrix);

//А вот как можно получить матрицу , например что бы сохранить
 D2D1_MATRIX_3X2_F originalMatrix;
 renderTarget->GetTransform(&originalMatrix);

Теперь о сглаживании. По умолчанию при рисовании геометрии применяется сглаживание - «специально разработанный аналитический метод вычисления покрытия пикселя». Некоторые методы рисования требуют его отключения. Отключение сглаживания также может положительно повлиять на производительность.

Простой пример настройки:

// 1. Рисуем с ВЫСОКОКАЧЕСТВЕННЫМ сглаживанием (PER_PRIMITIVE)
    renderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE); 

// 2. Рисуем БЕЗ сглаживания (ALIASED)
    renderTarget->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);

Заключение

Как и сказал, вышло пару слов. Дальше думаю рассмотреть отрисовку текста, потом можно будет слои и прочие важные темы. Проблемы при проектировании(например анимации, что предлагает Direct2D, если вообще предлагает и т.п.), но до этого ещё необходимо дойти.

Комментарии (0)