Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Графики, что лучше использовать? 
:(
    Опции темы
PILOT
Дата 11.10.2005, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



В общем встала задача отображать графики с прокруткой.
Данные поступают каждые 100мс по RS-232.

В принципе я это реализовал на канве, но при прокрутке все тормозит (т.к. идет копирование CopyRect) очень большой кусок нужно перерисовывать.
Можно ли чертить графики с помощью DirectDraw или не стоит оно того и нужно оптимизировать процедуру копирования из скрытого буфера на канву на экране?
Спасибо.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
s-mike
Дата 11.10.2005, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Что-то мне подсказывает, что сама организация неправильная...

Зачем копирование из буфера? Не проще ли перерисовать график по сохраненным данным? Ведь экран 800х600 в виде битмапа занимает столько памяти, сколько хватило бы для хранения 120000 целых 4-х байтовых значений.
PM MAIL WWW   Вверх
Alexeis
Дата 12.10.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



С формой лучше не связываться.
Форма всегда тормозит.
Рисуй в Timage или на TPanel smile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
PILOT
Дата 12.10.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Хм...
Вот что я делаю.
На форме у меня TPanel. Я в памяти формирую "пустой" TBitmap с нарисованными осями и т.п., затем я копирую его в еще один буфер и рисую на нем все что нужно (собственно графики и шкалы), затем копирую его на TPanel. В итоге все здорово тормозит.
Если рисовать прямо на TPanel то все мерцаем при стирании предыдущего графика и рисовании нового (рисуется все в реальном мосштабе времени). Собственно поэтому вопрос и возник: как быстрее рисовать. Я где-то слышал что можно рисовать через DirectDraw (мол он специально для двухмерки сделан), но сам не рисовал, поэтому и решил спросить.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
s-mike
Дата 12.10.2005, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Цитата(alexeis1 @ 12.10.2005, 12:14)
С формой лучше не связываться.
Форма всегда тормозит.
Рисуй в Timage или на TPanel smile

Может объяснишь почему? Какая разница на чем рисовать на экране, если все это делать с помощью GDI?
Добавлено @ 20:30
Цитата(PILOT @ 12.10.2005, 18:54)
Я в памяти формирую "пустой" TBitmap с нарисованными осями и т.п., затем я копирую его в еще один буфер и рисую на нем все что нужно (собственно графики и шкалы), затем копирую его на TPanel. В итоге все здорово тормозит.

Ну вот я это и предполагал. Глупее организации не придумаешь. Хранить отрисованный растр глупо! Все нужно рисовать в runtime, о чем я и сказал выше. И DirectDraw не поможет.
PM MAIL WWW   Вверх
Alexeis
Дата 13.10.2005, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Совершенно верно!
Значительно бысрее рисовать оси и проч. на исходном BitMap - е
чем несколько раз копировать один BitMap в другой,
так как такие операции отнимают объективно очень много процессорного времени и DirectDraw здесь ни при чем.



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
PILOT
Дата 13.10.2005, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



Еще раз:

МЕРЦАЕТ! smile если делать все на форме (или на чем либо еще), нужно же стереть изображение чтобы потом нарисовать график с новой точкой (в реальном масштабе времени). Так вот стирать как? только рисованием "белого" прямоугольника, а раз так то если это делать быстро, то начинается мерцание.
Я точно знаю что можно рисовать с использованием DirectDraw, т.к. видел графики с его использованием, но к сожалению автора программы не выцепить уже.

По поводу буферов:
Цитата
DirectDraw® - предназначен для программирования всевозможных анимаций за счет быстрого доступа к изображению на экране и к видеопамяти, а также за счет использования возможностей аппаратуры (видеоадаптера) по манипуляции с буферами. 

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
s-mike
Дата 13.10.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Мерцает говоришь? Ну-ну...

Вот, накидал примерчик, не мерцает даже в полноэкранном режиме:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    PointList: TList;
    LeftPoint: Integer;
    DragX: Integer;
    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;    
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Cursor := crSizeWE;
  PointList := TList.Create;

  LeftPoint := 0;
  Timer.Interval := 100;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  PointList.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  P, X: Integer;
  PStart, PEnd: TPoint;
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.Width := ClientWidth;
    Bmp.Height := ClientHeight;
    with Bmp.Canvas do
    begin
      Brush.Style := bsSolid;
      Brush.Color := clBlack;
      FillRect(ClientRect);

      Pen.Style := psSolid;
      Pen.Color := clLime;

      if PointList.Count - 1 < LeftPoint then Exit;
      P := LeftPoint;
      X := 0;
      PStart := Point(X, PInteger(PointList[P])^);
      while X <= ClientWidth do
      begin
        Inc(P);
        if P > PointList.Count - 1 then Exit;
        Inc(X, 10);
        PEnd := Point(X, PInteger(PointList[P])^);

        MoveTo(PStart.X, PStart.Y);
        LineTo(PEnd.X, PEnd.Y);

        PStart := PEnd;
      end;
    end;
  finally
    Canvas.Draw(0, 0, Bmp);
    Bmp.Free;
  end;
end;

procedure TForm1.TimerTimer(Sender: TObject);
var
  P: PInteger;
begin
  if PointList.Count > 10000 then
    PointList.Delete(0);

  New(P);
  P^ := Random(ClientHeight);
  PointList.Add(P);

  if PointList.Count > ClientWidth div 10 then
    Inc(LeftPoint);
  
  Invalidate;
end;

procedure TForm1.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result := 0;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DragX := X;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  DX: Integer;
begin
  if not (ssLeft in Shift) then Exit;

  DX := LeftPoint + (X - DragX) div 10;
  if DX < 0 then DX := 0 else
  if DX > PointList.Count - 1 then DX := PointList.Count - 1;

  if LeftPoint <> DX then LeftPoint := DX;
end;

end.


PM MAIL WWW   Вверх
PILOT
Дата 13.10.2005, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


производство
****


Профиль
Группа: Модератор
Сообщений: 2724
Регистрация: 4.4.2002
Где: москва

Репутация: нет
Всего: 54



За пример спасибо, но:
Если рисовать не через 10 точек, а подряд; заполнять всю ширину и уменьшить интервал таймера до 50мс, то 99% ресурсов сжираются. Это при том что комп у меня не самый плохой, на работе это просто остановит систему.

СУВ.


--------------------
тут могла быть Ваша реклама...
PM MAIL WWW ICQ   Вверх
s-mike
Дата 13.10.2005, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Цитата(PILOT @ 13.10.2005, 22:29)
Если рисовать не через 10 точек, а подряд; заполнять всю ширину и уменьшить интервал таймера до 50мс, то 99% ресурсов сжираются. Это при том что комп у меня не самый плохой, на работе это просто остановит систему.

Гм, у меня Athlon XP 2200+, 1 GB RAM, 128 Mb GeForce FX 5500 Video и загрузка процессора 2-4%. И это при том, что запущено несколько фоновых процессов. Так что это все относительно... Да и пример я сильно не оптимизировал, можно поработать... Хотя конечно большая часть процессорного времени тратится именно на отрисовку. А представь, какая была бы загрузка, если бы копировался растр? А использование памяти? Тут ни один DirectDraw не спасет. Можно попробовать, но мне кажется, что сильного выигрыша на столь простой задаче он не даст. А может и наоборот, поскольку повысится использование памяти (всякие COM&OLE-интерфейсы...). Да и то опять же - выигрыш будет только на хорошей видеокарте, потому что рисование будет полностью возложено на нее. Но на хорошей видеокарте и GDI неплохо идет.
PM MAIL WWW   Вверх
Alexeis
Дата 14.10.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Вопрос к Pilot
Как стираешь?
С помощью patblt ? smile

Это сообщение отредактировал(а) alexeis1 - 14.10.2005, 09:47


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
s-mike
Дата 14.10.2005, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

Репутация: 5
Всего: 16



Цитата(alexeis1 @ 14.10.2005, 09:44)
Как стираешь?
С помощью patblt ? smile

Вот как раз _стирать_ есть неправильно, потому что какой-бы быстрой не была эта операция, но именно она приводит к мерцанию. Почему мерцает форма? Потому что перед OnPaint вызывается процедура стандартной отрисовки с другим цветом, как раз это я запрещаю перехватом WM_ERASEBKGND. Нужно исключительно отрисовывать поверх и желательно за один раз (чтобы не было видно, что сначала вся область закрашивается одним цветом, потом на ней что-то рисуется...). Поэтому стоит использовать буффер - в этом случае я создавал временный битмап, где и производил отрисовку.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.