Eu uso o Java para escrever jogos e usei o C ++ para escrever jogos e achei o Java bom, desde que você fique atento aos pontos fortes e fracos do Java. As duas grandes vantagens para mim, a programação em Java, são a velocidade de desenvolvimento e a capacidade de implantação / portabilidade. Os tempos de compilação são muito mais rápidos do que no VC ++ (ainda não posso falar por XCode ou Clang), o que significa que posso resolver problemas muito mais rapidamente. Além disso, como o Eclipse está compilando constantemente, cometo menos erros de digitação. Eu nunca escrevi um pedaço de código C ++ que 'simplesmente funcione' em outro sistema ou compilador. Em Java, essa é a norma.
Por outro lado, o Java tem algumas desvantagens importantes. A eficiência costuma ser considerada um motivo para não usar Java, mas eu descobri que, desde que você codifique de uma certa maneira, o Java pode ter um desempenho muito bom. O problema é que a maneira como você precisa codificar vai contra o que muita gente de Java consideraria um bom design.
No coração de Java está o 'coletor de lixo', é o sistema de gerenciamento de memória. Ao escrever um código eficiente, você deseja evitar fazer alocações dinâmicas a cada quadro em qualquer idioma, e isso é particularmente verdadeiro no Java. Se você desativar o coletor de lixo devido a novidades desleixadas, poderá dar adeus às taxas de quadros suaves. Em segundo lugar (e o mais irritante), o Java não suporta tipos de dados de usuário de primeira classe. Todo tipo de dados do usuário em Java é instanciado essencialmente como um ponteiro para uma classe, alocada no heap. Isso é péssimo para a simultaneidade de cache, pois você não pode ter coisas como uma matriz de objetos Vector3 e ter esses concorrentes na memória - você pode ter uma matriz de ponteiros Vector3, mas isso não é a mesma coisa. Geralmente você precisa usar deslocamentos em grandes matrizes de tipos primitivos.