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

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

20.10.2012, 20:43. Показов 3064. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru