Как побороть мерцание?

 

Все построения рисую в одном большом OBJ_BITMAP_LABEL. Для создания всплывающих подсказок создаю другие OBJ_BITMAP_LABEL на нужном уровне с параметром OBJPROP_TOOLTIP. Что бы не копились эти дополнительные OBJ_BITMAP_LABEL просто удаляю их при необходимости обновить построения. Но из-за этого при прокрутке чарта появляется мерцание. Может кто сталкивался с такой проблемой?


 
Вам нужно детальней посмотреть, что происходит в коде, возможно, что чего-то дофига создается, а потом удаляется при прокрутке чарта. Либо фон заливаете/стираете
 
Мерцает даже при удалении несуществующего объекта.
 
Timur Gatin:
Мерцает даже при удалении несуществующего объекта.
а если переключить монитор на простенькую видеокарту?
 
Timur Gatin:

Все построения рисую в одном большом OBJ_BITMAP_LABEL. Для создания всплывающих подсказок создаю другие OBJ_BITMAP_LABEL на нужном уровне с параметром OBJPROP_TOOLTIP. Что бы не копились эти дополнительные OBJ_BITMAP_LABEL просто удаляю их при необходимости обновить построения. Но из-за этого при прокрутке чарта появляется мерцание. Может кто сталкивался с такой проблемой?


Посмотрите пример работы с ресурсами в привязке к OBJ_BITMAP_LABEL: TextOut. Главная идея: сначала рисуем в буфере (в ресурсе), а потом быстро обновляем. Таким образом время обновления изображения очень мало, по сравнению со временем показа изображения.
 
Timur Gatin:

Все построения рисую в одном большом OBJ_BITMAP_LABEL. Для создания всплывающих подсказок создаю другие OBJ_BITMAP_LABEL на нужном уровне с параметром OBJPROP_TOOLTIP. Что бы не копились эти дополнительные OBJ_BITMAP_LABEL просто удаляю их при необходимости обновить построения. Но из-за этого при прокрутке чарта появляется мерцание. Может кто сталкивался с такой проблемой?


Создавайте необходимое количество обьектов в ините, далее просто их модифицируйте, в деините удаляйте.

А мерцание происходит из за не верно спроектированного кода, подозреваю что объекты мерцают ещё и когда мышью двигаете.

 
Vladimir Pastushak:

Создавайте необходимое количество обьектов в ините, далее просто их модифицируйте, в деините удаляйте.

А мерцание происходит из за не верно спроектированного кода, подозреваю что объекты мерцают ещё и когда мышью двигаете.

Наверно так и сделаю, сложнее зато правильно.
 
Из наблюдений. Начинает мерцать при добавлении ChartRedraw и ObjectsDeleteAll. От ObjectDelete не мерцает.
 
Timur Gatin:
Из наблюдений. Начинает мерцать при добавлении ChartRedraw и ObjectsDeleteAll. От ObjectDelete не мерцает.

ObjectDeleteAll лучше не применять во время работы программы. Только в OnDeinit.

Суть работы с графикой:

  1. Составляем список объектов, которые должны быть на экране (новый список) и тех, которые уже есть (старый список). В принципе, старый список должен быть доступен из предыдущей итерации работы программы - это предыдущий новый список.
  2. Сравнение нового и старого списка. Находим объекты в новом списке, которые отсутствуют в старом списке. Отображаем такие объекты на экране.
  3. Находим в обоих списках полностью одинаковые объекты, т. е. те, которые не нуждаются в обновлении. Удаляем их из старого списка.
  4. Поиск объектов в старом списке, которых нет в новом списке. Удаляем такие объекты на экране и, соответственно, из старого списка.
  5. Поиск объектов, которые изменились. Изменяем на экране и удаляем из старого списка.
  6. К этому моменту, если все сделано правильно, в старом списке не осталось объектов. Вот только тут делается ChartRedraw. То есть вызов функции ChartDeraw должен быть один на всю программу, равно, как и ObjectDeleteAll.
 
Ihor Herasko:

ObjectDeleteAll лучше не применять во время работы программы. Только в OnDeinit.

Суть работы с графикой:

  1. Составляем список объектов, которые должны быть на экране (новый список) и тех, которые уже есть (старый список). В принципе, старый список должен быть доступен из предыдущей итерации работы программы - это предыдущий новый список.
  2. Сравнение нового и старого списка. Находим объекты в новом списке, которые отсутствуют в старом списке. Отображаем такие объекты на экране.
  3. Находим в обоих списках полностью одинаковые объекты, т. е. те, которые не нуждаются в обновлении. Удаляем их из старого списка.
  4. Поиск объектов в старом списке, которых нет в новом списке. Удаляем такие объекты на экране и, соответственно, из старого списка.
  5. Поиск объектов, которые изменились. Изменяем на экране и удаляем из старого списка.
  6. К этому моменту, если все сделано правильно, в старом списке не осталось объектов. Вот только тут делается ChartRedraw. То есть вызов функции ChartDeraw должен быть один на всю программу, равно, как и ObjectDeleteAll.
Спасибо.
 
Ihor Herasko:

ObjectDeleteAll лучше не применять во время работы программы. Только в OnDeinit.

Суть работы с графикой:

  1. Составляем список объектов, которые должны быть на экране (новый список) и тех, которые уже есть (старый список). В принципе, старый список должен быть доступен из предыдущей итерации работы программы - это предыдущий новый список.
  2. Сравнение нового и старого списка. Находим объекты в новом списке, которые отсутствуют в старом списке. Отображаем такие объекты на экране.
  3. Находим в обоих списках полностью одинаковые объекты, т. е. те, которые не нуждаются в обновлении. Удаляем их из старого списка.
  4. Поиск объектов в старом списке, которых нет в новом списке. Удаляем такие объекты на экране и, соответственно, из старого списка.
  5. Поиск объектов, которые изменились. Изменяем на экране и удаляем из старого списка.
  6. К этому моменту, если все сделано правильно, в старом списке не осталось объектов. Вот только тут делается ChartRedraw. То есть вызов функции ChartDeraw должен быть один на всю программу, равно, как и ObjectDeleteAll.
Я делаю проще, создаю обьекты ините, в деините удаляю, то что мне нужно показываю то что нет прячу.