Diferenças iPhone desempenho no desenho de quartzo vs. pré-cozidas Imagens (que eu acho que simplifica para Quartz vs. Quartz)

StackOverflow https://stackoverflow.com/questions/1604341

Pergunta

Novo para Quartz e estou curioso sobre as velocidades de desenho de formas simples, gradientes e sombras; especificamente comparando Quartz funções de desenho para desenho imagem Quartz no iPhone.

dizer que eu preciso para desenhar um retângulo preenchido, acariciou e sombreados. Estou assumindo que a importação de um rect pré-cozido como um PNG e desenhá-lo usando drawInRect: ou drawAtPoint: é mais rápido do que usar funções de desenho de quartzo para desenhar a mesma coisa, uma vez que este exige cálculos explícitos. Por outro lado, desenhando uma imagem que eu assumir o uso de memória aumenta eo tamanho aplicativo desde que eu tenho para importar a imagem e, em seguida, alloc-lo. Será que este som direito?

Além disso, existem grandes vantagens / desvantagens de uma ou outra técnica? Como alguém que está muito familiarizado com programas gráficos e marca nova para Quartz, eu estou tentando decidir se existem vantagens em usar as funções de desenho no meu código em oposição ao pré-assar toda a interface do usuário e importar as imagens.

Foi útil?

Solução

Eu tinha uma pergunta semelhante, então eu esgotado as diferentes abordagens. Na maioria dos casos de desenho simples (como o seu exemplo retângulo), carregando uma imagem do disco parecia ser um pouco mais lento do que desenhar um, talvez devido ao acesso em disco necessário. Nesses casos, eu tenha resolvido em utilizando as rotinas de desenho de quartzo, simplesmente por causa da flexibilidade que eles me dão. Se eu quiser alterar o tamanho de um elemento de interface do usuário no futuro (talvez para apoiar uma tela maior ou resolução superior), eu precisaria voltar a tornar todas as minhas imagens, onde os desenhos vetoriais será ampliado conforme necessário.

Uma área onde eu vi uma vitória significativa o desempenho é para um grande gradiente radial que eu desenhe como um fundo. Em Tubarão, pude ver que a chamada CGContextDrawRadialGradient () estava mastigando uma grande quantidade de tempo de CPU. Quando substituído o gradiente radial de quartzo-desenhada com uma imagem estática, vi uma notável redução no tempo de aplicação de inicialização (este pano de fundo é colocada durante o arranque da aplicação). Estranhamente, eu também vi uma redução no uso de memória do aplicativo por cerca de 0,5 MB, o que eu não posso explicar totalmente.

Se você quiser testar isso sozinho, eu recomendo pegar o editor de imagens Opacidade , que pode gerar código de quartzo por um desenho (incluindo um UIView completo ou subclasse CALayer), bem como uma saída de PNG que mesmo desenho. Isso torna trivial para implementar os dois caminhos dentro da sua aplicação e testá-los.

Outras dicas

Há também um meio termo que o trabalho poder, dependendo de sua estrutura de aplicação: implementar o código de desenho, mas desenhar em uma camada, e depois reutilizá-lo. Isto tem a vantagem de não mastigar o tempo de CPU mais de uma vez, mas ainda mantendo a dinâmica processo de desenho.

Assim, por exemplo, quando o tablet finalmente navios (Qualquer dia !!), você pode refazer seus parâmetros de desenho um pouco para cobrir todos os dispositivos possíveis, em vez de gerar um monte de diferentes imagens estáticas.

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