Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1106489170
Mamed
2005-01-23 17:06
2005.02.20
TQRCompositeReport


1-1107772136
Raider
2005-02-07 13:28
2005.02.20
Как сделаь так чтоб


14-1107175263
Луарвик
2005-01-31 15:41
2005.02.20
Delphi7 и Delphi8


1-1107489800
Артем К.
2005-02-04 07:03
2005.02.20
Как отловить в Design-тайме сообщение типа CM_MOUSELEAVE?


14-1106727696
vidiv
2005-01-26 11:21
2005.02.20
Kerio WR... и http





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский