Pergunta

Eu tenho um aplicativo Windows CE que usa um monte de gráficos vetoriais e em lugares é bastante lento. Atualmente estou usando GDI para renderização através de um bitmap para atualizações sem cintilação. Normalmente, eu estou de janelas em parte de um grande mapa 3D. Em alguns dispositivos (por exemplo 166MHz SH4), este fica lento com 3-5 vezes segunda atualização para grandes conjuntos de dados. A minha pergunta é esta:

  • Alguém já fez qualquer comparação com a velocidade relativa de operações de gráficos no Windows Mobile contra Win32. Dito de outra forma, são perfilar resultados de uma versão Win32 do software aplicável a uma versão WinCE, assumindo que estamos olhando apenas a chamadas GDI.

  • Alguém já tentou perfilar a bordo em uma plataforma WinCE (app C ++), se sim, usando o que ferramentas.

  • Alguém tem conhecimento de quaisquer métodos para melhorar a velocidade com base em Windows CE. Atualmente estou olhando para FastGraph seguinte feedback de um pergunta anterior , mas esta é uma solução ligeiramente mais longo prazo. Bad e todos como ele é, eu estou procurando algo mais rápido de implementar para uma próxima versão.

Foi útil?

Solução

Antes do Windows CE 6.0 - incluindo, portanto, todas as versões portáteis Windows Mobile / Windows Embedded - o código de gráficos foi implementado em outro processo (Gwes.exe), exigindo uma chamada de processo cruzado cada vez que fizer uma chamada GDI. CE 5.x chamadas entre processos são muito mais baratos do que no ambiente de trabalho, mas ainda mais caro do que uma chamada de função simples ou uma chamada em modo kernel.

Na área de trabalho, GDI é implementado no modo kernel desde NT 4.0. No NT 3.1 original, que era como as chamadas de modelo CE, processo cruzado. Para atenuar a sobrecarga de chamadas cross-processo ou usuário / switches modo kernel, lotes GDI mesa de operações do lado do usuário-modo até que você faça algo que obriga a limpar a fila - como a seleção de uma caneta ou pincel diferente, ou usando um das funções de legado que retorna algo diferente de BOOL -. ou o buffer está cheio, ou você lave-lo explicitamente chamando GdiFlush

Windows CE não tem essa capacidade de tratamento por lotes - todas as chamadas resultar em uma chamada direta para o processo GWES, tornando-se muito mais lento. Você pode atenuar-lo fazendo o trabalho tanto quanto possível em cada chamada. Se você precisa de uma linha complexa, considere Polyline em vez de chamadas MoveToEx / LineTo individuais. Tente tocar somente cada pixel uma vez, em vez de renderização de objetos que se sobrepõem, e fazer uso da região inválida apenas pintar partes da tela que precisam pintura (uso GetUpdateRgn ou GetUpdateRect mas fazê-lo antes de chamar BeginPaint, que marca a região válido).

A aceleração modelo CE gráfica é bastante básico, baseando-se em torno de bits blits. Ele não suporta o maior conjunto de capacidades que drivers de dispositivo de modelo de área de trabalho no Windows 2000 suportar. Se qualquer aceleração está disponível depende se o hardware ainda tem um chip acelerador -. Muitos dispositivos usará o controlador de LCD embutido no processador de aplicação, que geralmente não faz qualquer aceleração

Você pode simular o comportamento do CE no ambiente de trabalho, desactivando lotes, usando GdiSetBatchLimit para definir o limite para 1. Considere também usando o driver SVGA para desativar a aceleração. No Windows Vista ou Windows 7, GDI não é acelerado se você estiver usando o ambiente Aero, todas as operações são implementadas no software, embora o Windows 7 adicionado de volta alguns recursos de aceleração de hardware novo bit-blit.

Windows CE 6.0 tem um novo modelo de kernel e processo, que se move GDI em modo kernel como no desktop do Windows (antes Vista), então o custo de chamar uma função GDI deve ser ligeiramente reduzida. Ainda não há um tratamento por lotes.

Outras dicas

Eu não tenho muito conhecimento do lado de gráficos de coisas, mas a partir da experiência, se você quer ser rápido em algumas coisas hardware específico relacionados, o mais perto de "metal" o mais rápido você pode obter (e mais difícil ele fica!). Então, você poderia olhar para usar direto Desenhe ou Direct 3D (altho eu acho que eles estão caindo D3D e indo para OpenGL ES para WM7) . Você pode gostar de olhar em forma Game Developers uso.

Sobre a questão da Profiles, eu não encontrei qualquer mas eu edificarei a minha própria .

Eu fiz um monte de este tipo de aferição, e as operações de GDI são mais lentos em WinCE do Win32 regular, mas apenas mais lento na proporção dos processadores mais lentos em dispositivos WinCE. Em outras palavras, não parece haver qualquer impacto na performance adicional de usar GDI no WinCE.

Desculpe, eu não tenho respostas para as suas duas últimas perguntas.

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