Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизНехватка ресурсов в win98. Невозможно создать много битмапов. Найти похожие ветки
← →
Дмитрий В. Белькевич (2004-12-26 06:14) [0]Сабж, в общем. После создания 80-90 битмапов 1000х1000 под в98 прога начинает ругаться матом. EOutOfResource. В одном из сообщений видел, рекомендацию пользовать dib вместо ddb. Делаю так, как рекомендовали - создаю bitmap, затем сразу же присваиваю pixelformat pf24bit. И только после этого - размеры. Никаких изменений. Те же глюки. Пробую создавать много tdib"ов из delphix. Создаётся досточно много, гораздо больше, чем обычных битмапов. Вроде как решение проблемы - ан нет. У тдиба не работает канвас из-за того, что он просто-напросто неинициализируется - у тдиба нет замены для виртуального метода его предка инициализации канвасов. А мне использование канваса достаточно критично. Может кто знает, что использовать в качестве замены tbitmap"а?
← →
MBo © (2004-12-26 07:19) [1]1. Трудно представить себе задачу, в которой требуется одновременное присутствие сотни и более огромных битмапов - так что в первую очередь следует пересмотреть концепцию.
2. Виденная тобой рекомендация связана с тем, что DDB размещается в ограниченной памяти ядра Windows. Переход к DIB действительно способен частично улучшить ситуацию, но нерадикально - все же битмап указанного размера занимает несколько мег. Попробуй еще после перевода битмапа в DIB выполнять FreeImage.
← →
Дмитрий В. Белькевич (2004-12-26 14:22) [2]Спасибо за ответ.
1. Задача: со скоростью 50-60 фпс менять изображения на экране. Картинки не пререндеренные софтом, а лежат в своём формате на жестком. Читать постоянно с жесткого и переводить в отображаемый формат не представляется возможным - медленно. Картинок может быть много - 100 и более. Размер 1024х1024 не част, но возможен - нужно на него закладываться. Реализовано: все картинки предварительно переводятся в удобоваримый формат и подчитываются в тбитмап. Потом с помощью delphix вывожу на дайректовую поверхность. Под xp всё работает без проблем. Под 98 тоже работало, пока не стали грузить длинные серии.
2. До того не знал, пока сам не наткнулся. Объем памяти машин, на которых работает софт - 512 - 1Gb, это мы закладываем в требованиях, благо, что память сейчас относительно дешевая. Так что предполагается, что оперативной памяти достаточно.
3. Приведу код присвоения пикселформата в tbitmap"е:
if Value = GetPixelFormat then Exit;
case Value of
pfDevice:
begin
HandleType := bmDDB;
Exit;
end;
pfCustom: InvalidGraphic(@SInvalidPixelFormat);
else
FillChar(DIB, sizeof(DIB), 0);
DIB.dsbm := FImage.FDIB.dsbm;
KillPal := False;
with DIB, dsbm, dsbmih do
begin
bmBits := nil;
biSize := sizeof(DIB.dsbmih);
biWidth := bmWidth;
biHeight := bmHeight;
biPlanes := 1;
biBitCount := BitCounts[Value];
Pal := FImage.FPalette;
case Value of
pf4Bit: Pal := SystemPalette16;
pf8Bit:
begin
DC := GDICheck(GetDC(0));
Pal := CreateHalftonePalette(DC);
KillPal := True;
ReleaseDC(0, DC);
end;
pf16Bit:
begin
biCompression := BI_BITFIELDS;
dsBitFields[0] := $F800;
dsBitFields[1] := $07E0;
dsBitFields[2] := $001F;
end;
end;
try
CopyImage(Handle, Pal, DIB);
PaletteModified := Pal <> 0;
finally
if KillPal then DeleteObject(Pal);
end;
Changed(Self);
end;
end;
Как я понимаю, когда битмап становится ddi, должен быть изменен hadletype. Однако, он bmDDI нигде в graphics.pas не присваивается, только bmDDB, когда битмап устройство-зависим:
pfDevice:
begin
HandleType := bmDDB;
Exit;
end;
← →
Дмитрий В. Белькевич (2004-12-28 04:21) [3]Присвоение pixelformat"у pf24bit в любом месте ничего не меняет - ограничения остаются. FreeImage аналогично. Может кто знает библиотеку-замену стандартному tbitmap, которая не использует ресурсы gdi? Обязательна возможность работы с канвасом.
← →
Sapersky (2004-12-28 12:07) [4]1. Задача: со скоростью 50-60 фпс менять изображения на экране.
Не очень-то понятно, зачем. Если картинки разные (а тем более разного размера), будет сплошное мелькание - ничего не разглядишь.
Картинки не пререндеренные софтом, а лежат в своём формате на жестком.
Есть ещё такие форматы - AVI, MPEG и т.д.
Может кто знает библиотеку-замену стандартному tbitmap, которая не использует ресурсы gdi? Обязательна возможность работы с канвасом.
FastLIB, SpriteUtils. Канваса в прямом смысле у них нет, но есть ф-ии для "безGDIшного" рисования.
← →
DVM © (2004-12-28 16:45) [5]
> но есть ф-ии для "безGDIшного" рисования.
Что значит без GDI ??? Либо GDI/GDI+, либо DirectX, либо драйвер видеокарты напрямую - другого не дано.
← →
Sapersky (2004-12-28 17:13) [6]Ф-ии рисования в битмапе, я имею в виду, а не вывода на экран. Для вывода нужно копировать в "GDIшный" битмап или использовать SetDIBitsToDevice/StretchDIBits.
← →
cerber1 © (2004-12-28 23:32) [7]Поппробуй через
bitblt() - очень резвая функция, а вот синхронизация по кадрам - drivers only.
← →
Shaman_Naydak (2004-12-29 07:10) [8]1. переведи перед отображением картинки в dibы, которые сложи в файле, отображенном в память.. В качестве файла вполне подойдет своп (хенд = -1)..
Причина - если уж не хватит памяти, то с диска на диск свопов лишних не бу.
2. собственно дибы выводи SetDIBitsToDevice, как уже было посоветовано выше.. это самый оптимальный способ.
3. Для того, что богомерзкие 98ые не пытались отволынить от перерисовки (а они могут и будут делать это) после вывода вызови FlushGDI
← →
Дмитрий В. Белькевич (2004-12-30 02:42) [9]Всем спасибо за ответы. Задачу решил с помощью tdib"а таки. Несколько комментов.
Для Sapersky:
Картинки разные. Размер одинаковый. Мелькания нет - картинки похожие.
В avi/mpeg/jpg паковать нельзя - появляются артефакты, а на картинках каждая точка критична.
FastLib почти "уговорил". Потом решил плотно добраться до tdib"а. Удалось его заставить работать, правда, с некоторыми оговорками. Огорки сейчас правлю. Обошелся без канваса.
Для DVM - ключевое слово без _ресурсов_ GDI.
Для Sapersky [6]: даже без битмапа-посредника обошлось - сарфэйс умеет прямо из диба забирать данные.
Всем еще раз спасибо за участие.
← →
DiamondShark © (2004-12-30 19:21) [10]
> В avi/mpeg/jpg паковать нельзя - появляются артефакты, а
> на картинках каждая точка критична.
Это для 50-60 fps каждая точка критична? Робот их смотрит, что-ли?
А для avi есть и кодеки без потерь.
← →
Дмитрий В. Белькевич (2004-12-31 02:28) [11]Нет. Критична в статике. Но, для того, что бы не плодить лишние сущности - так проще. Проще, когда и статические картинки и
"кино" просматриваются с битмапов.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.031 c