| | | | |
CreateCompatibleBitmap и EOutOfResources | Полный текст материала
Другие публикации автора: Alex B
Цитата или краткий комментарий: «... Если одно из приложений, запущенных в системе, создаст слишком большой DDB и займет таким образом бОльшую часть разделяемого системного буфера, то в дальнейшем для этого или ДРУГОГО приложения создание очередного DDB ресурса окончится неудачей. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[TBitmap] [Растры, BMP]
Отслеживать это обсуждение
Всего сообщений: 623-10-2010 06:52сообщение от автора материала Пардон, а откуда информация о том, что DDB создаются в общесистемном буфере?
Вы можете проверить это самостоятельно. Создайте тестовую программку, и найдите размер TBitmap (в режиме DDB, т.е. PixelFormat=pfDevice, т.е. по умолчанию), который вызывает исключение EOutOfResources. Далее с помощью той же программы создайте чуть меньший (еще работающий) bmp. Теперь запустите вторую копию этой же программы (первая копия, естественно, остается в памяти) и попытайтесь создать еще один такой же (или даже существенно меньший) bmp. Наблюдайте EOutOfResources во второй копии программы, которая, как этого по-хорошему хотелось бы, не должна была бы зависеть от других программ.
Т.о., с точки зрения пользователя буфер, где живут DDB, выглядит как общесистемный буфер ограниченного размера.
Кстати, Ф.Юань в своей классической книге "Программирование графики для Windows" пишет: "DDB представляет собой объект GDI, который находится под управлением GDI и драйверов устройств. При создании DDB-растра GDI и драйвер графического устройсва определяют его внутренний формат и выделяют память из области памяти GDI." "Память для графических данных DDB выделяется в общем адресном пространстве ядра из выгружаемого пула."
В свою очередь выгружаемый пул - ограниченный ресурс (регулируется HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PagedPoolSize, см. http://technet.microsoft.com/en-us/library/cc976157.aspx).
Всё сказанное справедливо для полностью 32-битной ситуации (Win32+App32). Как всё это работает в чистых 64 битах (Win64+App64) или в смешанной ситуации (Win64+App32) - не знаю. Неплохо было бы проверить. |
|
22-10-2010 11:46Пардон, а откуда информация о том, что DDB создаются в общесистемном буфере? |
|
16-10-2010 13:44Я даже создал свой класс наследник TBitmap, в котором сразу, в конструкторе задается PixelFormat := pf24Bit;
И SetSize к нему написал, тогда ещё в Delphi7 работал. |
|
15-10-2010 03:34
14-10-2010 02:29С изображениями большого размера не работаю, поэтому проблема мне неактуальна, но для себя отложил. А кто-нибудь имеет практический опыт по скорострельности работы под DDB и DIB? |
|
11-10-2010 15:17
|
|