powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как устранить тормоза при прорисовки сетки ? GDI+
33 сообщений из 33, показаны все 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
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692409
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gera3323обычным методом не скатит - нужен стиль линий DashStyle::DashStyleDash. Другой не смотрится.

Поставить этот стиль карандашу у формы мешает что?

gera3323Размер сетки 3000 на 3000 не просто так сделан. на форме есть полосы
прокрутки.
Пофиг на полосы прокрутки. Вопрос был зачем ты рисуешь линии за пределами видимой области
вообще и инвалидированного региона в частности.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692659
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо некромантить древних майкрософтовцев - КАК у них Excel 2.0 не тормозил на 386 ???
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692815
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добавлю не про конкретный кейс а скорее про тренд.

Я думаю что древние версии Windows 3.0/95 офисов использовали упрощённый GDI и пиксельную графику.
Тоесть если они рисовали линию - то это была линия из пикселов. Рисовали синхронно и быстро.
Собственно это было прямое воздействие на видеопамять.

Современный API не меряет толщину линий в пикселах. Это некая адаптация абсолютной толщины линии
на конкретное устройство со своим DPI. И целый пакет алгоритмов улучшающих восприятие этой линии.
Антиалиазинг (даже там где он не нужен).

Для рисования сглаженных линий помогает видеокарточка. Но как помогает? Наверное у нее есть конвейер
устройств который должен быть загружен непрерывным потоком линий, полигонов и прочей мути. Если
мы его загружаем рывками или неравномерно то скорее всего получим какие-то промахи и таймауты.

Может ли GDI+ приложение загрузить видеоконвейер непрерывным потоком графических команд?
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692835
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я щас плохо ориентируюсь в msdn. Там все расхерячили к чорту. Не понятно где какая платформа.
Ну вобщем вот есть функция которая рисует сразу сет линий.

Код: plaintext
1.
Graphics.DrawLines(const Pen*, const Point*, INT) method


https://msdn.microsoft.com/en-us/library/windows/desktop/ms536017(v=vs.85).aspx

Еще из опыта OpenGL. Там есть функция

Код: plaintext
1.
2.
3.
void glDrawArrays( 	GLenum mode,
  	GLint first,
  	GLsizei count);



Вы подготавливаете массив координат точек а она рисует "вентилятор из треугольников" или "гармошку" или
еще кучу других примитивов в зависимости от mode.
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692877
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕще из опыта OpenGL. Там есть функция

Код: plaintext
1.
2.
3.
void glDrawArrays( 	GLenum mode,
  	GLint first,
  	GLsizei count);



Вы подготавливаете массив координат точек а она рисует "вентилятор из треугольников" или "гармошку" или
еще кучу других примитивов в зависимости от mode.
Не нужно. Чел хочет сетку, пускай рисует mesh в плоскости.
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39692900
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не предлагаю автору использовать OpenGL. Я просто пытаюсь рассуждать почему современный
графический API в некоторых случаях ведет себя хуже чем API 20-лет назад.
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39693015
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ не предлагаю автору использовать OpenGL. Я просто пытаюсь рассуждать почему современный
графический API в некоторых случаях ведет себя хуже чем API 20-лет назад.
Не хуже, он даже разнообразнее.
Просто современные тенденции не предрасполагают к оптимизациям, уже и бывалые начинают забывать, что уж говорить о молодых.


У большинства, когда в руках молоток, возникает мнение, что вокруг везде гвозди.
...
Рейтинг: 0 / 0
Как устранить тормоза при прорисовки сетки ? GDI+
    #39693023
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я помню этот Excel. Я его ставил с коробки дискет 1.44М.

Вверху в title видно сглаженный шрифт типа "System", на самом деле никакого сглаживания вообще не было.
Он был растровый. Просто данная картинка была уменьшена 2х4х кратно и появился такой эффект.

В этой картинке абсолютно все линии - пиксельные.

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


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