Recentemente, fiz algumas otimizações no código. Após o teste, o efeito está OK, mas descobri que a interface irá piscar, especificamente o controle TreeView irá piscar, a linguagem é C# e o IDE é VS2005. Depois de consultar algumas informações e usar algumas técnicas básicas (como ativar o buffer duplo), descobri que não surtiu efeito.
Então usei a ferramenta PRfiler para descobrir que o gargalo está na operação EndUpdate após atualizar a interface todas as vezes (isso é usado para reduzir o número de atualizações da interface, mas não é ideal aqui porque há muitos elementos no controle) Acho que toda vez que for atualizado, a camada inferior do .Net Cada primitivo será atualizado e redesenhado, então a velocidade será lenta e causará oscilações. Mas se for esse o caso, o uso de buffer duplo deverá ter melhores resultados. Olhando o código novamente, descobri que a ação de atualização pode ser muito frequente, então reduzi a velocidade e melhorei, mas ainda não funcionou.
Continue pesquisando online e finalmente encontre uma solução mais adequada. Acontece que o redesenho subjacente limpará a tela todas as vezes e depois redesenhará tudo. Esta é a principal causa da oscilação. Portanto, a operação da função de envio de mensagens fica sobrecarregada e esta mensagem fica desabilitada. O código é o seguinte:
substituição protegida nula WndProc (mensagem ref m)
{
if (m.Msg == 0x0014) // Desativa a limpeza de mensagens em segundo plano
retornar;
base.WndProc(ref m);
}
sucesso!
Nota: O buffer duplo ainda é útil quando as atualizações não são muito frequentes e o controle não contém muitos elementos. Quando houver muitos elementos, cada atualização levará muito tempo. Mesmo se o buffer duplo for usado, o problema de oscilação não poderá ser resolvido. Pessoalmente, acho que o método ideal é desabilitar e limpar as mensagens de fundo no final.
Anexo: Alguns registros de tentativas e falhas
1) Use setStyle
Diz-se na Internet que a função setStyle é utilizada para definir os parâmetros do controle, especificamente:
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, verdadeiro);
O último destes três parâmetros de opção depende do primeiro e deve coexistir, caso contrário será inválido. E esta função em si é protegida, então primeiro você precisa herdar um determinado controle antes de usá-la.
Este objetivo é consistente com a solução correta anterior, que também desativa a limpeza do plano de fundo e ativa o buffer duplo, mas requer a opção de desenho do usuário, e todo o desenho é feito pelo usuário. Isso exige que você mesmo implemente todo o desenho dos controles, o que é bastante problemático. Portanto este método não é totalmente inviável, mas requer trabalho extra e não é recomendado. Eu também não usei.
2) Use BeginUpdate e EndUpdate
Este par de operações tem um efeito melhor em cenários onde as operações em lote são necessárias para atualizar controles, como adicionar um grande número de nós em lotes durante a inicialização. A desvantagem é que não pode ser atualizado imediatamente. Portanto, não é adequado para situações em que os nós são atualizados com frequência e desejam ser refletidos na interface imediatamente. Se você usá-lo e não desabilitar a mensagem clara da interface, o controle parecerá tremeluzente, terá principalmente um fundo branco e o conteúdo ficará quase invisível (dependendo da complexidade do vídeo). Como as atualizações da interface são concluídas no EndUpdate, muitas operações fazem com que o EndUpdate seja bloqueado por um longo tempo, e a interface é limpa primeiro e atualizada depois, fazendo com que a interface apareça em branco por um longo tempo.
3) Use a opção ControlStyles.EnableNotifyMessage
O efeito desta opção também é consistente com a solução correta. O uso é:
SetStyle(ControlStyles.EnableNotifyMessage, verdadeiro);
substituição protegida nula onNotifyMessage (Mensagem m)
{
//Escreva o código da mensagem de filtro aqui
}
No entanto, o experimento real não mostrou nenhum efeito, não sei por quê, e não investiguei detalhadamente.
-