Por que é ruim codificar o conteúdo?


41

Eu sei que a maioria dos jogos armazena texto de diálogo em arquivos, mas também vi alguns jogos baseados em texto na verdade programando o conteúdo (mapa, escolhas, possíveis comandos do jogador, texto da história) no código do jogo.

Posso pensar em algumas razões, mas qual é a principal razão pela qual até jogos de texto mantêm tudo em arquivos fora do programa?

Os detalhes da implementação diferem pouco entre manter o conteúdo em algo como o popular formato XML, analisá-lo e renderizar mapas / exibição de texto com base nas variáveis ​​criadas a partir do arquivo XML, e simplesmente renunciar completamente ao arquivo XML. Ambos terminam com strings que são exibidas na tela. A diferença não é apenas notação?

Alguns jogos mantêm os gráficos (arte ASCII?) Dentro do código. Sei que isso não está certo e posso adivinhar alguns motivos pelos quais isso é ruim, mas também não sei o principal motivo.

É muito popular ter a maior parte do conteúdo fora do programa. Mesmo o Dwarf Fortress não usa caracteres ASCII reais, mas imagens de caracteres ASCII carregadas na memória.

Peço principalmente porque é um pouco PITA criar, analisar e trabalhar com arquivos XML. Você sabe ... comparado com a alternativa preguiçosa de apenas fazer de cada masmorra (conteúdo) sua própria classe.


9
Os jogos baseados em texto codificam muito conteúdo, mas acho que é apenas por causa do momento em que eles foram desenvolvidos e de más escolhas de design. O mesmo pode se aplicar à Fortaleza dos Anões. Pessoalmente, peguei todos os meus jogos baseados em texto e movi o conteúdo para fora da fonte e para um banco de dados. Isso tornou minha vida muito mais fácil.
Glen Swan

7
O i18n seria muito difícil de ser feito com o conteúdo incorporado na fonte.
pllee

5
Não tenho tanta certeza de que isso seja específico para o desenvolvimento de jogos. No futuro, considere perguntar aos programadores SE ou Stackoverflow.
MichaelHouse

13
just making every unique dungeon (content) its own class.Isso só me fez tremer. A separação de dados da lógica é um princípio tão fundamental para mim que estou surpreso por ainda haver desenvolvedores violando-os.
Lilienthal

4
Qualquer que seja a sua decisão, saiba que o conteúdo codificado permite casos muito mais especiais. Quer que um certo chefe apareça apenas entre meia-noite e 7h (em tempo real)? É muito mais fácil codificar isso do que criar uma maneira genérica de os monstros aparecerem apenas em determinados momentos.
usar o seguinte comando

Respostas:


85

Há várias razões para isso. Eu só vou tocar em alguns:

  1. Isso torna seu código-fonte uma bagunça. Se você tem muitas caixas de diálogo (árvores), grande parte da sua base de código é apenas um texto que não tem nada a ver com o código do jogo.
  2. Você precisaria recompilar toda vez que mudar tanto quanto um único personagem.
  3. A caixa de diálogo em si é difícil de navegar. Eu imagino que tentar implementar uma árvore de diálogo inteira, muito menos várias, completamente dentro da sua fonte resultará em uma bagunça aninhada de espaguete e ifs, switches e assim por diante. O que resulta em código propenso a erros, difícil de ler e mais difícil de depurar.
  4. Se você deseja permitir que as pessoas modifiquem ou expandam seu jogo, é muito mais fácil se elas não precisarem lidar com o código-fonte para mudar alguma coisa.
  5. O ponto acima é ainda mais importante se você trabalha em equipe. Você não quer que seu escritor tenha que mexer com o código apenas para entrar em um pedaço de diálogo.
  6. É muito fácil analisar XML ou outros formatos de arquivo padrão se você usar bibliotecas existentes; portanto, o custo de implementá-lo dessa maneira é muito baixo, oferecendo muitas vantagens e evitando os problemas mencionados acima e muito mais.
  7. Como o @MiloPrice apontou abaixo, também é muito mais fácil localizar o jogo se o seu texto estiver em arquivos externos. Você pode adicionar um idioma adicionando um arquivo. Sua equipe pode cuidar da tradução sem precisar tocar na fonte (o que é especialmente importante se você permitir que as pessoas traduzam que não deveriam ver todo o seu código - pense em freelancers, pessoas da comunidade que não pertence à sua equipe etc).

10
Eu não diria que isso tornaria seu código uma bagunça. Caso contrário, conteúdo ou não, qualquer coisa pode ser considerada uma bagunça em massa. Você pode estruturar o conteúdo em uma boa estrutura, assim como o código. Mas, o restante dos pontos ainda permanece forte.
Glen Swan

28
A facilidade de localização / tradução é outro grande benefício.
Milo P

2
@ Christian: Você pode ter um programa orientado a dados em que os dados são incorporados no programa em um formato em que são diretamente utilizáveis ​​no local (por exemplo, em C ou C ++, grandes, esperançosamente, constmatrizes com duração de armazenamento estático). Isso economiza todo o código e o custo da memória de tempo de execução para carregar / converter uma representação de dados externa em tempo de execução. É claro que todos os outros motivos para manter os dados externos ainda se aplicam.
R ..

2
Pessoalmente, sou a favor de uma abordagem ainda mais forte pelos mesmos motivos enumerados aqui: Mova a maior parte do seu código para uma linguagem de script também. Crie um núcleo em C / C ++, incorpore uma linguagem como Python ou Lua e exporte uma API para ele. Don't Starvesegue essa abordagem e é um dos jogos mais bem escritos que eu já vi. Vários outros jogos no passado e no presente também fazem isso, assim como aplicativos (e raramente utilitários). Eu diria que, em geral, fora de pequenos projetos e minúsculos serviços públicos, camadas e separações pesadas são sempre seus amigos.
precisa saber é o seguinte


30

Colocar os dados do conteúdo do jogo no código significa que, para ver qualquer alteração ou iteração em potencial desses dados, é necessário recompilar o próprio jogo. Isso é ruim por dois motivos:

  • Muitos idiomas nos quais os jogos são escritos têm tempos de compilação longos. O C ++ é particular e pode ser muito ruim nesse aspecto, e o C ++ é uma linguagem muito comum para grandes jogos comerciais. É menos um problema com linguagens como C # e Java, mas ainda não é tão rápido quanto poder armazenar dados do jogo em arquivos externos que podem ser recarregados a quente enquanto o jogo está em execução para ver as alterações.

  • Muitos jogos são desenvolvidos por equipes que geralmente consistem em desenvolvedores não técnicos (designers e artistas) que produzem conteúdo. Não apenas as pessoas não técnicas não querem ter que recompilar o jogo ou lidar com "ferramentas complicadas de programador" para iterar seu conteúdo, também pode ser desejável minimizar a exposição do código-fonte somente aos programadores (porque menos pessoas que tenha acesso ao código-fonte, menos pessoas poderão vazá-lo (acidentalmente ou não).

Acho que você está superestimando a complexidade de carregar dados de arquivos de texto ou XML. Na maioria das vezes, você deve usar uma biblioteca para fazer isso, o que facilita muito o processo de análise do XML / JSON /. Sim, há um pouco de custo inicial para escrever um sistema de carregamento de nível baseado em dados, mas isso geralmente poupa muito tempo a longo prazo, contra toneladas de classes únicas para representar cada nível.

Jogos menores ou mais simples podem não ter muito a ganhar com o investimento a longo prazo de uma abordagem orientada a dados, portanto, a menos que os desenvolvedores estejam usando estruturas / mecanismos existentes que o suportam, pode ser mais eficiente para eles simplesmente codificar os dados em o código do jogo.

É claro que existem várias razões pelas quais um determinado jogo pode optar por colocar seus dados em arquivos externos (ou não); não é possível listar todos eles. Em algum nível, eles geralmente se resumem à velocidade ou flexibilidade adicional da iteração que o não ter que reconstruir o jogo pode oferecer.


Eu não acho que os tempos de compilação sejam realmente importantes, mas como desenvolvedor, sempre nos esforçamos por "código puro" ... essa é uma boa razão para separar as coisas por si só ... o conteúdo deve ser conteúdo, não código!
Guerra

4
Os tempos de compilação @ardard são realmente importantes em C ++. Trabalhei com soluções que levaram mais de 15 minutos para serem construídas, devido ao tamanho do projeto, uso agressivo de modelos ou até preguiça do desenvolvedor (incluindo cabeçalhos desnecessários). E tenho certeza de que esse é o caso de grandes jogos comerciais.
concept3d

1
@ concept3d: gostaria que meu projeto tivesse 15 minutos. Uma compilação limpa em um servidor de compilação dedicado leva aproximadamente 50 minutos.
Mooing Duck

quanto menos pessoas tiverem acesso ao código fonte, menos pessoas sofrerão danos cerebrais que o C ++ causa. : P
Sarge Borsch

Eu acho que algumas pessoas podem estar perdendo o objetivo de recarregar a quente - ninguém se importa se leva 30 segundos para recompilar o jogo, os artistas não querem reiniciar o jogo, querem um atalho de teclado, para que possam testar diferentes animações e texturas em tempo real. De fato, essa é uma das coisas que eles mais desejam. Ver como as coisas ficam fora do jogo é uma coisa, mas vê-las no jogo é o que conta.
Lobo

7

Como sempre, como sempre, depende. Mas primeiro, eu gostaria de argumentar que a codificação rígida não é ruim por si só.

Eu tenho conteúdo codificado, especificamente texto de diálogo, em alguns jogos simples, e o mundo não acabou. Nós programadores adoramos abstrair coisas, mas lembre-se de que cada camada de abstração que você faz tornará seu programa mais complexo e mais difícil de entender.

Se o seu jogo é simples o suficiente para que você possa codificar algum conteúdo nele, eu certamente o consideraria por uma questão de simplicidade.

Isso, no entanto, não escala muito. Certamente, o motivo mais comum para colocar conteúdo em recursos externos é simplificar o trabalho em equipe, pois uma pessoa ou equipe pode se concentrar em escrever o jogo, enquanto outra pode se concentrar em criar e polir o conteúdo.

No entanto, traçar a linha entre o programa e o conteúdo nem sempre é realmente trivial. Pode-se dizer que as texturas são 100% de conteúdo; mas e as texturas geradas proceduralmente? O texto da caixa de diálogo pode ser considerado 100% de conteúdo; mas e quando a caixa de diálogo muda dependendo das ações anteriores? Outros elementos que se considere 100% parte do programa, como scripts ou shaders, também podem ser considerados parte do conteúdo do jogo. Eles devem ser codificados? eles devem ser carregados como um recurso externo?

Lembre-se, porém, que cada tipo de conteúdo que você suporta no seu jogo deve ter um código de carregamento e interpretação relacionado a ele; portanto, em geral, em caso de dúvida, recomendo a codificação do conteúdo e o leve a um recurso externo quando você realmente precisa dessa flexibilidade (não quando você acha que precisa, mas quando realmente precisa)

Por fim, uma vantagem de armazenar dados em arquivos de recursos é que você pode carregá-los somente quando precisar deles (portanto, possivelmente acelerar o tempo de carregamento do jogo) e descarregá-los quando não precisar mais deles (permitindo que você tenha mais conteúdo pode caber na memória). (O canto dos nitpickers: as DLLs de recursos podem ser consideradas recursos externos)


7
"mas lembre-se de que cada camada de abstração feita tornará seu programa mais complexo e mais difícil de entender." Eu teria que discordar, a abstração pode tornar um programa mais simples e certamente deve facilitar a compreensão.
NPSF3000

1
@ NPSF3000 abstrações irá adicionar complexidade, mas pode remover mais complexidade do que adicionar.
user253751

2
@immibis, portanto, a soma total da complexidade de um projeto após a implementação de uma abstração deve ser menor do que antes.
NPSF3000

3
@ NPSF3000: Meu argumento é que você não deve criar abstrações apenas porque pode. Às vezes, os dados codificados são mais simples, mais compreensíveis e mais fáceis. Na maioria das vezes, eu vi jogos seguirem o caminho do softcoding , o que acho lamentável. Lembre-se também de que adicionar abstrações é sempre mais fácil do que removê-las, por isso sou um defensor firme da adição de abstrações somente quando você precisar delas.
Panda Pajama

O @PandaPajama que faz algo 'apenas porque você pode' provavelmente causa um problema, independentemente do que seja. Isso não significa que algo seja inerentemente complexo, que era meu ponto de preocupação. Além disso, o que faz você pensar que adicionar abstrações é mais fácil do que removê-las? Penso de outra maneira - adicionar uma abstração tardiamente pode significar uma refatoração significativa, mas não consigo pensar imediatamente em um caso em que a remoção de uma abstração desnecessária seja complexa. Mudar de XML para strings codificadas deve ser trivial.
NPSF3000

3

Um grande motivo para armazenar arquivos de texto é a reutilização. A criação de uma estrutura de jogo de texto que lê seus mapas, caixas de diálogo e outros recursos de um arquivo de texto permite reutilizar sua estrutura para outros jogos. Indo além dos jogos de texto, é assim que grandes títulos do orçamento, como Call of Duty, lançam um novo jogo a cada ano.

Outro motivo é a portabilidade. Você pode usar os mesmos arquivos para web, pc, Mac, Android, etc. Tudo o que você precisa fazer é simular sua estrutura para essas diferentes plataformas, e a maior parte dos dados do jogo é intocada.

Ao ir além dos jogos baseados em texto, os scripts e os dados armazenados em arquivos diminuirão o tempo de recompilação e permitirão que você crie uma interface para manipular os dados com mais facilidade.


1
Obviamente, ter a maioria das coisas reutilizáveis ​​tende a forçá-lo a evitar fazer algo "especial", fora das regras que você já possui. Definitivamente, não estou defendendo grandes jogos codificados, mas é extremamente útil quando você cria protótipos ou escreve jogos experimentais - oferece muito mais flexibilidade. Ele vem com um preço, é claro, então geralmente é uma boa idéia refatorar tudo assim que a jogabilidade realmente funcionar. A jogabilidade é a parte mais difícil - certifique-se de testá-lo sem mergulhar no inferno arquitetônico: D Geralmente, é mais fácil encontrar a forma geral depois de obter os concretos.
Luaan

3

Para acelerar as mudanças, acelera o desenvolvimento de grandes produções em toneladas.

Você não precisa ensinar todos a aprender como entrar e editar a fonte para fazer alterações simples. Ao arrastá-lo para fora do código real, mais pessoas têm a chance de brincar, é mais fácil descobrir com quais opções você pode brincar e todo o processo de ajustar várias partes do seu jogo leva muito menos tempo. Até as perguntas e respostas podem ajudar com isso.


3

Não acredito que ninguém tenha mencionado isso ainda, mas um grande motivo é facilitar muito a localização. Se você precisar oferecer suporte a inglês, francês, alemão, espanhol, português, italiano, russo, chinês e qualquer outro idioma para o qual você esteja buscando, o código codificado exigirá que você tenha um code-behind separado para cada idioma. Isso também significa que, se você precisar remover determinado conteúdo (leia-se: censura), precisará alterar seu próprio código para evitá-lo, em vez de dizer "apenas substitua esse minijogo de análise anal por um banner passivo-agressivo que explica graficamente o que está acontecendo" " Também é um pouco hostil para os consumidores, pois é provável que eles precisem reiniciar o jogo para alterar o idioma, pois você precisa carregar outras bibliotecas. Finalmente,

Por outro lado, se você estiver usando recursos externos, oferecer suporte a idiomas diferentes significa apenas carregar um arquivo de recurso diferente. Isso pode ser feito facilmente enquanto o jogo está rodando. significa que você pode ter uma única base de código, simplificando bastante o desenvolvimento. E também significa que você pode adicionar facilmente suporte pós-lançamento para outros idiomas. Por fim, significa que você pode deixar o usuário optar por não instalar determinados idiomas (um recurso que não acontece com tanta frequência nos jogos, mas que ainda é possível) para economizar espaço em disco e largura de banda.


3

Eu acho que uma frase-chave é separação de preocupações .

Se o seu código não incluir o texto, o código será menos complexo. O programador que está escrevendo o código não precisa pensar no texto específico e pode se concentrar no código.

Ele não precisa pensar em localização. A pessoa que está localizando não precisa se preocupar com o código.


3

Eu acho que é muito fácil ser o cara 'murcho do que branco' e recomendar calorosamente o uso de um arquivo de recurso de texto externo.

Por quê? Porque aqui há uma opção: equilibrar o custo / problemas / vantagens de cada solução.

Ao usar um arquivo externo ... Bem, acho que as outras respostas explicam os benefícios suficientemente bem. Mas e os custos? Você precisa definir um formalismo válido, criar um intérprete, concordar com um formato de arquivo e, pior ainda ... criar outro aplicativo - um editor -. O que representa um problema de 0,00% se você for membro de uma equipe de 50 programadores que está construindo um grande projeto. Mas se você estiver sozinho: você está parado.

Novamente, não subestimo os enormes benefícios de flexibilidade de um recurso externo: a programação orientada a dados me parece o caminho a seguir para os videogames. Mas não vamos esquecer o custo.

Por outro lado, fazer com que o texto contido no código permita uma prototipagem rápida, portanto, ele deve ser preferido pela primeira vez. Então, meu conselho seria, conforme o projeto amadurecesse, analisar o tipo de dados necessários para modelar os diálogos (humor / histórico-estado / ...). Então, em algum momento, você decide algumas classes / regras / formato de arquivo e segue em frente, permitindo que outras pessoas editem / separem o código do conteúdo e assim por diante. OU para um jogo com diálogos simples (Mario ...), você considera o custo muito alto e mantém as poucas seqüências / comportamentos codificados.
Sua chamada.

(Observação sobre localização: a apenas uma tabela de hash, portanto, é uma questão independente e facilmente solucionável.)


Algumas dessas coisas ainda são verdadeiras se você inserir o texto no código. Você ainda precisa de um determinado formato, uma maneira de navegar na árvore e assim por diante. Com isso em mente, qualquer custo adicional para implementar uma fonte de conteúdo externa parece relativamente baixo, especialmente porque existem bibliotecas e editores maduros para analisar, gravar, editar e criar esses arquivos. Dependendo da complexidade de suas caixas de diálogo, você pode até ficar sem um editor especializado e apenas usar um editor de texto padrão.
Christian

1
Claro: talvez eu não tenha sido claro o suficiente, quero dizer que é só depois de algumas iterações que você sabe qual é o formato de seus diálogos (de uma linha reta a uma árvore complexa ou máquina de estado). Nos primeiros passos, algumas (mais fáceis) ifs + algumas strings codificadas estão ok. Então, quando você puder claramente prever suas necessidades, faça uma escolha, depois de avaliar os custos / benefícios de cada solução.
GameAlchemist

Um meio termo que estou usando no meu projeto de jogo one-man atual é ter conteúdo codificado que é gerado a partir de arquivos analisados ​​antes do tempo de compilação. Em muitos casos, essa seria uma solução do pior dos dois mundos, mas para o que eu preciso é realmente muito boa.
glenatron

2

Eu acho que o licenciamento também pode ser um motivo para não incluir conteúdo no código.

Por exemplo,

  • seu código pode ser FLOSS , mas você não deseja licenciar seu conteúdo (talvez você queira publicar seu código de jogo para que outros possam usá-lo para criar jogos semelhantes com conteúdo diferente)
  • seu código pode ser FLOSS, mas você deseja usar uma licença Creative Commons para seu conteúdo (como licenças de software não funcionam muito bem para conteúdo e vice-versa)
  • seu código pode ser proprietário , mas você está reutilizando conteúdo gratuito
  • seu código pode ser proprietário, mas você deseja publicar seu próprio conteúdo sob uma licença gratuita / gratuita
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.