Примерно неделю-две назад стали сыпаться претензии от клиентов.
В моей программе не отображаются картинки.
Стал искать проблему — обнаружил следующее:
Если картинки большие 2500*2000, то программа не может создать Bitmap-ов более 7 штук, то есть занять памяти более 100-110 МБ. Если картинки маенькие, то количеством больше, но общий предел остается!
Раньше такого не было. Не поню сколько было можно занять памяти под Bitmap-ы, но никто не сталкивался ни с какими ограничениями. Особенно в 100 МБ!
Программой моей пользуются куча народу уже 8-9 лет.
Я грешу на последние патчи от Microsoft.
Народ! Кто, что знает и думает по этому поводу?
04.03.08 16:22: Перенесено модератором из 'О жизни' — Хитрик Денис
05.03.08 11:33: Перенесено модератором из 'WIN API' — Odi$$ey
Здравствуйте, GIS developer, Вы писали:
GD>Стал искать проблему — обнаружил следующее:
GD>Если картинки большие 2500*2000, то программа не может создать Bitmap-ов более 7 штук, то есть занять памяти более 100-110 МБ. Если картинки маенькие, то количеством больше, но общий предел остается! GD>Раньше такого не было. Не поню сколько было можно занять памяти под Bitmap-ы, но никто не сталкивался ни с какими ограничениями. Особенно в 100 МБ!
GD>Народ! Кто, что знает и думает по этому поводу?
Подобное было. Под .net что-то делал с картинками. Использовал Bitmap. Столкнулся с таким ограничением, что не хотел создаваться bitmap больше определенного количества точек. Уже не помню сколько там было. Почему оно так — не разбиралься, т.к. не критично было.
GD>Если картинки большие 2500*2000, то программа не может создать Bitmap-ов более 7 штук, то есть занять памяти более 100-110 МБ. Если картинки маенькие, то количеством больше, но общий предел остается! GD>Раньше такого не было. Не поню сколько было можно занять памяти под Bitmap-ы, но никто не сталкивался ни с какими ограничениями. Особенно в 100 МБ!
GDI+ спасет отца русской демократии. Особенно если печатать (на принтер) ничего не нужно, или печатать надо только растр. У меня под GDI+ более-менее шуршат картинки порядка 8000x6000x32.
Ну и, конечно, если на картинки не надо рисовать векторные примитивы, то вполне можно и вручную с битмапцами работать...
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: Засада! Патч от Microsoft!
От:
Аноним
Дата:
05.03.08 07:05
Оценка:
Здравствуйте, GIS developer, Вы писали: GD>Программой моей пользуются куча народу уже 8-9 лет. GD>Я грешу на последние патчи от Microsoft. GD>Народ! Кто, что знает и думает по этому поводу?
Feng Yuan, Windows Graphics Programming Win32 GDI and DirectDraw®
Note the difference between pixel array memory allocation for a DDB and a DIB section. A DDB's pixel array is allocated from GDI's heap in Windows 95-based systems, and from kernel mode paged-pool in Windows NT-based systems. They use shared-system resources with limited capacity <...> In contrast, a DIB section's pixel array is allocated from the current application process's virtual memory space, which is only limited by an application's virtual memory space and free hard disk space...
Кё>Поди пользуешься CreateCompatibleBitmap, и не знаешь, что надо было использовать CreateDIBSection?
Да, так и есть. Я уж и забыл про эту разницу.
У DIB никаких проблем. Только скорость отрисовки чуть-чуть меньше.
Почему только раньше проблема не заметна была так и не понял.
Re: Засада! Патч от Microsoft!
От:
Аноним
Дата:
05.03.08 09:59
Оценка:
Здравствуйте, GIS developer, Вы писали:
GD>Примерно неделю-две назад стали сыпаться претензии от клиентов. GD>В моей программе не отображаются картинки. GD>Стал искать проблему — обнаружил следующее:
GD>Если картинки большие 2500*2000, то программа не может создать Bitmap-ов более 7 штук, то есть занять памяти более 100-110 МБ. Если картинки маенькие, то количеством больше, но общий предел остается! GD>Раньше такого не было. Не поню сколько было можно занять памяти под Bitmap-ы, но никто не сталкивался ни с какими ограничениями. Особенно в 100 МБ!
GD>Программой моей пользуются куча народу уже 8-9 лет. GD>Я грешу на последние патчи от Microsoft. GD>Народ! Кто, что знает и думает по этому поводу?
А ты не пробовал испол. CreateDIBSection, он ведь может создавать собственные виртуалку.
Здравствуйте, GIS developer, Вы писали:
Кё>>Поди пользуешься CreateCompatibleBitmap, и не знаешь, что надо было использовать CreateDIBSection?
GD>Да, так и есть. Я уж и забыл про эту разницу. GD>У DIB никаких проблем. Только скорость отрисовки чуть-чуть меньше. GD>Почему только раньше проблема не заметна была так и не понял.
Разница в памяти для рисунка, видео или общая. Если раньше не сталкавилсь раньше значит вам просто везло.
Здравствуйте, Аноним, Вы писали:
А>А ты не пробовал испол. CreateDIBSection, он ведь может создавать собственные виртуалку.
В общем-то, моя практика показывает, что после определенного размера изображения CreateDIBSection точно так же успешно обламывается. Где-то на 6000x6000x32 примерно Зависит от машины...
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Mirkwood], Вы писали:
SM>В общем-то, моя практика показывает, что после определенного размера изображения CreateDIBSection точно так же успешно обламывается. Где-то на 6000x6000x32 примерно Зависит от машины...
Интересно. А обламывается создаваться или рисоваться?
Здравствуйте, Кодёнок, Вы писали:
Кё>Интересно. А обламывается создаваться или рисоваться?
К сожалению, уже не помню, полгода прошло как заборол это... По-моему, с какого-то достаточно большого размера переставало рисоваться, а при дальнейшем увеличении до примерно 100-150 Мб переставало и создаваться. С GDI+ таких проблем пока еще не возникало.
Но вообще будет проще интересующимся написать тестовое приложение из 15 строк, чем мне сейчас шерстить всю рассылку на нашу службу сопровождения в поисках моего письма по результатам отладки
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
CreateCompatibleBitmap имеет общую память на все приложения, поэтому, когда я съел весь резев своей программой другие приложения перестали работать.
Зависит это не от Windows а от драйвера. После обновления драйвера и проявился этот прикол.
GD>Если картинки большие 2500*2000, то программа не может создать Bitmap-ов более 7 штук, то есть занять памяти более 100-110 МБ. Если картинки маенькие, то количеством больше, но общий предел остается!
А вот зачем создавать такие большие битмапы в таких кол-вах?
Можно хранить просто массивы точек и работать с ними, а битмап нужен только в момент рисования и не более по размерам, чем отображаемая область. У себя я так и делаю, использую GDI+, а синхронизирую области своего in-memory изображения и вспомогательного GDI+ битмапа через LockBits/UlockBits, аналогично можно делать для GDI.