Por que o C / C ++ é preferido para desenvolvedores de jogos?

14

Algumas pessoas dizem que oferece mais controle aos desenvolvedores, mas o que é precisamente que pode ser controlado por C ++ que não pode ser controlado usando, por exemplo, Java?

Paulo
fonte

Respostas:

21

Java é executado em uma máquina virtual, enquanto o C ++ é executado diretamente no hardware. O que isso significa é que você tem mais controle sobre onde sua memória vai e o que é feito com ela em C ++.

Java é uma linguagem de coleta de lixo. Você não tem controle direto sobre sua memória. Você pode alocar novos pedaços de memória, mas não tem controle (fino) sobre quando ela é excluída. O coletor de lixo verifica cada pedaço de memória que você alocou todos os quadros x e determina se é lixo ou ainda está sendo usado.

Para jogos, isso pode ser desastroso. A cada poucos quadros, um coletor de lixo aparece para verificar todas as alocações feitas para ver se ele ainda está sendo usado? Fale sobre uma desaceleração!

Em segundo lugar, a maioria das bibliotecas que usamos foram escritas em C ou em C ++. Estou falando de Scaleform, mecanismo de física Havok, PhysX, SpeedTree, etc. Todos os pacotes profissionais, amplamente utilizados na indústria. Se outro idioma quer ser rei, é melhor apoiá-los.

Minha opinião pessoal é que o Java é realmente bom para aplicativos e aplicativos de desktop, mas não para jogos. O Java possui muitas ferramentas interessantes para desenvolvedores e, teoricamente, pode ser executado em qualquer plataforma que tenha uma implementação da Java Virtual Machine, mas eu ainda prefiro o C ++ porque preciso desse controle sobre minha memória. Especialmente quando você começa a trabalhar com estruturas de dados exóticas (árvore vermelho-preta, lista duplamente vinculada etc.), ajuda a manter uma boa visão geral de todas as suas alocações de memória.

Não estou dizendo: não use Java. Estou dizendo: pense por que você está usando Java. O Minecraft foi construído em Java, portanto, é possível criar jogos em Java. Mas teria sido um jogo melhor, se tivesse sido construído em C ++? Bem, certamente não teria sido tão barato executá-lo nos três grandes (Windows, MacOS, Linux), mas, mesmo assim, encontrou muitos bugs específicos da plataforma em seu desenvolvimento, bugs que o Java não poderia atenuar sobre.

Existem toneladas de estruturas C ++ agora para programadores iniciantes. Não há realmente nenhuma desculpa para não aprender, especialmente se você quiser continuar sua carreira na indústria.

knight666
fonte
1
Apenas um detalhe, mas na maioria dos ambientes operacionais, o código nativo é executado em uma máquina virtual. Java é executado em uma máquina virtual dentro de uma máquina virtual.
Skyler Saleh
1
@RTS: É um pouco difícil chamar a tradução op -> micro-op de uma máquina virtual, se é isso que você está recebendo.
Não, eu estava falando sobre a máquina virtual em que todos os aplicativos são inseridos pelos sistemas operacionais modernos para permitir multitarefa segura. Isso ocorre no SO executado em arquiteturas sem micro-ops (RISC). Isso inclui memória virtual, interrupções de software, sistemas para acesso simultâneo ao hardware, o planejador de sistemas operacionais e o manuseio do arquivo de registro.
Skyler Saleh
@RTS Não tenho certeza de que o isolamento da tarefa realmente se qualifique como uma VM. É um RM (Real Machine) com alguma proteção incorporada. Não há uma camada óbvia de abstração de instruções entre busca / exec. Compiladores e vinculadores geram código relocável como requisito. A CPU fornece suporte de hardware para grande parte disso - o que remove o aspecto "virtual".
precisa saber é o seguinte
2

Resposta curta: o C ++ é compilado no código nativo, portanto o desempenho depende do desenvolvedor, não do tempo de execução ou da VM.

Resposta longa:

C ++ ser "mais rápido" não tem nada a ver com C ++. No momento, é um dos poucos idiomas disponíveis suportados por ferramentas que produzem código nativo autônomo para várias plataformas.

Antigamente, você podia usar C, C ++, BASIC / 2, Delphi, etc, e obter executáveis ​​independentes e eficientes. A escolha do idioma era uma questão de preferência pessoal e forças de mercado.

Atualmente, a suposição de que "C ++ é mais rápido" é essencialmente uma profecia auto-realizável, embora o LLVM esteja em uma boa posição para mudar isso, uma vez que faz o que quer que seja discutido no analisador, como era antes.

A Borland estava certa: vários idiomas que foram analisados, as primeiras otimizações aplicadas e depois passadas para um compilador e vinculador de back-end comum. Qual é efetivamente uma das principais realizações do LLVMs.

Java é estruturado de tal maneira que seria muito difícil de implementar sem a JVM. Por incrível que pareça, o C #, comum e incorretamente, supõe ser aproximadamente equivalente ao Java, já compila o código nativo em várias plataformas, incluindo o iOS.

Topo da minha lista de Natal? Uma máquina do tempo para voltar atrás e adicionar propriedades, manipulação real de exceções e polimorfismo real de TRABALHO ao C ++, e livrar-se da porcaria de sintaxe da seta para cima que o analisador pode descobrir por si só. Escrevi um pré-processador para esses 10 anos. atrás, porque é estúpido.

3Dave
fonte
Você quer dizer acesso indireto a membros (como em h-> x)? Remover isso tornaria os tipos de identificador e ponteiro inteligente muito menos úteis. Se você argumenta alterá-lo apenas para indicadores não processados, você apenas tornou a linguagem menos consistente.
Lars Viklund
1
O que não funciona no polimorfismo do C ++?
Casey #
@LarsViklund sim, é isso que eu quero dizer. Porém, embora o endereço, a desreferência e os operadores membros (&, *, ::, -> ...) tenham todos significados diferentes, na maioria das vezes é possível inferir o resultado derivado do contexto. As coisas poderiam ter sido simplificadas antecipadamente, como é feito em outros idiomas. Um ponto de discórdia menor, mas que tem o potencial de aumentar a complexidade do código (e, portanto, tempo e custo de desenvolvimento).
precisa saber é o seguinte