Между созданием объекта, наследующегося от 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, если вообще предлагает и т.п.), но до этого ещё необходимо дойти.