Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщение "Неверный дескриптор" при загрузки с Bmp 
:(
    Опции темы
daemonghost
Дата 13.6.2011, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



В процессе написания игрушки столкнулся с такой проблемой: при достаточном количестве оперативной памяти, при работе с TBitmap после загрузки в буфер определенного количества изображений вылетает данная ошибка (неверный дескритор).

 Я пытаюсь загрузить в буфер 21303 изображений 32X32 с глубиной 32 Бит. На деле - это около 80 МБ, но загружается только половина, отслеживал изменения свободной оперативной памяти - свободно 200 МБ.
 При загрузки такого же количества, но 16X16 с глубиной 32Бит загружается все количество необходимых изображений.

Код

var
  arr: array of Tbitmap;
... 

procedure TForm1.Button1Click(Sender: TObject);
var i:integer; Bitmap:TBitmap;
begin
ProgressBar1.Min:=0;
ProgressBar1.Max:=strtoint(edit1.Text);

Bitmap:=Tbitmap.Create; {для эксперимента} 
Bitmap.Height:=32;
Bitmap.Width:=32;

setlength(arr,sizeof(TBitmap)*strtoint(edit1.Text));

for i:=0 to strtoint(edit1.Text) do {ранее на месте strtoint(edit1.Text) был length(arr)-1 выдавало сообщение 
"Недостаточно памяти для выполнения команды", потом дошло, 
что я резервирую больше необходимой памяти чем загружаемых ресурсов } 
begin
arr[i]:=Tbitmap.Create; 
arr[i].Height:=32; {при необходимости менял значения на 16} 
arr[i].Width:=32;
arr[i].LoadFromFile(inttostr(i)+'.bmp');
{Bitmap.LoadFromFile(inttostr(i)+'.bmp');} {для эксперимента} 
{arr[i].Canvas.StretchDraw(Rect(0,0,16,16),
           Bitmap);}
ProgressBar1.Position:=i; {отслеживаю примерное количество загруженных изображений}
end;
showmessage('Загружено');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
arr:=nil;
Bitmap.free;
end;


Проблемы с однозначно с программой! На любом компьютере пробую отработать программу - одно и тоже сообщение "неверный дескриптор"! Загружено 44 460 - 46 136 KБ.

 Пробы на
 1 ядерном процессоре + 1ГБ оперативной памяти WinXP Pro SP3 - загружено 46 446 {данные практически не меняются} 
 2 ядерном процессоре + 1ГБ оперативной памяти WinXP Pro SP3 - загружено 46 136, {данные практически не меняются}
 2 ядерном процессоре + 4ГБ оперативной памяти - 44 460. {данные практически не меняются}

Вопрос: какможно организовать загрузку в "банк текстур" необходимое количество информации? Буду рад любому ответу.

P.S. МОжет Delphi7 Int не способна загрузить больше информации?

Это сообщение отредактировал(а) daemonghost - 13.6.2011, 12:21
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 13.6.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



setlength(arr,sizeof(TBitmap)*strtoint(edit1.Text)); странное выделение памяти... ну да ладно, вряд ли это имеет отношение к проблеме. Есть предположение, что в системе заканчиваются дескрипторы для создания битмапов. Обычно никто не загружает маленькие картинки по одному. Проще нарисовать их все на одном большом битмапе и зная координаты каждого отрисовывать его как кусочек используя функции типа CopyRect 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
daemonghost
Дата 13.6.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



спасибо, Alexeis, за пояснение. Я попробую этим воспользоваться.

Действительно получилось, только я загружал мои кусочки и склеивал их в один тайл (Буфер). В итоге получил свои 89 МБ.

На счет выделения памяти скажу, что когда использовал setlength(arr,strtoint(edit1.Text)); то выпадало сообщение invalid pointer operation при освобождении ресурсов.

Это сообщение отредактировал(а) daemonghost - 13.6.2011, 21:27
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 13.6.2011, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(daemonghost @  13.6.2011,  20:57 Найти цитируемый пост)

На счет выделения памяти скажу, что когда использовал setlength(arr,strtoint(edit1.Text)); то выпадало сообщение invalid pointer operation при освобождении ресурсов.

  setlength выделяет память в элементах, а не в байтах, так что ошибка скорее всего в выходе за границу диапазона в другом месте.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
daemonghost
Дата 15.6.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата(Alexeis @ 13.6.2011,  22:07)
Цитата(daemonghost @  13.6.2011,  20:57 Найти цитируемый пост)

На счет выделения памяти скажу, что когда использовал setlength(arr,strtoint(edit1.Text)); то выпадало сообщение invalid pointer operation при освобождении ресурсов.

  setlength выделяет память в элементах, а не в байтах, так что ошибка скорее всего в выходе за границу диапазона в другом месте.

тут вы правы полностью!
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.