Pergunta

Sumário:

Can I programa de uma "grossa cliente do jogo" em C sem reinventando rodas , ou devo apenas morder a bala e usar alguma biblioteca ou SDK? Eu sou um programador C moderada e não sou medo de trabalhar com ponteiros, dados estruturas, locais de memória, etc. se ele vai me dar o controle Eu preciso fazer um grande jogo "de espessura-cliente". No entanto, eu estou pensando em abstendo linguagens de alto nível e estruturas para uma questão de poder e controle, não facilidade de uso.

Estou interessante em mexer com a luta 2D / jogo de plataformas como algum projeto paralelo. Eu sou basicamente um programador do lado do servidor Linux com experiência em Python, Ruby e PHP. Eu sei que há excelentes quadros em algumas destas línguas, como PyGame . Também estou ciente das pessoas de sucesso têm tido com coisas como Air e .NET ... mas tenho algumas preocupações:

  • Desempenho : Linguagens de script são notoriamente lenta. Se eu estou fazendo um jogo em tempo real, eu quero que ele seja tão rápida quanto possível.
  • binários enormes : utilizando frameworks como .NET ou linguagens de script como Ruby muitas vezes resultam em grandes CLRs ou bibliotecas que você não teria de outra forma precisa. O jogo que eu quero fazer será pequeno e simples - Eu não quero a sua CLR a ser maior do que o próprio jogo
  • material extra :. Honestamente, eu só não gosto da idéia de herdar bagagem algum grande da biblioteca de jogos se eu posso envolver minha cabeça em torno do meu próprio código melhor

Estou fazendo esta pergunta porque eu sei que eu sou muito suscetível a Não Inventado Aqui Syndrome. Eu sempre quero programá-lo eu mesmo, e eu tenho certeza que ele desperdiça muito tempo. No entanto, isso funciona para mim notavelmente muitas vezes - por exemplo, em vez de usar Rails (um grande web quadro projecto com um ORM e GUI Toolkit cozido em), I utilizada uma matriz de pequenas ferramentas rubi como cremalheira e sequela que se encaixam muito bem juntos.

Então, eu volto para você, por isso os especialistas. Estou sendo ingênuo? Aqui está como eu vê-lo:

  • Use C
    • Contras
      • fará provavelmente me odeiam programação
      • High risco de reinventar rodas
      • High risco de demorando tanto que eu perdem o interesse
    • Pros
      • tentou & verdade - a maioria dos jogos A-lista são feitos em C (? Isto ainda é verdade hoje)
      • High nível de controle sobre o gerenciamento de memória, velocidade, gestão de activos, etc., que eu confio em mim para aprender a lidar com
      • No cruft
  • Use-quadro ou SDK
    • Contras
      • O risco de grandes dimensões entrega
      • Dependente autores biblioteca original para todas as facetas do desenvolvimento de jogos - o que se não houver uma característica que eu quero? Vou ter que programá-lo eu mesmo, que não é ruim, mas vence parcialmente o propósito de usar uma estrutura de alto nível, em primeiro lugar
      • High risco de problemas de desempenho
    • Pros
      • MUITO mais rápido tempo de desenvolvimento
      • Pode ser mais fácil de manter
      • No tempo perdido reinventar paradigmas comuns

O que mais posso acrescentar a esta lista? É uma chamada puro julgamento, ou alguém pode selar o negócio para mim? sugestões de livros bem-vindos.

Foi útil?

Solução

Meu pensamento atual é:

  • Se você quiser aprender a programar, começar a fazer o motor de jogo a partir dos elementos de base para cima (mesmo execução de estruturas de dados básicos - listas, mapas, etc). Eu fiz isso uma vez, e enquanto ela era uma experiência de aprendizagem, eu fiz muitos erros, e eu não faria isso uma segunda vez. No entanto, para aprender a programar, bem como fazer algo legal e vendo resultados que eu tinha tarifa este altamente.

  • Se você quiser fazer um bom jogo, usar qualquer bibliotecas que você quer e projetar toda a infra-estrutura de jogo sozinho. Isto é o que eu estou fazendo agora, e eu estou usando todas as coisas agradáveis ??como STL, ATL / WTL, Boost, SQLite, DirectX, etc. Até agora, eu aprendi muito sobre o aspecto lógica do jogo / meio o código e design.

  • Se você quiser apenas fazer um jogo com artistas e outras pessoas que colaboram para criar um produto acabado, use um dos motores existentes (ogre, Irrlicht, nebulosa, torque, etc) e apenas adicionar em sua lógica do jogo e art.

Um bit final da sabedoria que eu aprendi é que não se preocupam com a síndrome não foi inventado aqui. Como eu vim a perceber que outras bibliotecas (como STL, Boost, DirectX, etc) tem uma ordem de magnitude (ou três) mais homens-horas de tempo de desenvolvimento em si, muito mais do que eu poderia gastar com a parte do jogo / motor. Portanto, a única razão para implementar essas coisas a si mesmo é se você quiser saber mais sobre eles.

Outras dicas

Eu acredito que você está trabalhando sob uma falácia.

Existem várias estruturas fora lá especificamente para programação de jogos --- escritos por pessoas com muita experiência com a complicação do design de jogos, quase certamente mais tha você faz.

Em outras palavras, você tem um "alto risco de problemas de desempenho" se você não usa um quadro.

Eu recomendaria você tentar pyglet .

  • Tem bom desempenho, uma vez que utiliza OpenGL
  • É um compacto biblioteca all-in-one
  • Não tem nenhuma dependência extras além python

Faça alguns testes, veja se você pode fazê-lo rápido o suficiente para você. Só se você provar a si mesmo que ele não se mover para um nível inferior. Embora, eu estou bastante confiante de que python + pyglet pode lidar com isso ... na pior das hipóteses você terá que escrever algumas extensões C.

Hoje, eu acredito que você está em um ponto onde você pode ignorar o problema de desempenho, a menos que você está especificamente tentando fazer algo que empurra os limites. Se o seu jogo é, digamos, não mais complicado do que o Quake II, então você deve escolher ferramentas e bibliotecas que permitem fazer o máximo de o tempo.

Por que escolhi II Quake? Como a execução em uma versão compilada para .NET , ele é executado com um renderizador de software em um mais de taxa de quadros aceitável numa máquina corrente. (Se você gosta - MAME comparar que emula múltiplos processadores e gráficos de hardware a taxas aceitáveis)

Você precisa perguntar a si mesmo se você está neste para construir um motor ou para construir um jogo. Se o seu objetivo é criar um jogo, você deve definitivamente olhar para um motor de jogo estabelecido. Para desenvolvimento de jogos 2D, olhada Torque Game Builder . É um poderoso motor de jogo 2D / SDK que vai colocá-lo em produção do dia 1. Eles têm abundância de ferramentas que integram com ele, pacotes de conteúdo, e você obter o código fonte completo se você quiser fazer alterações e / ou aprender como funciona. É também Mac OSX compatível e tem versões Linux na comunidade.

Se você está procurando algo no lado do console, eles têm também.

Estou surpreso que ninguém tenha mencionado XNA . É um quadro construído em torno de DirectX para fazer programação DirectX gerenciado ao remover um monte de perfumarias e detalhamento de nível inferior de programação DirectX.

Em termos de performance, para a maioria das tarefas de jogo em 2D e 3D, especialmente a construção de algo como um jogo de luta, esta plataforma funciona muito bem. A sua não é como rápido como se você estivesse fazendo nu metal programação DirectX, mas você fica muito perto, e em um ambiente gerenciado, não menos.

Outro benefício legal de XNA é que a maior parte do código pode ser executado em um Xbox 360 e pode até mesmo ser depurado pela conexão de rede foi o jogo é executado no Xbox. jogos XNA já estão autorizados a ser aprovado pela equipe Xbox Live para distribuição e venda no Xbox Live Arcade também. Então, se você estiver olhando para levar o projeto a um estado comercial, você pode ter sou meios disponíveis de distribuição à sua disposição.

Como todas as ferramentas de desenvolvimento de MS, a documentação e suporte é de primeira categoria, e há uma grande comunidade de desenvolvedores com uma abundância de tutoriais, projetos existentes, etc.

Você quer ser capaz de jogar o seu jogo em um console? Você quer fazê-lo como uma experiência de aprendizagem? Você quer o produto final a ser multi-plataforma? Quais bibliotecas têm você olhou em até agora?

Para um jogo 2d Eu não acho que o desempenho será um problema, eu recomendo ir com algo que você irá obter resultados na tela no mais curto espaço de tempo. Se você tem um monte de experiência fazendo Python então Pygame é uma boa escolha.

Se você planeja fazer alguns jogos 3D no futuro, eu recomendo dar uma olhada no Ogre ( http: // www.ogre3d.org ). É uma plataforma 3D motor gráfico cruz que abstrai as APIs gráficas. No entanto, para um projeto 2d é provavelmente um exagero.

A linguagem de implementação mais comum para jogos A-lista hoje é C ++, e um monte de jogos de incorporar uma linguagem de script (como Python ou Lua) para execução de scripts evento de jogo.

As ferramentas que você usaria para escrever um jogo têm muito a ver com as suas razões para escrevê-lo, e com os seus requisitos. Isso não é diferente de qualquer outro projeto de programação, realmente. Se é um projeto paralelo, e você está fazendo isso em seu próprio país, então só você pode avaliar quanto tempo você tem para gastar com isso e que suas exigências de desempenho são.

De um modo geral, os PCs de hoje são rápidos o suficiente para rodar jogos de plataforma 2D escritos em linguagens de script. Usando uma linguagem de script permitirá que você protótipo as coisas mais rápido e você terá mais tempo para ajustar a jogabilidade. Mais uma vez, isso não é diferente do que com qualquer outro projeto.

Se você vai com C ++, e suas razões não tem que ser mais elaborado do que "porque eu quero", eu sugiro que você olhar para SDL para renderização e suporte de áudio. Ele vai tornar as coisas um pouco mais fácil.

Se você quer aprender as tecnologias subjacentes (DirectX, ou você quer escrever blitters otimizadas para alguma razão perversa), em seguida, por todos os meios, uso C ++.

Dito tudo isso, eu adverti-lo contra a otimização prematura. Para um jogo 2D, você provavelmente vai ser melhor fora de ir com Python e PyGame em primeiro lugar. Eu ficaria surpreso se essas ferramentas irá revelar-se inadequada em PCs modernos.

Como para o que as pessoas têm dito sobre C / C ++ / Python, eu sou um desenvolvedor de jogos e minha empresa incentiva C. Não b / c C ++ é ruim, mas porque mal escrito C ++ é um veneno para o desenvolvimento de jogos devido à sua dificuldade ler / debug em comparação com C. (C ++ dá benefícios quando usado corretamente, mas deixe um cara júnior cometer alguns erros com ele e sua pia tempo é enorme)

Quanto à questão real: Se o seu objetivo é apenas obter algo de trabalho, use uma biblioteca.

Caso contrário, o código-lo sozinho por um motivo muito importante: prática
prática na manipulação de estruturas de dados. Haverá momentos em que você precisa para gerenciar seus próprios dados. Prática na depuração de código de utilidade.

Muitas vezes libs fazer exatamente o que você quer e são ótimos, mas às vezes SEU caso de uso específico é tratado muito mal pela lib e você vai ganhar grandes benefícios de escrita que você possui. Isto é especialmente em consoles em comparação com PCs

(edit :) Quanto roteiro e coleta de lixo: é irá matá-lo em um console, em um jogo recente que tive de reescrever grandes partes da coleta de lixo no Unreal apenas para preencher as nossas necessidades em o editor parte. Ainda mais tinha de ser feito no jogo real (não apenas por mim) (para ser justo se estivéssemos empurrando além especificações originais de Unreal)

Scripting muitas vezes bom, mas não é um botão "eu ganhar". Em geral, os ganhos desaparecer se você está empurrando contra os limites da sua plataforma. Eu usaria "por cento das plataformas CPU que eu tenho de sobra", como minha função de avaliação para decidir como apropriado script é

Uma consideração em favor de C / C ++ / obj-C é que você pode misturar e combinar várias bibliotecas para diferentes áreas de interesse. Em outras palavras, você não está preso com a implementação de um recurso em um quadro.

Eu uso essa abordagem em meus jogos ; usando Chipmunk para física 2D, Lua, como uma linguagem de script embutida, e uma implementação openGL ES da Apple. Eu escrevo a cola para amarrar tudo isso junto em uma linguagem C. O produto final que é a capacidade de definir objectos de jogo, criar instâncias deles, e eventos de pega à medida que interagem uns com os outros em funções C expostas a Lua. Esta abordagem é usada em muitos jogos de alta performance com muito sucesso.

Se você ainda não sabe C ++, eu definitivamente recomendo que você vá para a frente com uma linguagem de script. Fazendo um jogo do início ao fim tem um monte de motivação, e forçar-se a aprender uma nova língua, ao mesmo tempo é uma boa maneira de fazer as coisas vão devagar o suficiente para que você perder o interesse (embora seja uma boa maneira de aprender um novo linguagem ...).

A maioria das linguagens de script será compilado para código de byte de qualquer maneira, assim que seu hit maior desempenho será a coleta de lixo. Eu sou o suficiente para não experiente para dar uma descrição definida de quão grande é uma coleção hit lixo seria, mas eu estaria inclinado a pensar que não deve ser muito ruim em um pequeno jogo.

Além disso, se você usar uma biblioteca de linguagem de script existente para fazer o seu jogo, a maioria das áreas críticas de desempenho (como gráficos) pode ser escrito em C ++ de qualquer maneira (espero pelas bibliotecas do jogo). Assim, 80% da CPU pode realmente ser gasto em código C ++ de qualquer maneira, apesar do fato de que a maior parte do seu projeto é escrito em, digamos Python.

Eu diria que, pergunte-se o que você quer mais: Para escrever um jogo do início ao fim e aprender sobre o desenvolvimento do jogo, ou para aprender uma nova língua (C ++). Se você quer escrever um jogo, fazê-lo em uma linguagem de script. Se você quer aprender uma nova língua, fazê-lo em C ++.

Sim, a menos que você só quer saber todos os detalhes das coisas que entram em fazer um jogo, você definitivamente quer ir com um motor de jogo e se concentrar apenas na construção de sua lógica do jogo, em vez dos detalhes de gráficos, áudio, gestão de recursos, etc.

Pessoalmente, eu gostaria de recomendar a Torque Game Builder (aka Torque 2D) de GarageGames . Mas você provavelmente pode encontrar alguns motores de jogos gratuitos lá fora, que irá atender as suas necessidades também.

Eu tenho certeza jogos mais modernos são feitos em C ++, não C. (Cada empresa de jogos que eu já entrevistados com perguntas C ++.)
Por que não usar C ++ e bibliotecas existentes para o motor de física + colisões, som, gráficos etc. Você ainda escrever o jogo, mas as coisas mundanas é cuidado.

Há um monte de diferentes soluções para o problema de abstrair e cada um lida com isso de maneiras diferentes.

Meu atual usos do projeto C #, DirectX 9, HLSL e SlimDX. Cada uma delas oferece uma cuidadosamente calibrado nível de abstração. HLSL me permite realmente ler o código de shader Eu estou escrevendo e SlimDX / C # me permite ignorar ponteiros, dependências circulares e manipulação de código não gerenciado.

Dito isso, nenhuma dessas tecnologias tem qualquer impacto sobre a facilidade de desenvolver o meu AI, iluminação ou física! Eu ainda tenho que sair meus livros de uma forma que eu não iria com um quadro de nível superior.

Mesmo usando uma estrutura como XNA, se os conceitos de desenvolvimento a maioria dos jogos de vídeo são estranhos a você há um inferno de um lote ainda de absorver e aprender. XNA lhe permitirá bloqueio cardan ordenadamente sidestep, mas ai de quem não entender os conceitos básicos de sombreamento. Por outro lado, algo como DarkBASIC não vai resolver o seu problema de bloqueio cardan, mas sombreamento é principalmente feita para você.

É uma suficientemente grande campo que o seu primeiro motor nunca vai ser o que você realmente usar. Se você escrever isso mesmo, você não vai escrever bem o suficiente. Se você usar bibliotecas de terceiros, há certamente aspectos que incomodam você e você vai querer substituir.

Como uma idéia, pode valer a pena tomar várias bibliotecas / quadros (definitivamente fazer XNA um de seus paradas, mesmo se você decidir que não quer usá-lo, é um grande ponto de referência) e tentar construir vários protótipos. Talvez uma paisagem (com um corpo de água) ou uma demonstração física espacial.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top