Какую кисть WPF использовать и как ее создать

У меня есть 3D-приложение WPF (С# .NET 4.0), в котором много 3D-геометрий. Теперь мне нужно раскрасить эти геометрические фигуры, применив текстуру. Источником текстуры является один большой файл .PNG, подобный следующему:

Пример файла результатов

Файл .PNG содержит повторяющиеся разделы. Один раздел для каждой комбинации регистра, отклонения и гармоники. Варианты имеют одно или несколько отклонений (nDev). Кейсы также имеют одну или несколько гармоник (nHarm). Таким образом, количество разделов равно сумме nDev * nHarm каждого случая.

Каждая строка пикселей в разделе соответствует ровно одной геометрии.

введите здесь описание изображения

Конечный пользователь должен иметь возможность выбрать Case (поле со списком), Deviation (ползунок) и Harmonic (ползунок). Эта комбинация приводит к смещению сечения. Основная идея заключается в том, что это смещение раздела можно использовать для изменения положения «области сопоставления» поверх исходного .png с помощью TranslateTransform.

Теперь вызов(ы), с которыми я сталкиваюсь. Обычный файл результатов содержит: от 200 до 400 строк на секцию от 32 до 64 гармоник до 250 отклонений от 20 до 30 случаев

Чтобы получить максимальную производительность, я должен использовать текстуры, которые остаются в пределах RenderCapability.MaxHardwareTextureSize. Поэтому я хочу разделить .png на случай (и, если необходимо, на отклонение и/или гармонику).

Вопрос: Как разделить исходный файл .png на несколько кистей? И какую кисть использовать для максимальной производительности? Должен ли я придерживаться ImageBrush (поскольку он статичен после первоначального разделения) или использовать BitmapCacheBrush, т.е.?


person Jan van de Pol    schedule 20.06.2011    source источник
comment
Если вы еще не наткнулись на эту ссылку, она может оказаться полезной, есть список компромиссов производительности msdn.microsoft.com/en-us/library/bb613553.aspx   -  person PeskyGnat    schedule 20.06.2011
comment
Спасибо за ссылку. Я это уже видел. Вот почему я думаю об использовании нескольких ImageBrushes. Другим решением было бы использовать одну BitmapCacheBrush и пополнить ее. Вот что я хочу выяснить с помощью этого вопроса.   -  person Jan van de Pol    schedule 20.06.2011
comment
Однако вопрос остается в силе, мы решили отказаться от использования файла .png и использовать файл со значениями в двоичном формате. Я переведу эти значения на лету в изображение. Ожидается, что это уменьшит общий размер файла таким образом, что он будет соответствовать границам MaxHardwareTextureSize...   -  person Jan van de Pol    schedule 21.06.2011


Ответы (1)


Возможно, вы захотите использовать WriteableBitmap. вместо кисти WPF. Затем вы можете записать любые пиксели, которые хотите, не кэшируя ничего, кроме данных пикселей.

person Ed Bayiates    schedule 07.07.2011
comment
Спасибо за предложение. Это был подход, который я изначально использовал. Но вскоре после прохождения этого маршрута у меня зависло приложение. Я отправил это сюда: connect.microsoft.com/VisualStudio/feedback/details/678273/. В качестве обходного пути я использую BitmapImage, у которого есть перегрузка конструктора, позволяющая получить массив байтов, представляющий пиксельные данные. Это работает отлично. Может ли кто-нибудь подтвердить найденную мной ошибку (и проголосовать за решение, пожалуйста). - person Jan van de Pol; 08.07.2011