Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2009, 18:52   #11
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
Хорошо

Спасибо за советы. Теперь я это уяснил
Алекс Ялта вне форума Ответить с цитированием
Старый 11.06.2011, 00:44   #12
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

вы уж простите, что я поднимаю этот вопрос снова!
В процессе написания игрушки столкнулся с такой проблемой: при достаточном количестве оперативной памяти, при работе с 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;
везде полазил где описана такая проблема, но точного ответа нет. А вопрос в следующем, на сколько Delphi ограничен в работе с Bitmap, дабы мне в далнейшем необходимо загружать около 1000 Bitmap, но уже большего размера и я опасаюсь, что будет выдавать эту ошибку, или что у меня неправильного (как можно оптимизировать, чтобы избежать выпадания ошибки)?

P.S. Заранее, спасибо за все ответы!
Daemonghost вне форума Ответить с цитированием
Старый 11.06.2011, 01:14   #13
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Daemonghost Посмотреть сообщение
Я пытаюсь загрузить в буфер 21303 изображений 32X32 с глубиной 32 Бит.
Ты за всю жизнь столько разных текстур не нарисуешь. Для неплохой игры хватает 250 штук, для крутой - 2000-3000 разных тайлов для всех покрытий и конструкторов зданий и объектов, включая анимированные.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.06.2011, 07:16   #14
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

я согласен с вами, что столько не нарисую, но мне интересно, почему программа не может загрузить более 20000 файлов с общим объемом в 80МБ, ведь есть программы с которые занимают более 160 МБ оперативной памяти, а моя максимум 46 МБ. Может, действительно, я что-то неправильно делаю?

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

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

Последний раз редактировалось Daemonghost; 11.06.2011 в 21:06.
Daemonghost вне форума Ответить с цитированием
Старый 11.06.2011, 23:18   #15
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Daemonghost, объекты TBitmap, если правильно понимаю, сами освобождаются при закрытии программы, ...возможно Delphi не в состоянии уследить за объемом памяти под такой формат более 40 с небольшим мегабайт. Я применяю Array Of Byte для хранения текстур, ...вся свободная память доступна.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.06.2011, 22:35   #16
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Daemonghost, объекты TBitmap, если правильно понимаю, сами освобождаются при закрытии программы, ...возможно Delphi не в состоянии уследить за объемом памяти под такой формат более 40 с небольшим мегабайт. Я применяю Array Of Byte для хранения текстур, ...вся свободная память доступна.
я так понимаю, вы храните сам битовый массив, а после "собираете" воедино текстуру?

Можно пример использования, если это не секрет.
Daemonghost вне форума Ответить с цитированием
Старый 13.06.2011, 16:29   #17
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Daemonghost Посмотреть сообщение
я так понимаю, вы храните сам битовый массив, а после "собираете" воедино текстуру? Можно пример использования, если это не секрет.
Пример в теме "Как вы относитесь к созданию игр на Delphi?" #634, #635. Там через PChar.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 13.06.2011, 22:32   #18
Daemonghost
Пользователь
 
Аватар для Daemonghost
 
Регистрация: 25.11.2010
Сообщений: 46
По умолчанию

Beermonza, спасибо за помощь, вы очень помогаете нам, новечкам. Я справился со своей проблемой по другому, можно сказать через Ж. в общем, я загружал свои текстуры и склеивал в один тайл, таким образом получился Bitmap размерами 681696*32 32 бит.

P.S. Посты прочел, многое уяснил, но это пока немного сложно для меня.
Daemonghost вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
Ошибка при установке "critical errors were found in setup" tsergey Софт 1 13.03.2009 03:58
"Ошибка приложения" при запуске мидлета hotman Общие вопросы по Java, Java SE, Kotlin 0 04.09.2008 15:16
Ошибка при "управлении вложениями"!!! Altera О форуме и сайтах клуба 1 09.03.2008 15:38
Что такое "дескриптор" и с чем его едят? Snake_ua Win Api 3 30.10.2007 11:17