Diferenças do Android (Dalvik + Java vs Old School C ++)

8

O desenvolvimento no Android será diferente para mim, tendo passado os últimos 10 anos codificando jogos em C ++. Quais são as principais diferenças / armadilhas / gargalos no desenvolvimento para o Android? Minha grande preocupação é mudar para Java, do que vou sentir mais falta?

Para ser mais claro: do que eu sentiria falta se codificasse tudo em Java em comparação com a maneira como normalmente codifico C ++ para consoles?

Richard Fabian
fonte
O título poderia ser um pouco melhor. Só para esclarecer, você está perguntando "Qual é a diferença entre C ++ e Java no telefone Android?"
Jesse Dorsey
6
Acho que se você usar o NDK ( developer.android.com/sdk/ndk/index.html ), poderá escrever a maior parte do seu código em C ++.
Chris Howe

Respostas:

6

A maior coisa que você provavelmente sentiria falta seria o gerenciamento explícito da memória. No lado positivo, Java possui informações sobre o tipo de tempo de execução e genéricos reais. Consulte também: http://developer.android.com/guide/practices/design/performance.html para obter algumas dicas do Google sobre como manter seu código Java eficiente.

Raymond Chen recentemente falou sobre a coleta de lixo e o gerenciamento de memória no CLR, e seus posts no blog são ótimos para entender como ele funciona. (Eu sei que os seguintes links são para o CLR, mas ainda são relevantes para o desenvolvimento Java). Veja especialmente: http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx e http://blogs.msdn.com/b/oldnewthing/archive/2010/08/10 /10048150.aspx

Dito isto, não há muita diferença entre Java e C ++ e, como Chris apontou, você pode codificar em C / C ++ no Android usando o NDK.

brett
fonte
obrigado ", você pode codificar em C / C ++ no Android usando o NDK", sim, eu aprecio isso, mas por que usar armas antigas o tempo todo, se algo realmente resulta em projetos melhores / mais rápidos.
Richard Fabian
2
Oh, eu vejo no que você está chegando. Java tem o bônus de ter uma biblioteca padrão massiva e uma biblioteca extremamente competente para lidar com XML. A plataforma Android estende a biblioteca padrão com bibliotecas para todos os itens sofisticados de hardware e algumas funcionalidades extras do lado do usuário. O Java também suporta compilação incremental / verificação de erros, para que você obtenha feedback sobre os erros assim que os digitar. Honestamente, você também não deve temer o desempenho. Não será tão rápido quanto C no bare metal, mas ainda é bastante rápido. Eu diria que não há muito com que se preocupar.
Brett
4

Chris Pruett, do Google, falou sobre a criação de jogos em tempo real para Android no Google I / O 2009 e novamente em 2010 . Ele fala sobre o desempenho do Java no Android, entre outros tópicos. Ele também criou um jogo, Replica Island , em Java e você pode fazer o download do código-fonte para ter uma idéia de como um jogo Java Android pode parecer. Seu blog sobre o jogo também possui vários artigos interessantes.

As armadilhas típicas são semelhantes às de escrever em outras linguagens de coleta de lixo , você usa um pool de objetos e aloca as coisas com antecedência para evitar que o GC seja executado quando você não deseja. Os métodos são virtuais por padrão em Java e ajuda a marcá-los como finais quando você não precisa substituí-los. O plug-in do Android Eclipse vem com algumas ferramentas legais para ajudá-lo a criar um perfil do seu aplicativo e monitorar as alocações de heap.

Firas Assaad
fonte
2

Você está se preocupando demais. A API para OpenGL no Android, OpenGL-ES, foi deliberadamente mantida como C. Veja as especificações do OpenGL em http://www.khronos.org/opengles/ para obter detalhes.

É até possível que você não perca muito do C ++. Muitos desenvolvedores, mesmo o famoso autor de programação Bruce Eckel ('Thinking in C ++', 'Thinking in Java'), consideraram o Java uma linguagem muito mais eficaz para a programação orientada a objetos. Em grande parte porque as coisas que eles “perderam” a princípio acabaram não sendo tão importantes, afinal.

Dito isto, o que mais sinto falta é a capacidade de substituir operadores, não apenas métodos. A sintaxe é realmente mais desajeitada quando você precisa definir / substituir métodos em vez de operadores.

Considere, por exemplo, aritmética de números complexos. É realmente elegante em C ++. Não é assim em Java. Mas isso acaba tendo um impacto mínimo na maioria dos projetos reais.

Algumas pessoas reclamam da incapacidade de fazer herança múltipla. Mas o tipo mais útil de herança múltipla É o tipo que Java faz com a 'interface', então você não deve perder muito.

user1800
fonte