BugDigger

Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Sulphide DDB завязан на работу с видеокартой, соответственно там гораздо больше наворотов и неявных ограничений, например, объем DDB-данных, существующих в данный момент во всех программах в системе (!). Остальные форматы работают чисто с памятью и только в вашем процессе, никаких особых ограничений при этом нет. Первое утверждение несколько шокирует, не правда ли? Чтобы убедиться в его наличии (давно этого не делал, но думаю, что воз и ныне там), достаточно сделать простенькое VCL-приложение, где можно отводить DDB bmp желаемого размера (он, как мы знаем, по умолчанию DDB). Увеличиваете размер (шага в 1 Мб вполне достаточно), пока не появится исключение OutOfRes. Запоминаете объем данных, когда это случается (у меня было каких-то жалких 32 Мб), несколько снижаете и заводите (успешно) bmp. Затем запускаете второй экземпляр тестовой программки и начинаете отводить bmp, постепенно повышая его размер. Результат: исключение появится, когда сумма в обоих экземплярах программ превысит ранее запомненный вами доступный объем. Такое ограничение выглядит, согласитесь, очень странно, и должно было бы приводить к постоянным крахам при запуске в параллель программ разных производителей. Поскольку этого мы не наблюдаем (?), можно предположить (чистая спекуляция), что DDB имеют некую глобальную метку, относящую его при создании к какому-то глобальному пулу, имеющему (на уровне драйвера) ограничение по размеру. VCL вполне может без задней мысли проставлять свою постоянную метку вместо того, чтобы генерировать новую в каждом новом экземпляре приложения. В таком случае есть шанс, что это уже исправлено (я сижу на 2007, как упоминал ранее), можете попробовать проверить для интереса в свежей студии. |