Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как устранить тормоза при прорисовки сетки ? GDI+ / 25 сообщений из 33, страница 1 из 2
23.08.2018, 12:13
    #39692318
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Использую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
void __fastcall TForm2::FormCreate(TObject *Sender)
{
  Gdiplus::Metafile* myMetafile = new Gdiplus::Metafile(Canvas->Handle, EmfTypeEmfPlusOnly, L"MyDiskFile.emf" );
  Gdiplus::Graphics* myGraphics = new Gdiplus::Graphics(myMetafile);
  Pen* myPen = new Pen(Gdiplus::Color(255, 0, 0, 200));

  myGraphics->SetSmoothingMode(SmoothingModeAntiAlias);


  for(int i = 0; i < gWidth / gGridSize; i++)
  {
     Line(myGraphics, i * gGridSize, 0, i * gGridSize, gHeight, 1);
  }

  for(int i = 0; i < gHeight / gGridSize; i++)
  {
     Line(myGraphics, 0, i * gGridSize, gWidth, i * gGridSize, 1);
  }

  delete myGraphics;
  delete myPen;
  delete myMetafile;
}



Код: plaintext
1.
2.
3.
4.
5.
6.
void __fastcall TForm2::FormPaint(TObject *Sender)
{
    Gdiplus::Graphics myGraphics(Canvas->Handle);
    Image myImage(L"MyDiskFile.emf");
    myGraphics.DrawImage(&myImage, 0, 0);
}



На форме рисую линии при прорисовки заметно все тормозит. Очень не удобно.
...
Рейтинг: 0 / 0
23.08.2018, 12:26
    #39692334
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323,
для начала я бы избавился от множественных вычислений одного и того же на каждой итерации цикла, например )
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
int ew = gWidth/gGridSize;
for( int i = 0; i < ew; ++i ) {
    int w = i*gGridSize;
    Line( meGraphics, w, 0, w, gHeight, 1 );
}

int eh = gHeight/gGridSize;
for( int i = 0; i < eh; ++i ) {
    int h = i*gGridSize;
    Line( myGraphics, 0, h, gWidth, h, 1 );
}

а бы потом думал о других оптимизациях
...
Рейтинг: 0 / 0
23.08.2018, 12:33
    #39692341
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
egorych,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
/* Это еще да */
int ew = gWidth/gGridSize;

for( int i = 0; i < ew; ++i ) {
   
    /* А это ? */
    int w = i*gGridSize;

    Line( meGraphics, w, 0, w, gHeight, 1 );
}
...
Рейтинг: 0 / 0
23.08.2018, 12:35
    #39692344
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
egorych,

так лучше
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
   int t = gWidth / gGridSize;
   int f = 0;

   for(int i = 0; i < t; i++)
   {
      f = i * gGridSize;
      Line(FGDIInterface, f, 0, f, gHeight, 1);
   }

   t = gHeight / gGridSize;

   for(int i = 0; i < t; i++)
   {
      f = i * gGridSize;
      Line(FGDIInterface, 0, f, gWidth, f, 1);
   }
...
Рейтинг: 0 / 0
23.08.2018, 12:35
    #39692345
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323
Код: plaintext
1.
2.
    /* А это ? */
    int w = i*gGridSize;

перфекционизм)) зачем 2 раза умножать, когда можно один?
...
Рейтинг: 0 / 0
23.08.2018, 12:36
    #39692346
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Можно без умножения обойтись
Код: plaintext
1.
2.
3.
for( int w = 0; w < gWidth; w += gGridSize) {
    Line( meGraphics, w, 0, w, gHeight, 1 );
}
...
Рейтинг: 0 / 0
23.08.2018, 12:38
    #39692348
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Чуть напутал
Код: plaintext
1.
2.
3.
for( int w = 0; w < gGridSize; w += gWidth) {
    Line( meGraphics, w, 0, w, gHeight, 1 );
}
...
Рейтинг: 0 / 0
23.08.2018, 12:41
    #39692350
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Джентльмены, а разве FormCreate не вызывается только один раз, в то время как FormPaint вызывается на каждой перерисовке?
Обычно для этого используют двойную буфферизацию.
...
Рейтинг: 0 / 0
23.08.2018, 12:43
    #39692353
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
NekZ,

двойная буферизация устраняет мерцание, а не тормоза при отрисовки. необходимо один раз отрисовать линии в памяти, а потом из памяти выводить( отрисовывать) их на форме
...
Рейтинг: 0 / 0
23.08.2018, 12:44
    #39692355
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
NekZ,

я не сразу понял, про что вы. вы про нашу оптимизацию for
...
Рейтинг: 0 / 0
23.08.2018, 12:51
    #39692361
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323NekZ,

двойная буферизация устраняет мерцание, а не тормоза при отрисовки. необходимо один раз отрисовать линии в памяти, а потом из памяти выводить( отрисовывать) их на форме
Идеально, конечноб для этого использовать OpenGL. Зарендерить единожды в FBO, выдрать из него текстуру и потом просто её использовать
как sampler2D в fragment shader'е.
...
Рейтинг: 0 / 0
23.08.2018, 12:53
    #39692362
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323На форме рисую линии при прорисовки заметно все тормозит. Очень не удобно.

Выкинь метафайл. Тем более на диске. Ты его грузишь на каждую прорисовку. Рисование линий
просто перенеси в FormPaint.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.08.2018, 12:55
    #39692364
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

я так делал. так еще больше тормозит
...
Рейтинг: 0 / 0
23.08.2018, 13:00
    #39692367
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323Dimitry Sibiryakov,

я так делал. так еще больше тормозит
Тебе, как минимум, нужно в FormPaint иметь уже готовый пиксельный (распакованный) буфер в памяти из которого ты будешь напрямую выводить
графику на устройство. Поскольку, этот код вызывается очень часто, необходимо иметь уже готовые пиксельные данные при его вызове, и желательно
избежать ненужных перекодирований и копирований.
...
Рейтинг: 0 / 0
23.08.2018, 13:03
    #39692369
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
NekZ,

знаю. а как это сделать ?
...
Рейтинг: 0 / 0
23.08.2018, 13:07
    #39692374
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323NekZ,

знаю. а как это сделать ?
Начни с того, что порекомендовал Dimitry Sibiryakov, избавься от ненужного чтения файла каждый раз. Сделай Image myImage мембером класса
и загрузи его в конструкторе.
...
Рейтинг: 0 / 0
23.08.2018, 13:08
    #39692376
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323я так делал. так еще больше тормозит

Не верю. Код показывай. Сколько линий у тебя в сетке?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.08.2018, 13:09
    #39692377
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
   /* Размер сетки. */
   int gGridSize = 25;
   /* Высота холста. */
   int gHeight = 3000;

   /* Ширина холста. */
   int gWidth  = 3000;
...
Рейтинг: 0 / 0
23.08.2018, 13:12
    #39692379
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

Код: plaintext
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.
void __fastcall Line(Gdiplus::Graphics * Value, int x, int y, int cx, int cy, int Width)
{
  Pen pen(Color(150, 189, 208, 233), Width);
  pen.SetDashStyle(DashStyle::DashStyleDash);
  Value->DrawLine(&pen, x,  y,  cx,  cy);
}

bool gCapture = false;
int gX        = 0;
int gY        = 0;

//---------------------------------------------------------------------------
void __fastcall TForm2::FormPaint(TObject *Sender)
{
  Gdiplus::Graphics *FGDIInterface  = new Gdiplus::Graphics(Canvas->Handle, this->Handle);

  Line(FGDIInterface, 80, 90, gX, gY, 10);

  for(int i = 0; i < gWidth / gGridSize; i++)
  {
    Line(FGDIInterface, i * gGridSize, 0, i * gGridSize, gHeight, 1);
  }

  for(int i = 0; i < gHeight / gGridSize; i++)
  {
    Line(FGDIInterface, 0, i * gGridSize, gWidth, i * gGridSize, 1);
  }

  delete FGDIInterface;
}


//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
  gCapture = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
  gCapture = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  if(gCapture)
  {
     gX = X;
     gY = Y;

     /* */
     Refresh();
  }
}
...
Рейтинг: 0 / 0
23.08.2018, 13:15
    #39692384
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

Это оригинал. А с Metafile измененный. Но он все равно тормоза дает
...
Рейтинг: 0 / 0
23.08.2018, 13:48
    #39692398
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

я сделал то, что хотел.
...
Рейтинг: 0 / 0
23.08.2018, 13:49
    #39692399
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323Но он все равно тормоза дает

Ещё бы он не давал. Назачем ты на каждую линию создаёшь новый карандаш, да ещё и рисуешь
вне видимого окна?

Выкинь GDI+ из этого места, рисуй сетку обычными методами TForm->Canvas.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.08.2018, 13:49
    #39692400
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323,

тема закрыта
...
Рейтинг: 0 / 0
23.08.2018, 13:52
    #39692403
gera3323
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
Dimitry Sibiryakov,

обычным методом не скатит - нужен стиль линий DashStyle::DashStyleDash. Другой не смотрится. Размер сетки 3000 на 3000 не просто так сделан. на форме есть полосы прокрутки.
...
Рейтинг: 0 / 0
23.08.2018, 13:58
    #39692408
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как устранить тормоза при прорисовки сетки ? GDI+
gera3323,

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

SetBrushOrg задать не забудь
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как устранить тормоза при прорисовки сетки ? GDI+ / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]