Pergunta

Eu tenho um problema de desenho algo rapidamente em .NET. Eu não acho que qualquer coisa em particular deve levar muito tempo, mas em cada máquina que eu tentei-lo, eu recebo problemas sérios. Isso é implementado em vs2008 .NET, utilizando C # (com algumas coisas em C ++, mas nada relevante para o desenho).

Eu tenho três telas, e que o usuário deve ser capaz de alternar entre eles sem lag. Na primeira tela, há quatro botões, oito controles de usuário que consistem em dois botões e 6 etiquetas cada, um campo de texto e uma caixa suspensa. Eu não penso nisso como sendo muito.

Na segunda tela, eu tenho quatro rótulos, seis botões e dois controles que têm seis botões, um OpenGL contexto desenho, e cerca de rótulos dez cada.

Na terceira tela, eu tenho um contexto OpenGL e 10 botões.

Lançando a partir de qualquer tela para qualquer tela leva, literalmente, cerca de um segundo. Por exemplo, se eu inverter a partir da segunda tela para a primeira, toda a aplicação blanks para fora, mostrando o ecrã de fundo, e, em seguida, o primeiro crivo é desenhada. Muitas vezes, uma tela é desenhada fragmentada, como se a máquina foram deliberadamente confecção letras delicadas e deliciosas em uma fábrica na Suécia e, em seguida, enviar cada um individualmente para minha tela. Eu exagero, e quero deixar isso claro, porque eu não acho que os suecos são tão lento como este redesenho.

A primeira e segunda tela são desenhados na memória, e armazenados lá, com apenas um '.hide ()' e '.Show ()' para torná-los aparecer e desaparecer. Buffer duplo não parece importar. A terceira tela é desenhado de novo a cada tempo, e parece ter a mesma quantidade de tempo para desenhar como a primeira e segunda.

Todos os pensamentos? O que poderia estar acontecendo? Como posso rastreá-lo?

Obrigado!

Editar: Gostaria de acrescentar que qualquer C ++ processamento e afins acontece em seu próprio segmento. Existe a MethodInvoke ocasional para desenhar os resultados da operação para a tela, mas este problema acontece sem chamar quaisquer funções, apenas pressionando botões para ir de uma tela para outra.

Foi útil?

Solução

Além do perfil que foi mencionado, você também pode desligar os seus contextos OpenGL. Se você notar uma velocidade-up, então você saberá que é o seu material gráfico e você pode concentrar seus otimizações em conformidade.

Pontos concedidos para humor sueco.

Outras dicas

Como posso rastreá-lo?

dotTrace - http://www.jetbrains.com/profiler/

Você está fazendo qualquer outro processamento durante o evento "virar a tela"? que não seja apenas deixando o formulário de ser redesenhado? Se você está processando algo entre flips (talvez sua adição c ++?), E você não é multi-threading, você obter esse efeito fora branco. O formulário é provavelmente à espera de tempo de CPU para redesenhar próprio.

Eu nunca usei OpenGL de maneira mim mesmo, mas que você pode querer olhar para a maneira em que os contextos OpenGL são viradas. Ao mudar de uma página para outra que você pode estar recebendo uma redefinição do dispositivo (em termos DirectX), o que poderia estar causando o atraso.

Se possível ter um dispositivo de desenhar a um System.Drawing.Bitmap para trás, e usar esse bitmap nas telas. Faça o seu código OpenGL ciente da página atual o usuário estiver ligado, e você pode obter a velocidade até que você procura.

Para testar isso antes de fazer grandes mudanças, tente remover os displays OpenGL no formulário.

Isto é tudo um capricho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top