У меня есть «строка времени» в моем приложении, состоящая из множества меток (динамических), которые размещаются в соответствии с их относительным положением в масштабе времени.Улучшение производительности пользовательского интерфейса в сложной рабочей петле
У меня есть другой раздел ниже этого, который является секцией «легенды» для временной линии. При наведении курсора на определенную легенду я прохожу через временную линию и устанавливаю все ненужные метки в visible = false
, а соответствующие метки - visible
. Это позволяет пользователю навешиваться над определенной меткой легенды и видеть, что она представлена только на временной линии.
Extra Info Когда пользователь выходит из легенды (ярлык) парить, восстановить все линии (наклейки) на временной шкале в видимой. /Дополнительная информация
Все это работает очень хорошо, но некоторые из моих временных шкал имеют на них более 800 ярлыков (тонкие линии).
Интерфейс обновляется примерно через 3-5 секунд в этом случае, что является приемлемым, но CPU ДЕЙСТВИТЕЛЬНО борется за то, чтобы не отставать.
При тестировании мой музыкальный плеер заигрывает большое время, когда я запускаю этот код, чтобы взаимодействовать с временной линией. Как только цикл закончен, процессор снова поймает.
Как я действительно не хочу использовать doEvents()
(не то, чтобы это действительно помогло .. Я пробовал), какие другие предложения вы можете предложить, чтобы дать процессору некоторое время для дыхания.
То, что я сделал до сих пор:
- Установите содержащую панель к невидимым до начала цикла, и виден, когда он завершает.
- Макет приостановки и возобновления не влияет на производительность, у меня были лучшие результаты с трюком видимости в пункте 1.
- Я уже повторно использую метки и не добавляю/удаляю их, когда я нужно показать их.
- Должен ли я выполнять threading.thread.sleep, всего несколько миллисекунд, после каждой итерации цикла? (Является ли это приемлемой практикой)
- Моя форма настроена на двойную буферизацию.
- Этикетки могут быть немного «тяжелыми», так как у них есть множество дополнительных свойств и функций/событий, которые я не использую. Есть ли лучшая альтернатива?
Мой код:
Private Sub label_hovered(appname As String) Handles myAwesomeViewLegend.labelHover
Try
blockPanel.Visible = False
For Each l As Label In blockPanel.Controls
If l.Text = appname Then
l.Visible = True
Else
l.Visible = False
End If
Next
blockPanel.Visible = True
Catch ex As Exception
Dim method_name As String = System.Reflection.MethodBase.GetCurrentMethod().Name
Dim method_class As String = System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName
MsgBox(ex.tostring & vbcrlf & vbcrlf & method_name & vbcrlf & vbcrlf & method_class)
End Try
End Sub
Вы пытались установить 'l.Visible = False' только когда' l.Visible = True'? То есть 'If l.Visible Then l.Visible = False' –
Я не пробовал, но большинство ярлыков (линий) устанавливаются в visible = false, при каждом запуске. Показанные ярлыки - это крошечный процент всего. Я также не упомянул, что я восстанавливаю все ярлыки до видимых, когда парит из легенды (метки). –
Я буду выполнять ваше предложение, тем не менее, как мне нравится сохранять любой цикл процессора, который я могу. Благодарю. –