Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 [3] 4 вперед Ctrl→ все |
Dimitry Sibiryakov Member Откуда: Сообщений: 52451 |
Делаешь из объекта, который надо рисовать, поток пикселей. Потом просто складываешь два потока любым удобным способом, это не требует затрат памяти. Posted via ActualForum NNTP Server 1.5 |
||
23 фев 21, 16:52 [22285216] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Я, похоже, зря паникую. Вот этот код работает.SetLength(b, 10); for i := 0 to 9 do begin b[i] := TBitmap.Create; b[i].PixelFormat := pf24Bit; b[i].SetSize(25000, 25000); b[i].Canvas.Pen.Color := clBlack; b[i].Canvas.MoveTo(1, 1); b[i].Canvas.LineTo(24999, 24999); Memo1.Lines.Add(IntToStr(i) + ' done'); Application.ProcessMessages; end; И картинки сохраняются в BMP чуть меньше 2 гигов. В принципе, это меня устроит, если заработает в десяти потоках. Остается открытым вопрос откуда GDI взяло это ограничение на 2 гига? Неужели все-таки это объем видеопамяти? Ща потоки запилю, подождите. |
23 фев 21, 17:08 [22285225] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 2469 |
У нас есть коммерческий продукт для работы с географическими сервисами. И там именно поточно блочная архитектура. Если бы он всю память отжирал, им бы никто не рискнул пользоваться)) ...и да вас это тоже касается)) |
23 фев 21, 17:25 [22285232] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
|
||||
23 фев 21, 18:03 [22285248] Ответить | Цитировать Сообщить модератору |
Sapersky Member Откуда: Сообщений: 82 |
https://github.com/graphics32/graphics32/tree/master/Source/Packages и 64 бита тоже, судя по исходникам. Странно, если бы не было - это же самая популярная граф. библиотека для Дельфи. Ограничения в GDI связаны скорее всего с его возрастом, во времена проектирования считали, что "High(Integer) хватит всем". |
||||
23 фев 21, 18:03 [22285249] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Я ж могу заранее сказать, сколько памяти отжирать. |
||||
23 фев 21, 18:04 [22285250] Ответить | Цитировать Сообщить модератору |
rgreat Member Откуда: Сообщений: 6564 |
https://github.com/graphics32/graphics32 |
||||||||
23 фев 21, 18:04 [22285251] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
В потоках все отработало на ура. Только при сохранении битмапа он еще столько же памяти отжирает. Но это решаемо. |
23 фев 21, 18:05 [22285252] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Че за продукт? Можно посмотреть? |
||||
23 фев 21, 18:06 [22285253] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Было бы интересно попытать владельцев разных видюшек выполнить это. b := TBitmap.Create; b.PixelFormat := pf24Bit; b.SetSize(25000, 25000); 25000 - меньше 2 гигов, 30000 - больше 2 гигов. |
||||
23 фев 21, 18:09 [22285255] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Круто. Наверное, заюзаю. Пока заметил, что они линии без пикселизации рисуют, это хорошо. |
||||||||
23 фев 21, 18:17 [22285261] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Всем спасибо. Пока выбрал такой путь: Разбивать тифы на куски не больше 2 гигов, рисовать на них, потом склеивать обратно. |
23 фев 21, 18:28 [22285271] Ответить | Цитировать Сообщить модератору |
DHDD Member Откуда: Сообщений: 47 |
Flying-home, win64, 10.3.3, RAM 12Gb, Video Internal max 1849 Mb (Windows 7x64) 25000x25000: ошибок нет, сохранение на диск 1 875 000 054 bytes. 30000x30000: raised exception class EOutOfResources with message 'Параметр задан неверно.' Сообщение было отредактировано: 23 фев 21, 18:44 |
23 фев 21, 18:49 [22285283] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52451 |
Я не скажу за JPEG, но все остальные поддерживаемые TIFF-ом форматы, описанные в википузии, способны обрабатываться последовательно, не требуя затрат памяти вообще. Просто попробуй свои "куски" сделать один пиксель высотой. Posted via ActualForum NNTP Server 1.5 |
||
23 фев 21, 19:20 [22285304] Ответить | Цитировать Сообщить модератору |
defecator Member Откуда: Сообщений: 39692 |
Он прекрасно работает в x64, а "32" в названии - это то, что он работает с 32-ухбитными картинками |
||||||||
23 фев 21, 19:57 [22285323] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
|
||||||||
23 фев 21, 20:47 [22285343] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
|
||||||
23 фев 21, 20:51 [22285346] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52451 |
А надо ли? Проще завести список координат пикселей, которые надо портить в картинке. Posted via ActualForum NNTP Server 1.5 |
||
23 фев 21, 21:07 [22285353] Ответить | Цитировать Сообщить модератору |
Sapersky Member Откуда: Сообщений: 82 |
DIB-ы всегда в системной памяти создавались, они же device-independent. Если интересны картографические проекты, то есть SAS.Planet с открытыми исходниками. Использует, кстати, Graphics32. https://github.com/sasgis/sas.planet.src Правда, официальный сайт с бинарниками у них сейчас лежит, но можно на ютубе посмотреть, как оно выглядит. |
||||
23 фев 21, 21:09 [22285355] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
|
||||||
23 фев 21, 21:32 [22285363] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
|
||||||||
23 фев 21, 21:34 [22285364] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 52451 |
Ну смотри: вот есть у тебя линия от 0,0 до 99,99. Битмап с этой линией займёт 10000 пикселей. Просто пиксели линии - 100. Экономия памяти на два порядка. Posted via ActualForum NNTP Server 1.5 |
||
23 фев 21, 22:57 [22285389] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Да я не собираюсь экономить память. Я думал, что ограничения в 2 ГБ связаны с количеством видеопамяти. Оказалось, что нет. Судя по всему, память под битмап под рисование примитивов выделяется хоть и видеодрайвером, но в обычном ОЗУ и в ней можно рисовать средствами GDI. И выделять ее можно сколько угодно (сколько угодно кусков по 2ГБ) и работать с ней многопоточно. Это все, что мне надо. Но это не точно. Надо будет еще несколько проверок сделать. |
||||||
23 фев 21, 23:14 [22285397] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Что-то долго лежит... |
||||
вчера, 22:26 [22287185] Ответить | Цитировать Сообщить модератору |
Flying-home Member Откуда: kart.vrostove.net Сообщений: 14999 |
Не работает в дополнительных потоках. Это то, чего я опасался изначально. Начинает рисовать, потом в какой-то момент перестает без всяких ошибок и предупреждений. Как-будто игнорирует код. При этом поток продолжает работать, что-то считать, сохранять битмап в файл. И еще не освобождает память, выделенную под картинку. Если не трудно, посмотрите, пожалуйста, код. Может, я чего намудрил? Может, чего не вижу или не знаю? Очередной поток запускается кнопкой, чтоб остановить его, надо выбрать его номер в комбобоксе. После выбора нужно время чтобы поток сохранил файл. В Unit2 две константы, размер битмапа и место куда сохранять. Для того, чтобы убедиться, что не работает, достаточно одного потока (у меня по крайней мере). В диспетчере задач пока он рисует, работает ядро (красненький график). Как перестает рисовать, остается только зелененький. После сохранения картинки в отчете пишется, сколько проходов было сделано. А на самой картинке два числа, второе - количество проходов, которые реально рисовались. После остановки потоков приложение надо закрывать. К сообщению приложен файл (first.zip - 86Kb) cкачать ![]() |
||||
сегодня, 17:08 [22287330] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 [3] 4 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |