|
|
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
Добрый день! Непонятная хренотень происходит. Win10 64, 10.2 Tokyo. Нарисовал наследника TPanel Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Передаю данные на отрисовку и наблюдаю, что за 4 часа данный проект сожрал почти 280 Мб оперативки по таск-менеджеру. Код отрисовки: Код: pascal 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. Если я закомментирую Canvas.Draw(0,0,bm); то оперативка будет в пределах 10 Мб долгое время (более 4 часов). Обращение к DrawData происходит 1 раз в секунду. Если бы не было FreeAndNil, то размер потребляемой памяти бы также увеличивался каждый такт, а он растет какими-то скачками по 1-3 Мб то раз в минуту, то раз в 2-3 минуты. Может у кого-то была подобная проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 14:37 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
Kast2K, А FastMM утечку показывает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 14:39 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
asviridenkov, забыл добавить, ни FastMM, ни EurekaLog ничего не показывают. Она просто утекает. Если FreeAndNil на bm комментирую, то Eureka сразу выдает инфу об утечке ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 14:44 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
А если так Код: pascal 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 15:05 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Супер! Я этот вариант подставления вместо отдельной процедуры даже не рассматривал в запаре :) т.к. казалось что какая разница откуда рисовать на канве из OnPaint или соседней процедуры. За 15 минут прирост составил около 400 Кб, что не очень существенно. Естественно я буду и дальше наблюдать за процессом, но интересно, почему такое поведение? Не хватало Refresh? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 15:24 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
Kast2Kинтересно, почему такое поведение? Не хватало Refresh?Нет. В моем случае отрисовка происходит тогда, когда система посчитает нужным. А Refresh это уведомление системе, что данные изменились и нужно перерисоваться. У вас же перерисовка происходит всегда принудительно. Вообще, любую кастомную отрисовку нужно производить только внутри обработчика WM_PAINT ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 15:34 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_любую кастомную отрисовку нужно производить только внутри обработчика WM_PAINTКак категорично-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 15:46 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
rgreatКак категорично-то.Давай контр-пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 15:55 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 17:29 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
rgreat Код: pascal 1. 2. Это не "рисуем" а говорим TImage какую картинку мы хотим видеть. А когда система решит перерисовать TImage - заранее неизвестно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 17:39 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Это не "рисуем" а говорим TImage какую картинку мы хотим видеть Читай "рисуем на BMP" как "а тут предвариельно рисуем на битмап". А когда система решит перерисовать TImage - заранее неизвестноНарисует как дойдет очередь сообщений. Если надо "прям сразу" добавляем Image1.Repaint; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 17:45 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
rgreatЕсли надо "прям сразу" добавляем Image1.Repaint;Правильно. А ТС вызывал рисование напрямую Kast2KCanvas.Draw(0,0,bm); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 18:48 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Вообще, любую кастомную отрисовку нужно производить только внутри обработчика WM_PAINT Это не так. Во-первых, рисование в буферах (на том же битмапе) ничем не отличается от рисования в окнах. А там, понятное дело, никаких WM_PAINT-ов нет. Во-вторых, если бы это было так, MS не стал бы городить огород с GDI-batch-ами, которые внутри BeginDraw..EndDraw просто не используются. У автора, я сильно подозреваю, проблемы с утечками из-за многопоточности, забыл залочить канву битмапа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2019, 19:51 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
А зачем каждый раз заново создавать Bitmap внутри процедуры, а потом его уничтожать ? Не проще создать его один раз в Create с нужными размерами и настройками, а в самой процедуре просто очищать его и рисовать то, что надо ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2019, 10:03 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
М-да... Создать битмап для простой отрисовки надписи в середине канвы, использовать при этом два защищаемых блока, уничтожить в конце и поиметь при этом проблемы... Что-то тут не так. Куда катится мир. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2019, 10:37 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
defecator, нормально, только щас для этого есть спец функция, поделку в виде TBitmap явно не стоит использовать предложение Соколинский Борис скорее всего верно, что-то автор недоговаривает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2019, 10:59 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
Соколинский БорисВо-первых, рисование в буферах (на том же битмапе) ничем не отличается от рисования в окнах.Кроме того факта, что битмап отрисовывается именно тогда, когда указал программист, а не решила система. И какой смысл рисовать окно с частотой 1000 раз в секунду, если система успеет отрисовать только 50? Кроме того, отрисовка окна вне WM_PAINT будет приводить к затиранию рисунка накладывающимися окнами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2019, 13:33 |
|
||
|
Утечка памяти при Canvas.Draw(0,0,bmp)
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, это не является доказательством тезиса, на который я возражал: любую кастомную отрисовку нужно производить только внутри обработчика WM_PAINT. Прорисовка, скажем, прямоугольника выделения курсором - тоже кастомная отрисовка, и совсем необязательно ради нее городить сложную схему для встраивания в BeginDraw..EndDraw. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.05.2019, 14:01 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=73&tid=2039455]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
| others: | 249ms |
| total: | 406ms |

| 0 / 0 |
