Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > скорость отрисовки в цикле


Автор: Kirill89 5.3.2007, 11:35
Есть сетка, нужно закрасить все true эллементы.
DrawSpace - PictureBox
Один эллемент трисовывается быстро, но когда поле заполняется, начинает сильно тормозить! Как с этим бороться?!
Я постарался по максимуму сократить число цикла m, но при большом поле это не помогает. Может быть чем-то можно заменить этот цикл? Или как-то его оптимизировать?
Код

Sub ReDraw()
DrawGread
For i = 0 To SizeX
    For j = 0 To SizeY
        If Pole(i, j) = True Then
            For m = 0 To 20
                DrawSpace.Line ((i * 200) + (m * 10), j * 200)-((i * 200) + (m * 10), (j + 1) * 200)
            Next m
        End If
    Next j
Next i
End Sub

Автор: daNick 5.3.2007, 13:19
почему бы не прорисовывать не линиями, а сразу прямоугольниками?

drawspace.line(i*200,j*200)-((i+1)*200,(j+1)*200),drawplace.forecolor,bf

или тебе не подходит вариант с закрашенными прямоугольниками?

Автор: cardinal 5.3.2007, 13:24
Код

For i = 0 To SizeX
    For j = 0 To SizeY
...

Ну для начала можно сделать Step 200 для i, j и Step 10 для m и заменить
DrawSpace.Line ((i * 200) + (m * 10), j * 200)-((i * 200) + (m * 10), (j + 1) * 200)
на
Код

DrawSpace.Line (i + m, j)-(i + m, j + 200)

Уже будет гораздо быстрее...
Код

DrawGread

Во первых где эта фунция (выложил бы полностью), а во вторых Grid пишется...

Автор: Naghual 5.3.2007, 14:14
Там прикол со свойством AutoRedraw!
Если оно True - тогда отрисовка будет занимать ХХХ времени!
Выствь его в False, а по окончании рисования, вызывай метод Refresh

Автор: Kirill89 5.3.2007, 20:25
daNick, да, действительно не подумал. Спасибо - тупить стало меньше намного, но если поле большое, то не спасает.
cardinal, пора мне подтягивать свой английский  smile спасибо, что подправил.
Я ещё кое-что переписал, но всё-равно, нехватает скорости.  smile 
Есть ещё предложения по оптимизации?
Вот новые кусочки:
Код

Sub ReDraw()
DrawGrid
For i = 0 To SizeX
    For j = 0 To SizeY
        If Pole(i, j) = True Then
            DrawSpace.Line ((i * 200), (j * 200))-((i + 1) * 200, (j + 1) * 200), RGB(0, 0, 0), BF
        End If
    Next j
Next i
End Sub

Sub DrawGrid()
DrawSpace.Cls
DrawSpace.Width = (SizeX * 200) + 8
DrawSpace.Height = (SizeY * 200) + 15
For i = 0 To DrawSpace.Width Step 200
        DrawSpace.Line (i, 0)-(i, DrawSpace.Height)
Next i
For j = 0 To DrawSpace.Height Step 200
        DrawSpace.Line (0, j)-(DrawSpace.Width, j)
Next j
End Sub

Naghual, да, если отключить Autoredraw, то скорость заметно вырастает, но это мелькание! Как от него избавиться!?

Автор: Naghual 6.3.2007, 00:36
Пожалуйста.
Вот http://www.vbaccelerator.com/home/vb/Code/Libraries/Graphics_and_GDI/Flicker_Free_API_Drawing/article.asp , показывающая в примере как избавится от этого досадного эффекта.

Автор: Kirill89 6.3.2007, 10:01
Цитата(Naghual @  6.3.2007,  00:36 Найти цитируемый пост)
Пожалуйста.
Вот статья , показывающая в примере как избавится от этого досадного эффекта. 

Неподходит. Это, я так понял, только с использованием изображений, а у меня их нет.

Приношу свои извинения. Всё исправил. Я просто слишком часто отрисовывал всю сетку вместе со всеми эллементами. У меня отрисовка была от mouse_move, в независимости от состояния нажатия клавишь, сделал, что отрисовывается, только если меняется значения эллемента и клавиша нажата. Теперь не тупит. Всем большое спасибо.

Автор: Naghual 6.3.2007, 11:33
продумай еще момент с отрисовкой только изменившейся области, а не всего грида

Автор: Kirill89 6.3.2007, 13:29
Цитата(Naghual @  6.3.2007,  11:33 Найти цитируемый пост)
продумай еще момент с отрисовкой только изменившейся области, а не всего грида 

Точно! У меня было, что при закраске рисует черный квадрат, теперь сделал, что при очистке просто рисует белый  smile
Ещё раз спасибо.

Автор: Naghual 7.3.2007, 22:07
А что это такое будет - то?  smile

Автор: Kirill89 8.3.2007, 13:20
Цитата(Naghual @  7.3.2007,  22:07 Найти цитируемый пост)
А что это такое будет - то?

На самом деле сразу несколько программ:
1)У меня есть игрушка японские кроссворды, единственный её минус был в том, что для написания нового кроссворда мне много мучится приходилось, а юзеру - попросту заново грузить всё приложение.
А это - новый движок, который позволит сделать удобные обновления, в том числе и обновления с сайта программы при помощи самой программы.
2)Я небуду пока-что разглашать, потому что не уверен, что всё получится... Я ещё не раз буду задавать вопросы по этой проге, поэтому потом всё узнаете  smile 

Автор: Naghual 9.3.2007, 21:29
Kirill89, ясно. Прикольная задумка.
Желаю удачи.

Автор: Kirill89 9.3.2007, 21:31
Цитата(Naghual @  9.3.2007,  21:29 Найти цитируемый пост)
Желаю удачи.

Спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)