Mesmo que o C ++ pareça rei, pelo que me disseram, o C ainda é amplamente usado em jogos, especialmente nos consoles. No entanto, escrever um mecanismo de jogo inteiro em C seria irracional hoje? Quais são, se houver, algumas vantagens que C tem sobre C ++? Por que alguém possivelmente desejaria usar C sobre C ++?
53
Respostas:
É razoável, mas a questão é: o que você compra? Você provavelmente não precisa da portabilidade extrema que o C oferece, e é uma pena renunciar a todos os recursos que o C ++ oferece, a menos que você esteja realmente filosoficamente contra isso.
Melhor tempo de compilação?
Eu acho que é principalmente uma escolha estética. Muitas pessoas gostam de C porque é simples e minimalista e se sente limpo. O C ++ possui muitos recursos interessantes (apenas espaços para nome valem a pena ser usados), mas também é grande e confuso.
fonte
#define malloc(x) my_malloc(x)
#define free(x) my_free(x)
e agora você está depurando a memória. Com C ++ você nunca sabe o que vai ser alocado quando, porque há tantas maneiras de alocar memória (novo, malloc, construtores de classe, etc.)Eu trabalhei extensivamente com um mecanismo de jogo C puro que vendeu vários produtos, por isso é absolutamente possível. Aqui está minha experiência pessoal com o trabalho em ambos os mecanismos C vs C ++:
Todos esses benefícios também poderiam ser alcançados com a mesma facilidade usando o código c ++ restrito que evita o uso de modelos e herança em objetos serializados, mas a decisão do CTO era de que seria mais fácil reforçar a simplicidade se os elementos mais confusos do C ++ não fossem acessível.
Pessoalmente, acho que isso foi um pouco extremo, pois realmente perdi a capacidade de declarar variáveis dentro de loops e os muitos usos completamente legítimos da herança. Mas, no final, não nos custou muita produtividade
fonte
memcpy
para qualquer coisa, porque o sistema de tipos não permite coisas como copiar ctors e dtors. Posso escrever código sabendo que não precisarei reverter os efeitos colaterais em quase qualquer linha de código, pois não posso sair implicitamente de uma função, a menos que eu a devolva explicitamente; não há exceções sendo lançadas. Tudo isso faz da escrita estruturas de dados muito mais fácil - em C ++ apenas escrevendo a-padrão compatívelvector
é muito, especialmente se você quiser torná-lo demorado ...Estou reescrevendo um mecanismo de jogo 2D escrito em C ++ e Lua em C e Lua. Até agora, a experiência tem sido muito boa. Obviamente, fazer operações vetoriais e matriciais não acaba com uma aparência agradável em C. Mas, além disso, eu achei a experiência bastante refrescante depois de passar mais de 10 anos como desenvolvedor de C ++.
C tem várias vantagens sobre o C ++:
Além disso, há uma série de vantagens em entrar no modo de pensar C. Em C ++, muitas vezes me vejo tornando as coisas um pouco generalizadas e abstratas. No IC, geralmente recortam coisas como métodos get-set e geralmente pré-alocam matrizes de tamanho fixo em vez de usar matrizes dinâmicas. Freqüentemente, acabo com um código menor e mais fácil de depurar em C. As estruturas de dados geralmente são mais planas e mais fáceis de visualizar em um depurador.
Para ser justo, eu nunca faria um aplicativo exclusivamente em C. A razão pela qual funciona é que eu o combino com uma linguagem de nível superior, como Lua, que pode complementar C muito bem, caso C não seja tão forte.
Id software escreve a maioria de seus mecanismos em CI acredita, você pode olhar para Return to castle Wolfenstein, que foi escrito em C.
Eu escrevi sobre algumas das minhas experiências em escalabilidade de C vs C ++ e desvantagens do vetor STL em comparação com matrizes simples.
fonte
Como alguém apontou, o C ++ traz a vantagem de grandes ombros sobre os quais você pode se apoiar (BOOST, STL etc.). No final, é uma escolha pessoal, mas eu escolheria C ++ por causa dos recursos disponíveis. Se houver recursos em C ++ que você não deseja usar, não os use.
fonte
Não acho que alguém use C exclusivamente hoje em dia, geralmente é misturado a um idioma de nível superior.
A programação em C tem alguns benefícios sobre, digamos, a programação em C ++. O C ++ pode fazer muitas coisas invisíveis para o usuário, o que pode prejudicar o desempenho se você não tomar cuidado. O C ++ também pode ser terrível quando se trata de uso de cache, o que novamente pode prejudicar seu desempenho.
Portanto, pode trazer alguns benefícios para escrever as partes críticas de desempenho de um jogo em modo C, em vez de em C ++ tradicional. Eu nunca ouvi falar de alguém, nos últimos anos, realmente escrevendo um jogo inteiro em C.
Em algumas plataformas, como o iPhone, o uso do C ++ pode aumentar o tamanho do seu executável com um certo pedaço de kilobytes (esqueci quanto, desculpe), razão pela qual alguns desenvolvedores do iPhone optam por escrever seu código em uma combinação de C e Objective -C.
fonte
Vou lhe dar mais algumas razões pelas quais não seria razoável escrever um mecanismo de jogo em C em vez de C ++ hoje: STL e BOOST.
Não consigo imaginar como valeria a pena escrever mais uma
list
implementação quando você pudesse confiar no código que funciona imediatamente (e que você não precisa escrever!)fonte
Escrever um mecanismo de jogo em C é razoável. É rápido e pode ser portado para vários sistemas. Por exemplo, você pode usar para Android (com o uso do NDK). Você pode usá-lo para o iPhone (o objetivo c é apenas uma extensão de c). Você também pode usá-lo para e do sistema operacional principal, como Linux, Mac ou Windows. Se você se sentir confortável com c, sugiro que tente!
fonte
Claro que é razoável. Eu pessoalmente não faria isso, e a maioria dos fãs de C que conheço na verdade apenas escreve código semelhante a C em arquivos .cpp. Mas os idiomas são semelhantes o suficiente para onde realmente não importa.
Quanto ao motivo pelo qual alguém escolheria fazer isso, acho que se deve principalmente à filosofia anti-C ++. Pessoalmente, ainda não acho que essa seja uma boa razão para escolher C em "C-style C ++". a loucura do typedef struct é uma razão suficientemente boa para se afastar de C, e existem vários outros.
Infelizmente, C e C ++ são linguagens terríveis quando chegamos a esse ponto. Essa é uma das razões pelas quais as pessoas têm tentado fazer muito do código em script nos últimos anos.
Se você está procurando exemplos de pessoas que trabalham em C, pode ignorar o id, já que lembro de ler que elas abandonaram C há muito tempo. Porém, a Cryptic Studios (Star Trek Online) faz todo o desenvolvimento de seus motores em C. Pelo que sei, sim, é mais por causa da filosofia do que por qualquer vantagem tangível.
fonte
Sim e não. Sim, eu fiz isso alguns anos atrás, mas eu precisava do meu jogo para rodar em 3D em um servidor remoto unix (não linux) de 64 bits com os jogadores em terminais burros. Não foi trivial. C pode ser legal é que você deseja integrar o LUA, mas eu finalmente consegui lua para trabalhar em C ++, então eu diria que sim, é possível, mas não o faça.
fonte
Uma possível boa resposta pode ser "use both"?
Como ouvi dizer que os projetos do panda3d poderiam ser otimizados, eliminando gargalos usando algum cython ou recodificando essas partes.
Na maioria das vezes, as partes que precisam ser otimizadas são aquelas com muitas iterações e aninhamentos ou com muita computação numérica, então meu palpite (selvagem) é que um compromisso justo seria usar os dois idiomas, usando C para partes que incluem muita programação de baixo nível; portanto, você não pode fazer mau uso da linguagem C ++ para a parte que precisa de velocidade e C ++ para o restante do jogo.
Idealmente, você faz a parte rápida do mecanismo mantendo o alto nível em mente e depois usa uma linguagem de script ou C ++ que usará muito menos nest / loops.
É claro que você nunca poderia criar um mecanismo que fosse adequado para todos os desenvolvedores de jogos, exceto se você o dedicasse a um tipo especial de jogo ...
Mas não tome meu conselho como garantido, já que não sou desenvolvedor de jogos nem desenvolvedor experiente ... Acho que C obriga você a escrever código rápido, enquanto escreve código C ++ bom e rápido para um projeto tão grande quanto um jogo é uma coisa diferente ...
fonte
C trabalhou para John Carmack , você pode obter muitas vantagens usando C, mas até chegar lá para se beneficiar delas, pode demorar um pouco.
Aqui você pode encontrar uma lista de mecanismos de jogos, alguns deles escritos em C, talvez você possa obter algumas idéias sobre como criar um mecanismo de jogos em C, seguindo o código-fonte.
fonte
O código C é normalmente um código C ++ válido.
Os principais problemas do C ++ são usá-lo incorretamente ( Linus Torvalds o odeia por esse motivo , ele também teve outros problemas com a portabilidade de bibliotecas e, por isso, compra ele está trabalhando no nível de sistemas operacionais e deve ser capaz de executar as coisas de forma aleatória chip lá fora).
Por exemplo, quase não há vantagem em usar uma matriz cstyle [] em vez de um c ++ std :: vector <> (ou recipiente semelhante).
Os vetores são tipicamente seguros e podem ser verificados dentro dos limites (você pode acessar os elementos usando get () ou [], mesmo se você não usar o método de matriz marcada, ainda poderá consultar o tamanho em vez de carregá-lo com o ponteiro.
Mas os vetores podem ser mais lentos se, por exemplo, você não declarar o tamanho padrão no construtor. A adição de itens a um vetor pode causar lentidão se for necessário redimensionar. O C ++ 11 também oferece muitas vantagens, como inicialização uniforme (agora você pode declarar e inicializar vetores usando a mesma sintaxe) e existem construtores de movimentação que permitem evitar a cópia. Você pode até criar seus próprios inicializadores personalizados (se quiser fazer algo diferente de usar o malloc por algum motivo).
Ou, é claro, se você precisar redimensionar as coisas, os vetores ainda serão mais fáceis de fazer, você não precisará mexer com o malloc, copiar manualmente as coisas e assim por diante.
C ++ fornece código orientado a objeto. Quando compilado, será igualmente eficiente, pois é apenas uma abstração para os humanos que trabalham com o código. Embora coisas como construtores possam retardar a criação de objetos. Mas você precisará do construtor para definir os valores padrão ou poderá inicializar objetos sem usar o construtor (deixando de fora os ()).
Mas a orientação a objetos facilita muito a programação de jogos . Os jogos costumam lidar com objetos.
fonte