(С++) как правильно применять градиентную кисть в цикле

4223080

Я чего-то непонимаю?
PathGradientBrush создается на основании некоторого массива точек, но почему-то не содержит методов для его изменения. Т.е. получается, что если надо залить градиентами набор четырехугольников (например картинку то в цикле необходимо каждый раз создавать объект PathGradientBrush , отрисовывать его, а затем уничтожать?
На мой взгляд это довольно странно :/

evgen5555

А что в этом странного?

kokoc88

Ну можно вообще-то кэшировать.

4223080

Ну, все-таки кисть -- это GDI+ объект. Я правда не знаю что именно делает система при создании кисти, но мне кажется нерентабельным 10000 раз (это сетка 100х100) создавать и уничтожать объект с полной его инициализацией когда требуется только скорректировать несколько параметров. К тому же это все будет запускацца в цикле по времени...

4223080

Ну можно вообще-то кэшировать

Э-э-э-э-э... чуть поподробнее можно. Куда смотреть?

kokoc88

Ну просто не уничтожать объекты, сохранять их где-то...

4223080

ЗЫ. Сетка НЕ прямоугольная. Собственно это двумерное распределение некоторой величины в криволинейной системе координат. Сама сетка на данный момент меняцца будет редко, но в будущем это может изменицца, поэтому кэшировать кисти для каждой ячейки также представляется нерентабельным

kokoc88

Зачем для каждой ячейки? Кэшируй одинаковые.

4223080

Градиентная кисть содержит абсолютные координаты точек, задающих распределение градиента. Т.е. даже если я рисую два абсолютно одинаковых квадрата, но в разных точках экрана, получается, что я уже должен для каждого создавать отдельную градиентную кисть
Тогда и кэшировать нет никакого смысла

kokoc88

Ну значит придумывай, как делать эффективно...

bleyman

Насколько я понмю гди+, там на всё всегда действуют матрицы трансформации, поэтому никаких "абсолютных координат" в общем скорее всего быть не должно. Пробовал их менять?

4223080

Там только простейшие линейные преобразования. В моем случае преобразование более хитрое, поэтому такой метод в данном случае тоже не подойдет
Неужели нет способа как-нить подкорректировать координаты у уже сконструированного объекта? Может кто-нить знает как устроены объекты этого класса? В хедере нет ни одного членоданного, вся инициализация идет через функции из пространства имен (видимо) DllExports. И еще, у GdiplusPath.h нет ни одного заголовочного файла. Откуда компилятор узнает сигнатуры для этих функций. Как все это работает
ЗЫ. студия -- MS VS 2005Nov

evgen5555



Как все это работает
Из гака подгружаются намеспейсы прям на ходу.

4223080

C++ тоже генерит .NET код? Т.е. любая прога скомпиленная в 2005-й студии превращается в .NET?

4223080

или только в том случае, если встречается вызов соответствующих функций?

evgen5555

C++ тоже генерит .NET код?
Только в случае подключения Managed-кода.

Helga87

 
Из гака подгружаются намеспейсы прям на ходу.

Подгружаются сборки, а не namespace-ы. В одной сборке может быть несколько namespace-ов, один и тот же namespace может быть раскидан хоть по 1000 сборок и .net об этом знать не будет. Namespace вообще не несет никакой смысловой нагрузки, кроме роли префикса в имени пути, чтобы группировать классы с похожей функциональностью в одном namespace-е.

evgen5555

Спасибо, что поправил

Dasar

> Я правда не знаю что именно делает система при создании кисти, но мне кажется нерентабельным 10000 раз (это сетка 100х100) создавать и уничтожать объект с полной его инициализацией когда требуется только скорректировать несколько параметро
на основании каких данных ты решил, что создание кисти с нуля, сильно хуже, чем изменение основных параметров кисти, от которых полностью зависит внутреннее состояние кисти?

kokoc88

Если она создаёт какой-то графический ресурс - то вполне может быть очень невыгодно создавать каждый раз заново. А если это просто математический объект, типа rectangle, тогда вообще по барабану.

4223080

на основании каких данных ты решил, что создание кисти с нуля, сильно хуже, чем изменение основных параметров кисти, от которых полностью зависит внутреннее состояние кисти?

Это подсказывает мой прошлый опыт программирования (см также сообщение от ). Но поскольку GDI+ и .NET это для меня новая неосвоенная область -- я и хочу выяснить правильно ли это. В частности я выяснил, что вроде как в .NET выделение памяти реализовано намного более эффективо (так ли это? но вот про создание и использование системных объектов нашел только немного инфы.

vladan67

use opengl
Оставить комментарий
Имя или ник:
Комментарий: