Вообще говоря, вы могли бы сделать несколько вещей:
- Дельта-обновления. Только перерисовать биты графика, где данные изменились. Например, вы можете просто перевести пиксели на графике влево и нарисовать только свежие данные, а не перерисовывать все целиком.
- Пример данных. Как вы описываете, ваши данные могут быть настолько плотными, что не имеет смысла рисовать каждую точку. На основании уровня масштабирования графика вы можете отбросить некоторые точки данных.
- Перерисовка на основе частоты кадров устройства, а не скорости передачи данных. Нет смысла перерисовывать график быстрее, чем его можно отобразить, не ставьте в очередь другую перерисовку, если она уже выполняется. Это может засорить очередь сообщений, от которой зависит большинство интерфейсов, и привести к заиканию интерфейса.
Между прочим, неплохой трюк - нарисовать векторную линию с некоторым количеством точек, которые будут отражать разрешение вашего графика (например, количество горизонтальных пикселей), тогда вы можете получить данные, перемещающиеся через вектор точек. в строке, похожей на очередь, где вы смещаете элементы «влево» перед добавлением новой точки данных. В терминах Wpf это приведет к «виртуализированному» графику, означающему, что элемент пользовательского интерфейса является постоянным и анимированным экземпляром, а не повторным созданием экземпляра при поступлении новых данных.
Противоположным примером будет добавление новой векторной линии между последней точкой и новой точкой при появлении новых данных. (Я предполагаю, что используется графический интерфейс высокого уровня, где линии / фигуры являются незаметными объектами, если нет, то «виртуализация» на самом деле не применима)