С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232

Оперативная память и Bitmap

20.10.2012, 20:43. Показов 3062. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Заметил одну странность при работе с битмапом. Вот пример:
C++
1
2
3
4
5
6
7
8
Graphics::TBitmap* bmp;
bmp = new Graphics::TBitmap;
Caption = sizeof(*bmp); // 64 байта
Sleep(1000);
bmp->Width = 10000;
bmp->Height = 10000;
Caption = sizeof(*bmp); // 64 байта
Caption = sizeof(Graphics::TBitmap); // 64 байта
При этом в Process Explorer увеличение памяти тоже не происходит. В связи этим вопрос: где хранится битмап?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.10.2012, 20:43
Ответы с готовыми решениями:

Помещение BitMap изображения в динамическую память
Здравтсвуйте. У меня такой вопрос. Как поместить всю информацию о картинке в формате bmp в динамическую память? Как вы понимаете, я хочу...

Оперативная память (СИ/СИ++)
Подскажите пожалуйста, как можно на си/си++ "взять" из оперативной памяти пароли, вводимые в каких либо программах или какой то одной...

Оперативная память и видео память, связь ?
Доброго времени суток, уважаемые! Являюсь обладателем следующей машинки: MacBook Pro 13 дюймов, конец 2011 года. Сделал небольшой...

21
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
20.10.2012, 21:15
А ты нарисуй чего-нить на этих тысячах пикселей, он и скушает память.
И определение размера с помощью sizeof вряд ли корректно, так как графика вероятнее всего хранится в динамически выделенной памяти, в классе же TBitmap хранится лишь указатель на нее.
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
20.10.2012, 21:20  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
А ты нарисуй чего-нить на этих тысячах пикселей, он и скушает память.
И определение размера с помощью sizeof вряд ли корректно, так как графика вероятнее всего хранится в динамически выделенной памяти, в классе же TBitmap хранится лишь указатель на нее.
Это первое, что приходит в голову Битмап содержит в себе уже точки белого цвета (если бы был какой-нибудь NULL, то цвет был бы чёрным).
Добавляем код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
Graphics::TBitmap* bmp;
bmp = new Graphics::TBitmap;
Caption = sizeof(*bmp); // 64 байта
Sleep(1000);
bmp->Width = 10000;
bmp->Height = 10000;
bmp->Canvas->Brush->Color = clRed;
bmp->Canvas->FillRect(bmp->Canvas->ClipRect);
bmp->Canvas->Brush->Color = clBlack;
bmp->Canvas->FillRect(TRect(10,10,2000,2000)); // ради разнообразия :)
Caption = sizeof(*bmp); // всё те же 64 байта
Caption = sizeof(Graphics::TBitmap); // 64 байта
Ну, а вообще у битмапа есть Canvas, который при тех же манипуляциях не изменяется (88 байт).
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2012, 21:36
Помести все в цикл и увидишь как память растет.

C++
1
2
3
4
5
6
for(int i=0;i<10000;i++)
 {
   Graphics::TBitmap* bmp = new Graphics::TBitmap;
   bmp->Width = 10000; 
   bmp->Height = 10000;
 }
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
20.10.2012, 22:22  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Помести все в цикл и увидишь как память растет.

C++
1
2
3
4
5
6
for(int i=0;i<10000;i++)
 {
   Graphics::TBitmap* bmp = new Graphics::TBitmap;
   bmp->Width = 10000; 
   bmp->Height = 10000;
 }
Увы, не растёт, только жутко лагает. Ну оно и понятно, каждый раз выделить память и изменить размер за доли секунды.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
20.10.2012, 23:01
С таким расчет не много машин выдержат подобное. 10000 изображений с размером 10000х10000 весят не мало. Память приложения будет увеличиваться с каждой инициализацией TBitmap.

Однако касательно места хранения непосредственного изображения сказать не могу. По идее раз создается с помощью CreateBitmap/CreateCompatibleBitmap, то должно хранится в каком-нибудь процессе, а скорее всего в службе ОС. Ради забавы использовал массив изображений из 100 элементов размером 3000х3000, память процесса при этом увеличилась примерно на 700кб.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
20.10.2012, 23:03
Цитата Сообщение от T2skler Посмотреть сообщение
Ну, а вообще у битмапа есть Canvas, который при тех же манипуляциях не изменяется (88 байт).
А у канвы есть еще какое-нибудь скрытое хранилище данных, доступ к которому не получить, так как это не приветствуется принципами ООП. Так грубо и напрямую реальные размеры выделенной памяти не узнать.
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
20.10.2012, 23:22  [ТС]
Цитата Сообщение от DefineTrueFalse Посмотреть сообщение
С таким расчет не много машин выдержат подобное. 10000 изображений с размером 10000х10000 весят не мало. Память приложения будет увеличиваться с каждой инициализацией TBitmap.
Я уменьшил до 10, 10000 сведёт мой ноутбук с ума

Цитата Сообщение от BRcr Посмотреть сообщение
А у канвы есть еще какое-нибудь скрытое хранилище данных, доступ к которому не получить, так как это не приветствуется принципами ООП. Так грубо и напрямую реальные размеры выделенной памяти не узнать.
Жалко никакой информации о битмапах в интернетах не найти.

Тогда ещё один вопрос. Приемлемо ли в компоненте, например, в кнопке, хранить битмап размером примерно 600х200 при реальных размерах кнопки в 100х30? Всё это нужно для уменьшения загрузки на цп при изменении размера формы и соответственно размера компонента (буферного битмапа).
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2012, 23:34
Ну...
Миниатюры
Оперативная память и Bitmap  
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
20.10.2012, 23:36  [ТС]
А на какой итерации появился ексепшн?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.10.2012, 23:41
На третьей...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.10.2012, 00:58
Цитата Сообщение от T2skler Посмотреть сообщение
Приемлемо ли в компоненте, например, в кнопке, хранить битмап размером примерно 600х200 при реальных размерах кнопки в 100х30? Всё это нужно для уменьшения загрузки на цп при изменении размера формы и соответственно размера компонента (буферного битмапа).
А что конкретно при этом так загружает проц?
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
21.10.2012, 02:14  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
А что конкретно при этом так загружает проц?
Постоянное изменение размеров буферного битмапа. Если очень часто изменять размер формы, то время изменения размера увеличивается и загрузка цп достигает 6%.
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
21.10.2012, 02:21
Цитата Сообщение от Avazart Посмотреть сообщение
На третьей...
У меня без дебагера все закончилось минут через 15 на ошибке "Невозможно найти указанный файл"
Цитата Сообщение от BRcr Посмотреть сообщение
А у канвы есть еще какое-нибудь скрытое хранилище данных, доступ к которому не получить, так как это не приветствуется принципами ООП. Так грубо и напрямую реальные размеры выделенной памяти не узнать.
TCanvas::Handle скрытным можно назвать весьма относительно. Другой вопрос, что действительно нет смысла залезать в HDC, когда есть весь набор "инструментов" для работы с ним.
Цитата Сообщение от T2skler Посмотреть сообщение
Постоянное изменение размеров буферного битмапа. Если очень часто изменять размер формы, то время изменения размера увеличивается и загрузка цп достигает 6%.
Что-то мне подсказывает, что в битмапе рисуется вся постоянно форма, контролы и т.п. в одной операции, а не просто задний план.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2012, 02:23
У меня без дебагера все закончилось минут через 15 на ошибке "Невозможно найти указанный файл"
Не понял вы о чем?
0
872 / 448 / 35
Регистрация: 25.10.2011
Сообщений: 910
21.10.2012, 02:29
Цитата Сообщение от Avazart Посмотреть сообщение
Не понял вы о чем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int count = 10000;
Graphics::TBitmap ** bmp_list = new Graphics::TBitmap * [count];
for (int index = 0; index < count; index++)
{
    bmp_list[index] = new Graphics::TBitmap;
    bmp_list[index]->SetSize(10000,10000);
}
 
// breakpoint - 1
 
for (int index = 0; index < count; index++)
    delete bmp_list[index];
delete[] bmp_list;
 
// breakpoint - 2
До цикла освобождения памяти дело не дошло. Без отладчика через мин 15 вылетела ошибка "Невозможно найти указанный файл".
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.10.2012, 02:32
Ну так файла та нету никакого....
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
21.10.2012, 02:32
Так попробуй:
C++
1
2
3
4
5
6
7
8
9
Graphics::TBitmap* bmp;
bmp = new Graphics::TBitmap;
bmp->PixelFormat=pf24bit;
Caption = sizeof(*bmp); // 64 байта
Sleep(1000);
bmp->Width = 10000;
bmp->Height = 10000;
Caption = sizeof(*bmp); // 64 байта
Caption = sizeof(Graphics::TBitmap);
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
21.10.2012, 10:51
Цитата Сообщение от T2skler Посмотреть сообщение
Если очень часто изменять размер формы, то время изменения размера увеличивается и загрузка цп достигает 6%.
И зачем это делать очень часто, от скуки что ли? Эта проблема лежит уже в сфере прикладной ерундистики. Где-то просто есть лишняя перерисовка или другие ненужные действия.
0
 Аватар для T2skler
50 / 50 / 6
Регистрация: 16.05.2012
Сообщений: 232
21.10.2012, 16:06  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
И зачем это делать очень часто, от скуки что ли? Эта проблема лежит уже в сфере прикладной ерундистики. Где-то просто есть лишняя перерисовка или другие ненужные действия.
Я бы не стал писать на форум, если бы не был уверен, что дело именно в постоянном изменении размера буфера Через AQTime проверил на что уходит больше времени и это оказалось изменение размера буфера. Иначе можно сделать только увеличив буфер, чтобы постоянно с изменением ширины и высоты контроля не менять ширину и высоту буфера.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.10.2012, 16:06
Помогаю со студенческими работами здесь

Оперативная память заполнена на 52%, однако вирт. память заполнена на все 95+
Вообщем стоит ферма на 40 окон и ботиться(Для вас можно назвать что-то типо майнинга, только без курса, вообщем не в этом суть) Файл...

оперативная память
здраствуйте, не могу понять в чем проблема unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,...

Оперативная память
Как при помощи PascalABC.NET можно работать с браузерами и оперативной памятью? Заранее большое спасибо!!!

Оперативная память
4 ГБ DDR3-1333 DDR3 SDRAM (8-8-8-22 @ 609 МГц) (7-7-7-20 @ 533 МГц) (6-6-6-17 @ 457 МГц) (5-5-5-14 @ 380 МГц) нормально будет две такие...

Оперативная память
Почему на моём компьютере установлено 4 гб оперативной памяти , а в системе пишет, то что только 3.12 доступно?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru