Antes de mais, gostaria de ter uma resposta real, estou sempre tentando obter mais informações de várias fontes e artigos, e quando leio coisas como C ++ é lento porque possui funções virtuais e, por isso, C é melhor , realmente não sei o que dizer e pensar como um ser humano com um cérebro. Portanto, evite atingir esse nível em suas respostas.
Minha pergunta é sobre uma grande mudança para C ++ que foi concluída, mais ou menos, com o Doom 3.
O interessante para mim é que, antes desse marco, a maioria dos mecanismos de jogos e os jogos em si eram escritos em C, exatamente como era desde a era do Quake . Também é interessante notar que o software de ID decide reescrever completamente a base de código do IdTech 4 em C ++, uma quantidade enorme de trabalho que honestamente não consigo entender sem uma lista muito boa de razões.
Estou focado no Doom 3 porque estou interessado principalmente no mundo OpenGL e, em minha jornada, tento me manter focado nesse tópico, por isso leio muito sobre isso, mas acho que uma pergunta como essa pode ser render-API -agnóstico sem muitos problemas.
Por que, em determinado momento, o setor mudou massivamente para C ++? Quais são os motivos da escolha que o ID fez?
A última coisa que eu gostaria de dizer é que a linguagem C é muito mais simples de implementar e fornece um número menor de recursos, porque isso tem muito menos chance de ser "fragmentado" em pedaços, como o C ++ realmente costuma fazer. Em termos mais simples, tenho muito mais chances de encontrar um compilador C realmente bom do que um bom compilador C ++ com todos os recursos implementados de uma maneira boa.
Por exemplo, o NDK para Android ainda não possui um bom suporte a C ++ (com a versão r8b) com todos os recursos melhores e mais recentes, e é o kit de ferramentas nativo para o sistema operacional móvel mais popular do mundo!
Se eu tivesse escrito meu código em um C ++ moderno, provavelmente estaria sofrendo agora porque um dos sistemas operacionais mais populares do mundo estaria fora dos limites para mim. E, como o Android, muitos outros compiladores não são tão bons assim.
Devo escrever código C ++ referindo-se a uma versão C ++ com 2-3 anos de idade?
Respostas:
C ++ faz tudo que C faz. Você pode mesclar trivialmente C e C ++ nos casos em que as vantagens do C superam as do C ++. Essa é uma decisão de design muito intencional do C ++.
C ++ faz coisas que C não faz. Isso inclui polimorfismo fácil, mas também geração fácil de código de tempo de compilação por meio de modelos. Isso é realmente útil para coisas como contêineres, que são facilmente a maior fraqueza do C. Também permite tipos do tipo ponteiro definidos pelo usuário (identificadores inteligentes) que economizam muito tempo, bem como tipos primitivos definidos pelo usuário, como vetores e matrizes com suporte do operador (também economizam muito tempo).
As funções virtuais são mais lentas que as funções não virtuais. No entanto, você deve optar por funções virtuais, e um programador competente faz isso apenas quando é benéfico. Os programadores C têm ponteiros de função e geralmente armazenam coleções daqueles em struct referenciados por outras estruturas; em outras palavras, eles passam por um trabalho extra para recriar exatamente a mesma coisa que as tabelas de funções virtuais. Nos casos em que apenas um ponteiro de função é necessário e nenhuma tabela é necessária, o C ++ ainda permite isso e é equivalente a C. Com um compilador moderno, o C ++ é mais lento que C nos casos específicos em que o programador está optando por um recurso. . Além disso, a sobrecarga da função virtual na prática é muito pequena nas CPUs de modem. Atualmente, o hardware é projetado para os padrões de uso do C ++ e é cada vez mais projetado para atender às necessidades de alto nível dos idiomas interpretados.
As exceções do C ++ historicamente impõem muita sobrecarga, tornando o C ++ mais lento, mesmo que você não as esteja usando. Exceções eram uma coisa terrível a acrescentar ao C ++, se por nenhum outro motivo a não ser o imenso aumento na complexidade envolvida na escrita de códigos com exceção de segurança, e de fato alguns designs de contêineres são literalmente impossíveis de tornar a exceção segura. Os programadores de jogos geralmente ignoram a existência de exceções e até as desabilitam no compilador. Compiladores modernos têm exceções de zero sobrecarga (ou seja, você paga apenas o custo por elas quando realmente as usa).
C é mais simples de aprender todas as regras de. C ++ é uma linguagem muito grande e complexa. O C ++ permite escrever código de nível superior, produzindo APIs mais fáceis e simples. Algumas pessoas querem entender o idioma mais facilmente, outras querem escrever código avançado com mais facilidade. É uma troca entre a simplicidade de entender o que o compilador está fazendo com um pedaço de código específico versus a simplicidade de escrever grandes aplicativos interconectados complexos. Algumas pessoas valorizam uma muito mais que a outra, por várias razões.
No final, C ++ é um superconjunto de C. Na minha opinião, não existe um programador C ++ altamente competente que também não seja um programador C aceitável (embora existam muitos programadores de C ++ que caem abaixo da minha barra, ser perdido em C puro). Enquanto o C ++ adiciona facilidades para isolar o programador de grande parte do C, o código C ++ não trivial geralmente precisa usar o C para fazer as coisas. Essa é uma das principais diferenças entre C ++, Java e C #. Há uma razão pela qual você costuma ver "C / C ++" agrupados, afinal.
Minha crença pessoal - que é compartilhada com a maioria dos outros profissionais da indústria de jogos com os quais interagi - é que a expressividade aprimorada e os recursos de programação de alto nível do C ++ superam a maior complexidade da linguagem em relação ao C e a maioria dos outros as reivindicações anti-C ++ feitas estão simplesmente desatualizadas com a tecnologia atual.
fonte
A Id Software não é "a indústria". Eles são uma empresa. Embora possam ser influentes, eles não são todos.
Eu trabalhei em alguns mecanismos de jogos que datam de 1999, e eles usavam C ++.
Os principais motivos para a adoção do C ++ "nessa época" são:
Foi padronizado . O C ++ 98 recebeu esse nome porque foi lançado como um padrão ISO em 1998. Até então, havia vários dialetos do C ++ sem uma ideia clara de que era "real" ou "correto". Uma vez padronizado, e os compiladores começaram a implementar o padrão, os desenvolvedores de jogos puderam confiar no padrão real.
Lembre-se da velha piada: um cara entra no consultório médico e diz: "Dói quando levanto o braço assim". Então o médico diz: "Então não levante o braço assim".
Se as funções virtuais são lentas para suas necessidades, o C ++ não força você a usá-las. Tudo em C ++ é opcional. Você escolhe usar cada recurso específico. Se você usa código crítico de desempenho e não deseja sobrecarga virtual, não usa funções virtuais. Assim como se você usa código crítico de desempenho em C, não usa ponteiros de função.
De fato, isso levou muitos jogos de C ++ a não serem C ++ idiomáticos (pelo menos, não C ++ idiomático moderno ), mas apenas "C com classes". E esta é uma maneira perfeitamente funcional de programar C ++. Inferno, apenas poder não precisar digitar
typedef struct
quando você cria um novo tipo é um benefício.C ++ é um grande pacote de recursos, e você pode escolher quais deseja.
O que você quer dizer? O Google mal tolera pessoas que usam NDK; é claro que eles querem que todos usem Java. A única razão pela qual o NDK existe é porque existem certos desenvolvedores importantes que simplesmente não usarão a plataforma sem ela. Portanto, o NDK existe para atendê-los e suas necessidades de recursos.
Sim, C ++ é uma especificação maior e mais complicada de implementar. O mesmo acontece com Java. Assim como qualquer idioma, exceto C.
Além disso, o que você quer dizer com "todos os recursos melhores e mais recentes"? Se você está falando sobre coisas do C ++ 11, bem, ninguém as implementa completamente ainda. As especificações mal completam um ano. Além disso, também não sei se o NDK suporta C11; sim, C também possui "recursos melhores e mais recentes" que não são suportados em todos os lugares.
O que traz um ponto importante: se você deseja que seu aplicativo pure-C seja compilado no Visual Studio, ele precisa estar em conformidade com o C89, e nada além disso. Portanto, a fragmentação com C já existe. Algumas plataformas suportam apenas C89. Alguns suportam C99. Alguns suportam C11, em graus variados. Etc.
Se você quiser usar C, em seguida, usar C . O fato de outras pessoas não terem feito essa escolha não significa que sua escolha esteja errada ou que a escolha deles esteja errada. Você não precisa se justificar para eles, e eles não precisam se justificar para você.
fonte
É comum que eles reescrevam praticamente todo o mecanismo de cada versão (pelo menos até recentemente - não sei muito sobre os últimos jogos), e como o C ++ está crescendo em popularidade, faz sentido usá-lo em vez de colar com C. Com o tempo, menos e menos pessoas serão competentes com C.
Porque oferece muitas funcionalidades de nível superior, sendo quase totalmente compatível com o código C.
O Google teria respondido isso para você: http://fabiensanglard.net/doom3/interviews.php
"... metade dos programadores realmente tinha experiência com C ++ no começo. Eu tinha experiência com C e Objective-C, e meio que" entrei em C ++ "apenas olhando o código que os caras de C ++ estavam escrevendo. Em retrospectiva, eu gostaria de ter orçado o tempo para pesquisar e explorar completamente o idioma antes de começar a usá-lo.
Você ainda pode dizer que o código do renderizador foi desenvolvido amplamente em C e, em seguida, apareceu em C ++.
Hoje, acredito firmemente que o C ++ é a linguagem certa para projetos grandes de vários desenvolvedores com requisitos críticos de desempenho, e a Tech 5 é muito melhor para a experiência do Doom 3. "
Por que você se importa com isso? Não fique preso atrás da coisa mais nova. Se foi bom o suficiente há 5 anos, não terá subitamente piorado agora.
fonte
Bem, o C ++ está em funcionamento desde os anos 80, portanto, se um compilador não o suportar, talvez você deva usar um compilador diferente. E também, C ++ não é realmente muito mais lento que C. É realmente mais lento se você o carrega com funções virtuais e outras abstrações. No entanto, o C ++ é muito usado atualmente no mundo não-unix devido à sua flexibilidade e aos recursos mais recentes que o C não possui. Escrever código modular em C ++ é muito mais fácil do que fazê-lo em C e ajuda a escrever um código mais portátil. De volta ao assunto dos compiladores, não conheço nenhum compilador que não suporte C ++ (talvez não C ++ 11 completamente, mas qualquer compilador meio decente deve oferecer suporte a C ++).
fonte