Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
Delphi 6-7

Отрисовка в OPENGL крадётся память

14.01.2026, 15:09. Показов 642. Ответов 7

Студворк — интернет-сервис помощи студентам
При выводе отрисовки из виртуального холста на TPanel крадётся память примерно 1 МБ если пользоваться колёсико мыши для увеличения или уменьшения изображения. Масштабирование производится изменением масштаба в пользовательском отрисовщике WMPaint(var Msg: TWMPaint); message WM_PAINT;
Если увеличивать или уменьшать с помощью лупы (-) или (+), которые вызывают тот же отрисовщик, то не крадётся ни одного байта.

Контроль события от колёсика мыши:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
procedure TFormSapr.WMMouseWheel(var Message: TWMMouseWheel);
var
  Gradient:integer;
  Gradient_:double;
  i_PerSapX_,i_PerSapY_:double;
  Msg1: TWMPaint;
begin
  XranFlag_Cdvig:=Panel_Visual.Flag_Cdvig;
 
  i_MiddleButton:=i_MiddleButton+message.WheelDelta;
  MiddleButton:=Message.WheelDelta;
 
  Panel_Visual.i_Scale_Old:=Panel_Visual.i_Scale;
if FormSapr.Panel_Visual_Raskroj1<>nil then
  Panel_Visual_Raskroj1.i_Scale_Old:=Panel_Visual_Raskroj1.i_Scale
else
  Panel_Visual_Raskroj2.i_Scale_Old:=Panel_Visual_Raskroj2.i_Scale;
 
if  PageControl1.TabIndex=1 then
  Gradient_:=1000/Round(Panel_Visual.i_Scale_Old*100)
else
if  PageControl1.TabIndex=3 then
begin
if FormSapr.Panel_Visual_Raskroj1<>nil then
  Gradient_:=1000/Round(Panel_Visual_Raskroj1.i_Scale_Old*100)
else
  Gradient_:=1000/Round(Panel_Visual_Raskroj2.i_Scale_Old*100); //
end;
     if MiddleButton<>0 then
     if MiddleButton>0 then
     begin
  LMDLabel_Message.Caption:='УВЕЛИЧЕНИЕ';
 
          if  PageControl1.TabIndex=1 then
          begin
            Panel_Visual.i_Scale:=Panel_Visual.i_Scale+1/Gradient_;
            Panel_Visual.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
          end
          else
          if  PageControl1.TabIndex=3 then
          begin
            if FormSapr.Panel_Visual_Raskroj1<>nil then
            begin
              Panel_Visual_Raskroj1.i_Scale:=Panel_Visual_Raskroj1.i_Scale+1/Gradient_;
              Panel_Visual_Raskroj1.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
            end
            else
            begin
              Panel_Visual_Raskroj2.i_Scale:=Panel_Visual_Raskroj2.i_Scale+1/Gradient_;
              Panel_Visual_Raskroj2.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
 
            end;
          end;
     end
     else
     if MiddleButton<0 then
     begin
  LMDLabel_Message.Caption:='УМЕНЬШЕНИЕ';
          if  PageControl1.TabIndex=1 then
          begin
              Panel_Visual.i_Scale:=Panel_Visual.i_Scale-1/Gradient_;
              Panel_Visual.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
          end
          else
          if  PageControl1.TabIndex=3 then
          begin
            if FormSapr.Panel_Visual_Raskroj1<>nil then
             begin
              if Panel_Visual_Raskroj1.i_Scale>0.01 then
              Panel_Visual_Raskroj1.i_Scale:=Panel_Visual_Raskroj1.i_Scale-1/Gradient_;
              Panel_Visual_Raskroj1.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
             end
             else
             begin
              if Panel_Visual_Raskroj2.i_Scale>0.01 then
              Panel_Visual_Raskroj2.i_Scale:=Panel_Visual_Raskroj2.i_Scale-1/Gradient_;
              Panel_Visual_Raskroj2.Scale_MiddleButton(i_PerSapX_,i_PerSapY_);
             end;
 
          end;
     end;
   if FormSapr.Panel_Visual_Raskroj1<>nil then
     Panel_Visual_Raskroj1.i_Scale_Old:=Panel_Visual_Raskroj1.i_Scale
   else
     Panel_Visual_Raskroj2.i_Scale_Old:=Panel_Visual_Raskroj2.i_Scale;
     Panel_Visual.Flag_Cdvig:=XranFlag_Cdvig;
 
      Label_MemoryVirtClick; // Сколько сжирает памяти
end;
Вызов пересчёта на виртуальном холсте Scale_MiddleButton :

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
procedure TcPanel_Figures.Scale_MiddleButton(ai_PerSapX, ai_PerSapY: double);
var
   Dx,Dy:double;
//   Msg1: TWMPaint;
 
begin
 
     {Down}
     i_Perenoc_OldX:=MouseX;
     i_Perenoc_OldY:=MouseY;
 
     {Up}
     i_PerenocX:=i_PerSapX+2*(Width/2-i_Perenoc_OldX)/(Width);
     i_PerenocY:=i_PerSapY-2*(Height/2-i_Perenoc_OldY)/(Height);
     i_PerSapX:=i_PerenocX;
     i_PerSapY:=i_PerenocY;
 
      CentrePointMaschtab.X:=Width/2;
      CentrePointMaschtab.Y:=Height/2;
 
      i_PerenocX:=(i_PerSapX-2*(CentrePointMaschtab.X-(Width)/2)/(Width))*i_Scale/i_Scale_Old;
      i_PerenocY:=(i_PerSapY-2*(CentrePointMaschtab.Y-(Height)/2)/(Height))*i_Scale/i_Scale_Old;
      i_PerSapX:=i_PerenocX;
      i_PerSapY:=i_PerenocY;
 
 
     {Down}
     i_Perenoc_OldX:=Width/2;
     i_Perenoc_OldY:=Height/2;
 
     {Up}
     i_PerenocX:=i_PerSapX+2*(MouseX-i_Perenoc_OldX)/(Width);
     i_PerenocY:=i_PerSapY-2*(MouseY-i_Perenoc_OldY)/(Height);
     i_PerSapX:=i_PerenocX;
     i_PerSapY:=i_PerenocY;
//      RePaint;
        WMPaint(Msg1);
 
      EditValue1.Text:=FLoatToStr(Round(i_Scale*100));//100
 
end;

Сам отрисовщик очень большой, потом могу дать код если понадобится упаковав его в rar файл.

Если есть мысли подскажите пожалуйста, как при одном и том же отрисовщике при пользовании колёсиком мыши память крадётся, о увеличение лупами нет.
Сразу скажу что событие мыши ловлю в приложении, а потом передаю уже изменённый масштаб в виртуальный холст, но перенос MouseWheelDown и MouseWheelUP для ловли события от колёсика мыши ничего не даёт, всё масштабируестя, но память крадётся также.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.01.2026, 15:09
Ответы с готовыми решениями:

Зацикливание отрисовки формы при использовании OpenGL во фрейме
Всем добрый день. Я новичок в работе с графикой, но возникла необходимость отрисовки большого...

Проблемы с отрисовкой объекта Image
Написал игру. Стал все текстурами украшать и столкнулся с вот такой проблемой: объект Image с...

Отрисовка элемента в Image
Доброго времени суток всем. Необходимо по нажатию кнопки в Image получить координаты и отрисовать...

7
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
14.01.2026, 15:11  [ТС]
Файл видео показывающий это
Вложения
Тип файла: avif 2026-01-1413-15-40-ezgif.com-video-to-avif-converter.avif (290.4 Кб, 9 просмотров)
0
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
14.01.2026, 15:15  [ТС]
Отрисовщик на виртуальном холсте
Вложения
Тип файла: rar WMPaint.rar (4.6 Кб, 4 просмотров)
0
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
17.01.2026, 12:19  [ТС]
В данном видео подтверждается то, что это не ошибка в программе по высвобождению памяти при работе с колёсиком мыши используя его в Компасе-3D V15:

Delphi
1
procedure WMMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;
а BAD производителя драйвера мыши для Win10, кстати это подтверждается и тем, что если в Win10 использование колёсика мыши крадёт мегабайты за один поворот, то в WinXP только килобайты. Почему они это сделали одному Богу известно.
Видео прилагается. Обратите внимание что в начале видео на Компас с изображением сложного контура занимает 127 МБ памяти, а за буквально четыре поворота колёсика мыши вверх-вниз (увеличить, уменьшить), уже занимает 147 МБ памяти.
А если изменять масштаб в Компасе рамкой, то не увеличивает память под Компас. Но вопрос не считаю закрытым, потому что остаётся вопрос ЧТО ДЕЛАТЬ чтобы это устранить.
Вложения
Тип файла: mp4 NewFilm_260117105324.mp4 (865.1 Кб, 5 просмотров)
0
Модератор
4146 / 2357 / 812
Регистрация: 15.11.2015
Сообщений: 9,427
17.01.2026, 14:32
Цитата Сообщение от basil_cat Посмотреть сообщение
а BAD производителя драйвера мыши для Win10, кстати это подтверждается и тем, что если в Win10 использование колёсика мыши крадёт мегабайты за один поворот
Нет. Если это баг драйвера мыши, то почему память увеличивается у пользовательской программы? Если и в вашей программе проблема с памятью, то искать нужно в самой программе.
0
фрилансер
 Аватар для Алексей1153
6461 / 5666 / 1130
Регистрация: 11.10.2019
Сообщений: 15,081
18.01.2026, 09:28
basil_cat, нужно искать утечку памяти в программе, не в мыши же

сделай самую простую отрисовку - чёрный квадрат.

Проблема повторяется с ним ?

Последовательно прикрывай участки кода отрисовки, пока проблема не пропадёт.

Тогда будет понятно, в каком моменте утечка

Добавлено через 59 секунд
Цитата Сообщение от basil_cat Посмотреть сообщение
Сам отрисовщик очень большой, потом могу дать код если понадобится упаковав его в rar файл.
только не в rar, а в ZIP
0
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
19.01.2026, 05:35  [ТС]
AzAtom,
Нет. Если это баг драйвера мыши, то почему память увеличивается у пользовательской программы? Если и в вашей программе проблема с памятью, то искать нужно в самой программе.
Смотрим видео и убеждаемся, что это КОМПАС 3D V15 и в Диспетчере задач чётко видно что при вращении колёсика (увеличить/уменьшить) память увеличивается на 10 МБ. Я не думаю, что фирме АСКОН нужно искать у себя в ПО. И ровно столько же (10 МБ) крадётся в моём приложении в WIN10.
Я нашёл сайт https://electronix.ru/forum/to... nt-2028008 на котором обьясняется, что это драйвер мыши. Но если это так, то в разных ОС должно съедать одинаковое количество памяти (хотя не совсем факт). Но в Win10 ест 10 МБ, за одинаковое вращение в WINXP ест 10 КБ. Моё мнение что это ОС, а не драйвер. Кстати в этот момент съёма видео моя програма не запущена. Извините что долго не отвечал, 2 дня не мог зайти обычным способом на ваш сайт. Пришлось идти через TOR и то удалось только сейчас. Видимо наши гавнюки из СУБУ блокируют ваш сайт.
Вложения
Тип файла: mp4 NewFilm_260118092611.mp4 (1.71 Мб, 7 просмотров)
0
5 / 22 / 1
Регистрация: 24.11.2015
Сообщений: 165
20.01.2026, 13:08  [ТС]
Алексей1153, Алексей, смотри ниже ответ AzAtomy и прикрепленное видео. Думаю вы неправы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.01.2026, 13:08
Помогаю со студенческими работами здесь

StringGrid, скрытие и отрисовка ячеек
Здраствуйте, хотел спросить совета у знающих людей. У меня есть StringGrid1 заполненный данными. ...

Отрисовка дуги(окружности)
Привет, делаю рисовалку символов, надо имитировать рисование символов, линии сделал, а как сделать...

ошибки при отрисовке визуализации в bass.dll
если в тот момент когда включен таймер на отрисовку визуализации, не играет трек, то ошибка каджый...

Отрисовка ячеек StringGrid
Приветствую! Столкнулся с проблемой при динамическом создании StringGrid-ov. Ячейки почему-то...

Не происходит отрисовки на динамически созданной форме
Добрый вечер. Делаю процедуру, которая должна создать новую форму, и отметить на на ней поле 8*8(1...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru