É razoável escrever um motor de jogo em C? [fechado]

Fechado . Esta pergunta é baseada em opiniões . Atualmente não está aceitando respostas.

Comentários

  • Jogos de console usam c ++ FYI!
  • Na verdade, acho que C seria mais fácil de escrever jogos em uma determinada escala, digamos dezenas de milhares de LOC ou mais, principalmente porque permite que você se concentre apenas em bits e bytes sem tipos de dados complexos e cria super rápido em comparação com C ++. Mas depois de uma certa escala (digamos, atingindo centenas de milhares de LOC), eu ' d começo a querer alcançar C ++ onde ' d começar a desejar tipos de dados complexos, mais segurança de tipo, possivelmente exceções, modelos e ir ainda maior em escala (digamos milhões), para outras coisas além de C ++ para combinar com o código C e C ++.
  • C também tem a vantagem de ser amplamente portátil até mesmo para ABI, então se torna muito fácil pegar seu código C existente e começar a usá-lo em outras linguagens a partir de, digamos, uma FFI. C ++ é um pouco mais complicado com alteração de nomes, incapacidade de passar com segurança pelos limites do módulo, representantes de vtable não sendo os mesmos entre os compiladores, implementações de biblioteca padrão que diferem entre fornecedores, etc. Geralmente acho que as bibliotecas C que escrevo duram mais sem a necessidade de mudanças e saindo de moda, embora demore mais para escrever algo em escala com isso.

Resposta

No entanto, escrever um motor de jogo inteiro em C não seria razoável hoje?

É razoável, mas o a questão é o que ele compra para você? Você provavelmente não precisa da extrema portabilidade que C oferece, e é uma pena desistir de todos os recursos que C ++ oferece, a menos que você esteja filosoficamente contra isso.

Quais são, se houver, algumas vantagens que C tem sobre C ++?

Melhor tempo de compilação?

Por que alguém pos deseja usar C em vez de C ++?

Acho que é principalmente uma escolha estética. Muitas pessoas gostam de C porque é simples, mínimo e parece limpo. C ++ tem muitos recursos interessantes (os namespaces por si só já valem a pena usar), mas também é grande e confuso.

Comentários

  • Até Id Tech 4
  • @Josh: Mais fácil de depurar !? Os programas C são notoriamente difíceis de depurar, principalmente devido a ponteiros e gerenciamento de memória. Programas C ++ (ao usar expressões idiomáticas de programação C ++ verdadeiras, que tendem a evitar ponteiros e gerenciamento de memória sempre que possível) são várias ordens de magnitude mais fáceis de depurar.
  • C pode ser entendido por meros mortais. C ++ parece ter muitos recursos e casos extremos que programadores experientes aprendem mesmo depois de uma década usando-o todos os dias para viver.
  • C ++ é uma grande linguagem, mas ' é espalhada principalmente por pessoas que ' acabaram de ler histórias de terror e não ' não dedicaram tempo para aprender . Há muito o que aprender, mas você recebe muito valor em troca disso. C ++ permite que você expresse muitas coisas que C simplesmente pode ' t.
  • @ BlueRaja-DannyPflughoeft #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 será alocado quando, porque há muitas maneiras de alocar memória (new, malloc, construtores de classe, etc.)

Resposta

Tenho trabalhado extensivamente com um motor de jogo C puro que distribui vários produtos, por isso é absolutamente possível. Esta é minha experiência pessoal com o trabalho em ambos os motores C vs C ++:

  1. Usar estruturas puramente C permite que você aproveite o conhecimento sobre o alinhamento de estruturas, e você pode então usar essas informações para construir suas camadas de persistência e serialização de objetos. O mecanismo com o qual trabalhei tinha alguns analisadores de cabeçalho simples que criariam automaticamente esses metadados sobre estruturas e tornava triviais certos tipos de operações de dados. Analisar arquivos de cabeçalho C ++ arbitrários é essencialmente impossível, e logo à medida que adiciona herança e funções virtuais, você perde a capacidade de saber exatamente onde as coisas estão na memória
  2. O tempo de compilação é significativamente mais curto porque você pode manter seus arquivos de cabeçalho muito compactos e aproveitar as declarações de estruturas.
  3. A depuração pode ser melhorada porque sem o uso de modelos e herança é muito fácil descobrir exatamente o que é um determinado objeto e o que está fazendo.

Todos esses benefícios também poderiam ser alcançados com a mesma facilidade usando código c ++ restrito que evita usar modelos e herança em objetos serializados, mas foi decisão do CTO que seria mais fácil para impor a simplicidade se os elementos mais confusos de C ++ não estivessem disponíveis.

Pessoalmente, acho que isso era um pouco extremo, pois eu realmente sentia falta da capacidade de declarar variáveis em loops for e os muitos usos completamente legítimos para herança. Mas, realmente não nos custou muita produtividade no final, considerando todas as coisas

Comentários

  • Lá ' realmente não há nada que impeça você de implementar herança em C. E se você usar C99, poderá declarar variáveis em loops for.
  • Discordando do ponto 3. Isso ' É tão fácil escrever código confuso e difícil de depurar em C quanto em C ++. Melhor depuração não é ' algo inerente à linguagem C.
  • Mesmo código limpo pode ser mais difícil de entender em C ++ – com sobrecarga, modelos, funções virtuais e exceções, é ' muito mais difícil ver de relance exatamente qual será o fluxo de controle real.
  • @Dan: Simplesmente por ter mais coisas, C ++ é mais difícil de depurar. Você pode, é claro, restringir-se de usar qualquer uma dessas coisas, caso em que se torna tão fácil de depurar quanto C – porque se torna C.
  • Menos coisas é realmente a razão de eu gostar de C. Por exemplo, em CI pode apenas copiar bits e bytes com um memcpy para qualquer coisa porque o sistema de tipo não ' permite coisas como copiar ctors e dtors . Posso escrever código sabendo que não ' terei que reverter os efeitos colaterais em quase qualquer linha de código, já que posso ' t implicitamente sair de uma função, a menos que eu retorne explicitamente dela; não há exceções sendo lançadas. Tudo isso torna a escrita de estruturas de dados muito mais fácil – em C ++, apenas escrever um vector compatível com o padrão consome muito tempo, especialmente se você quiser …

Resposta

Estou reescrevendo um mecanismo de jogo 2D escrito em C ++ e Lua para C e Lua. Até agora, a experiência tem sido muito boa. Obviamente, fazer operações de vetor e matriz não acaba sendo uma boa aparência em C. Mas, além disso, achei a experiência bastante refrescante depois de passar mais de 10 anos como um desenvolvedor C ++.

C tem vários vantagens sobre C ++:

  1. O compilador garantirá que nenhum código seja executado no momento da inicialização estática. Isso torna completamente seguro alocar estaticamente dados globais como strings usadas como chaves, por exemplo,
  2. Transparência. Na atribuição de C, alocação ou definição de uma variável não causará a execução de muito código. C ++ irá gerar automaticamente construtores de cópia para você, então você terá menos controle sobre o que é executado ao fazer a atribuição. li> Muitas depurações podem ser mais fáceis devido a não ter os nomes das funções mutilados
  3. É normalmente não há problema em usar memcpy em C, mas vai causar problemas facilmente em C ++, porque os construtores de cópia não serão executados. isso t memcpy é muito mais rápido do que std :: copiar que importa.

Além disso, há uma série de vantagens em entrar no modo de pensar C. Em C ++, geralmente me pego criando coisas um pouco generalizadas e abstratas. Em C, geralmente cortei coisas como métodos get-set e frequentemente pré-aloco arrays de tamanho fixo em vez de usar arrays dinâmicos. Freqüentemente, acabo com um código mais curto e mais fácil de depurar em C. As estruturas de dados geralmente são mais planas e fáceis de visualizar em um depurador.

Para ser justo, eu nunca faria um aplicativo exclusivamente em C. O motivo funciona se eu combiná-lo com uma linguagem de nível superior como Lua, que pode complementar C muito bem, onde C não é tão forte.

O software de id escreve a maioria de seus motores em CI, acredita, você pode olhar para Retorne ao castelo Wolfenstein que foi escrito em C.

Eu escrevi sobre algumas de minhas experiências em escalabilidade de C vs C ++ e desvantagens do vetor STL em comparação com matrizes simples.

Comentários

  • Para sua informação, em cada instância que ' verifiquei (o que é, eu acho, darwin gcc e vc2008), std :: copy irá apenas compilar para uma chamada para memcpy se ambos os tipos forem POD.
  • Além disso, RE: vetor STL vs matrizes simples, por que não usar as boas partes de vecto re use ponteiros C normais em vez de iteradores se você não ' gostar deles? Você pode simplesmente fazer & myvector [N].É ' como o melhor dos dois mundos, assumindo que seu código C faz a alocação de memória da mesma maneira. Ou, em loops for, verifique BOOST_FOREACH. Torna ainda mais simples do que C.
  • Obrigado pela dica sobre std :: copy memcpy. Eu não ' não sabia disso. Quando Alexandrescu tratou disso há alguns anos, não era o caso. Sobre iteradores C ++. É principalmente sobre a filosofia, eu tento programar como C ++ deveria ser programado para o bem das pessoas com quem trabalho e para tirar proveito dos recursos do C ++. Foi feito principalmente para apontar que algumas melhorias de C ++, como contêineres STL, nem sempre são melhores do que fazê-lo da maneira antiga do C.

Resposta

Como alguém apontou, C ++ traz a vantagem de ombros largos sobre os quais você pode se apoiar (BOOST, STL etc.). No final das contas, é 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.

Comentários

  • Observe que 99% dos motores de jogos comerciais e internos evitam Boost e STL por vários motivos (garantia de desempenho, depuração, segurança de thread, controle).
  • E 99% das estatísticas são feitas.
  • Eu acho que deveria ser uma regra citar todas as estatísticas.

Resposta

Eu não ” Se alguém usa C exclusivamente hoje em dia, ele geralmente é misturado com uma linguagem de nível superior.

Programar em C tem alguns benefícios em relação a, digamos, programar em C ++. C ++ pode fazer muitas coisas ocultas que são invisíveis para o usuário, o que pode prejudicar o desempenho se você não tomar cuidado. 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 escrever as partes críticas de desempenho de um jogo de maneira semelhante ao C, em vez de ao modo C ++ tradicional. nunca ouvi falar de ninguém, nos últimos anos, realmente escrevendo um jogo inteiro em C no entanto.

Em algumas plataformas, como o iPhone, usar C ++ pode aumentar o tamanho do seu executável com um certo pedaço de kilobytes (esqueci como muito, desculpe), que é a razão pela qual alguns desenvolvedores de iPhone optam por escrever seu código em uma mistura de C e Objective-C.

Resposta

Vou dar mais alguns motivos pelos quais não seria razoável escrever um motor de jogo em C em vez de C ++ hoje: STL e BOOST.

Não consigo imaginar como seria vale a pena escrever outro list impleme ntação em que você pode confiar em um código que funciona imediatamente (e que você não precisa escrever!)

Comentários

  • Algum grande estúdio realmente usa impulso? Mesmo o uso de STL ainda está em debate, por causa da portabilidade. Pelo menos para mecanismos de console.
  • Pessoalmente, eu ' m usando Boost.FunctionTypes para interação c ++ / lua (consulte gamedev.net/reference/programming/features/CPPLuaExport/ … ) e a biblioteca de números aleatórios Boost para geração uniforme de números aleatórios (para sistemas de partículas). Além disso, Boost.Foreach é legal. BTW, quem se importa se os grandes estúdios não estão usando o BOOST? Eles têm mão de obra para escrever suas próprias bibliotecas STL do zero, eu não ' t.
  • Sim, mas também percebo que há ' s bibliotecas semelhantes para C também.
  • Muitas pessoas usam o boost em jogos, eu acredito. Mas ' está longe de ser um requisito (ou mesmo desejável) para muitos de nós.
  • Gente, o que você acredita é irrelevante : você sabe ou não ' não sabe .

Resposta

Escrever um motor de jogo em C é razoável. É rápido e pode ser transferido para vários sistemas. Por exemplo, você pode usar para Android (com o uso do NDK). Você pode usá-lo para o iPhone (Objetivo c é apenas uma extensão de c). Você também pode usar para e do sistema operacional principal, como Linux, Mac ou Windows. Se você se sentir confortável com c, sugiro que experimente!

Resposta

Claro que é razoável. Eu pessoalmente não faria isso, e a maioria dos fãs de C que conheço na verdade apenas escrevem código C-like em arquivos .cpp. Mas as linguagens são semelhantes o suficiente para onde realmente não importa.

Quanto a por que alguém escolheria fazer isso, acho que é principalmente devido à filosofia anti-C ++. Pessoalmente, ainda não acho que essa seja uma boa razão para escolher C em vez de “C-style C ++”. A loucura de typedef struct é uma razão boa o suficiente para evitar o C, e há uma série de outras.

Infelizmente, C e C ++ são linguagens terríveis quando chegamos a ele. Essa é uma das razões pelas quais as pessoas têm tentado fazer muito de seu código em script nos últimos anos.

Se você está procurando por exemplos de pessoas trabalhando em C, pode ignorar id, pois me lembro de ter lido que elas abandonaram C há muito tempo. No entanto, a Cryptic Studios (Star Trek Online) faz todo o desenvolvimento do motor em C. Pelo que eu posso dizer, sim, é mais por causa da filosofia do que por qualquer vantagem tangível.

Resposta

Sim e não. Sim, fiz isso há alguns anos, mas precisava que meu jogo rodasse em 3D em um servidor remoto unix (não linux) de 64 bits com os jogadores em terminais burros. Não era trivial. C pode ser bom é você deseja integrar LUA, mas acabei conseguindo que Lua trabalhasse em C ++, então eu diria que sim, é possível, mas não faça isso.

Resposta

Uma possível boa resposta pode ser” use both “?

Como eu ouvi que os projetos panda3d podem ser otimizados, eliminando o gargalo usando algum cython ou recodificando essas partes.

Na maioria das vezes, as partes que precisam ser otimizadas são as partes com muitas iterações e aninhamento ou com muita computação numérica, então meu palpite (selvagem) é que um compromisso justo seria usar ambas as linguagens , usando C para partes que incluem muita programação de baixo nível, então você não pode fazer um y mau uso da linguagem C ++ para a parte que precisa de velocidade e C ++ para o resto do jogo.

O ideal é que você faça a parte rápida do motor tendo em mente o alto nível e, em seguida, use um linguagem de script ou C ++ que usará muito menos aninhamento / loops.

É claro que você nunca poderia fazer um mecanismo que caberia em todos os jogos que os desenvolvedores precisariam fazer, exceto se você dedicar seu mecanismo para um tipo de jogo …

Mas não tome meu conselho como garantido, já que não sou um desenvolvedor de jogos experiente, nem um desenvolvedor experiente … Acho que C força você a escrever código rápido, enquanto escrevo código C ++ bom e rápido para um projeto tão grande quanto um jogo é uma coisa diferente …

Resposta

C funcionou para John Carmack , você pode obter muitas vantagens usando C, mas pode demorar um pouco até chegar lá para se beneficiar delas.

Aqui você pode encontrar uma lista de motores de jogo alguns Se eles forem escritos em C, talvez você possa obter alguns insights sobre como fazer um mecanismo de jogo em C examinando seu código-fonte.

Resposta

O código C é normalmente um código C ++ válido.

Os principais problemas com C ++ são usá-lo incorretamente ( Linus Torvalds odeia por esse motivo , ele também teve alguns outros problemas com a portabilidade da biblioteca e assim por diante, ele está trabalhando no nível de sistemas operacionais e precisa ser capaz de executar coisas em todos os chips aleatórios que existem).

Por exemplo não há quase nenhuma vantagem em usar um array cstyle [] em vez de um c ++ std :: vector <> (ou contêiner semelhante).

Os vetores são typesafe e pode ter os limites verificados (você pode acessar os elementos usando get () ou [], mesmo se você não usar o método de verificação de matriz, você ainda pode 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. Além disso, adicionar coisas a um vetor pode causar lentidão se ele precisar de um redimensionamento. C ++ 11 também adiciona muitas vantagens, como inicialização uniforme (agora você pode declarar e inicializar vetores usando a mesma sintaxe) e existem construtores de movimento que podem permitir que você evite a cópia. Você pode até fazer seus próprios inicializadores personalizados (se por algum motivo quiser fazer algo diferente de malloc).

Ou, claro, se precisar redimensionar coisas, os vetores ainda são mais fáceis de fazer com , você não tem que mexer com malloc, copiar coisas manualmente e assim por diante.

C ++ fornece código orientado a objeto. Quando compilado, será tão eficiente, já que é realmente justo uma abstração para humanos que trabalham com o código. Embora coisas como construtores possam retardar a criação de objetos. Mas você precisará que o construtor defina os valores padrão ou poderá inicializar objetos sem usar o construtor (deixando de fora os () “s ).

Mas a orientação a objetos torna os jogos de programação muito mais fáceis. Os jogos geralmente lidam com objetos.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *