powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как устранить тормоза при прорисовки сетки ? GDI+
25 сообщений из 33, страница 1 из 2
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692318
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую
Код: 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
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692334
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692341
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692344
gera3323
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692345
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323
Код: plaintext
1.
2.
    /* А это ? */
    int w = i*gGridSize;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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