У меня есть сцена Direct3D11, настроенная в SlimDX в окне. Рендеринг выполняется в отдельном потоке.
Есть ли способ удержать средство визуализации от растягивания изображения, когда оно рисует элемент управления с измененным размером? Я пробовал ModeDescription.Scaling = DisplayModeScaling.Centered
, и это, похоже, не имеет никакого эффекта. Есть что-то, что мне не хватает?
(Я уже обновляю размер цели рендеринга. Причина, по которой я спрашиваю об этом, заключается в том, что когда я изменяю размер элемента управления, он растягивает изображение, чтобы заполнить элемент управления на долю секунды, прежде чем цель рендеринга обновится с новым размером. Это приводит к тому, что когда я изменяю его размер, он ужасно мерцает. Если бы я мог сбросить цель рендеринга чуть быстрее, это могло бы избавиться от мерцания. Сохранение изображения в углу без масштабирования - это прекрасно, поскольку в конечном итоге оно вообще не будет масштабироваться. )
Обходной путь 1: цель рендеринга можно поместить внутрь элемента управления. При изменении размера окна изменяется только размер элемента управления с помощью специального метода, который сначала останавливает рендеринг, затем обновляет буферы и снова начинает рендеринг. Однако это немного взломано. Я должен дождаться завершения цикла рендеринга, затем заблокировать его, затем изменить размер, а затем разблокировать.
Обходной путь 2. Аналогичный обходной путь заключается в проверке флага изменения размера в цикле рендеринга, а не в его прерывании. Средство визуализации должно иметь возможность рисовать напрямую без масштабирования. Это гораздо более приемлемо с точки зрения производительности. Однако для выполнения фактического изменения размера необходимо выполнить блокирующий вызов потока пользовательского интерфейса.
Обходной путь 3: вместо того, чтобы вообще изменять размер элемента управления, можно сделать его настолько большим, насколько это возможно, но обрезанным (внутри окна). Изменение размера не требуется, но прямоугольник-ножницы должен поддерживаться аналогично описанным выше обходным путям, если только вы не возражаете против рендеринга большого количества пикселей за пределами экрана. Рендеринг двадцати или около того дополнительных строк и столбцов пикселей действительно имеет благоприятный эффект предоставления немедленного изображения на краю, когда размер окна изменяется обратно.
В идеале изменение размера должно выполняться непосредственно из потока пользовательского интерфейса (без задержек и повторного входа в поток пользовательского интерфейса из потока рендеринга). Это не ответственность потока рендеринга, и это замедляет его. Точно так же изменение размера буфера должно выполняться в потоке рендеринга для максимальной производительности (никаких хлопот с ожиданием/блокировкой/изменением размера/разблокировкой). Единственная причина, по которой это не работает, заключается в том, что поток рендеринга масштабируется, если изменение размера выполняется до изменения размера буферов.
Итак, мой вопрос остается в силе: есть ли способ рендеринга без масштабирования?