Direct2D #13. Command Lists. Запись графических команд
Johnny_Depp 4 минуты назад Direct2D #13. Command Lists. Запись графических команд Простой 3 мин 114 C++ * Windows * Разработка игр * Туториал Всех горячо приветствую! Темы, как я говорил, пошли несложные, да и у меня...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Вот важная новость с фронта ИИ: Johnny_Depp 4 минуты назад Direct2D #13. Запись графических команд Простой 3 мин 114 C++ * Windows * Разработка игр * Туториал Всех горячо приветствую! Темы, как я говорил, пошли несложные, да и у меня достаточно энергии, так что держите новую тему.
В двух словах о том, что такое Command Lists. Раньше все графические команды выполнялись по завершении рисования (EndDraw), но может быть такая ситуация: есть функция, в ней рендер мира, но всё в одной функции - довольно так себе. Вы же можете, например, отрисовывать разные локации, и многие сразу задумаются о том, чтобы использовать разные функции - что совершенно правильно.
Технические детали
Но было бы неплохо создать массив команд, чтобы вместо функций просто оперировать массивом, а также такой массив не привязан к разрешению. Кроме этого, захотелось бы нам ещё применить к нему эффекты из прошлой статьи или создать узор. И, кроме всего этого, нам бы ещё сделать оптимизацию.
Вот до массива мы использовали 50 команд снова и снова, тратили ресурсы CPU на расчёт, а поместили в массив - один раз потратили ресурсы, и теперь просто и легко отправляем всё в GPU. И этот инструмент уже существует, отвечая на все вышеописанные запросы и называется Command List, ну или лист команд. Поддерживается с Windows 8.
Это очень интересный инструмент, при грамотном подходе позволяющий снизить нагрузку на CPU, но не на GPU. Прежде чем перейти к примерам, важно сказать, что Command List наследуется от ID2D1Image со всеми вытекающими: он может быть входом для эффекта, источником для ID2D1ImageBrush и аргументом для DrawImage. Также важно, что Command List не хранит копию ресурсов, а лишь ссылки на них.
Отраслевые последствия
А отсюда вытекает следующее:Ресурсы должны существовать в момент воспроизведения Command List. Если вы удалите битмап до воспроизведения — будет ошибка. Изменение ресурса после записи отразится на воспроизведении.
Command List сам по себе занимает мало памяти — он хранит только инструкции и ссылки, а не сами данные. Все ресурсы создаются и уничтожаются вне Command List. Собственно, пример создания (разумеется, через DeviceContext):ComPtr pCommandList; HRESULT hr = pDeviceContext->CreateCommandList(&pCommandList); if (FAILED(hr)) { // Обработка ошибки }Собственно, ничего сложного.
Теперь - как записать команды (набросок кода):// Устанавливаем Command List как цель pDeviceContext->SetTarget(pCommandList. Get()); // Начинаем рисование - все команды будут записаны в Command List pDeviceContext->BeginDraw(); // ... здесь ваши команды рисования ...
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





