As ferramentas do pipeline de conteúdo devem ser incorporadas ao mecanismo?

10

Quão mínimo deve ser um mecanismo de jogos? Quanto do pipeline de conteúdo deve ser incorporado ao mecanismo?

Alguns casos de uso em que o super mecanismo pode ser útil:

  • Ao carregar o conteúdo do usuário, o usuário não é obrigado a empacotar suas texturas, o mecanismo fará isso no tempo de carregamento.

  • Um script solicita uma fonte com um tamanho muito maior do que o pré-gerado; o mecanismo pode analisar o arquivo ttf e criar um novo atlas de textura.

  • Forja de Halo .

Nada disso é gratuito, é claro. Isso requer que suas ferramentas de pipeline de conteúdo sejam escritas em C ++. As bibliotecas de suporte usadas no pipeline precisam ser compiladas para uso no dispositivo. Requer que a geração de conteúdo não seja com erros. E isso geralmente torna o seu motor maior e pesado.
Quais são alguns outros prós e contras?
Os profissionais superam os contras?

Algumas perguntas específicas:

  • O mecanismo deve ser capaz de carregar vários formatos de imagem? Um carregador somente TGA é muito fácil de manusear código.

  • E quanto aos formatos de áudio? É possível suportar apenas o carregamento de arquivos wav? E os arquivos de música ambiente, que geralmente são enormes.

  • O mecanismo deve ser capaz de análise TTF dinâmica e geração de atlas?

  • Embalagem de textura.

deft_code
fonte

Respostas:

11

O blog Games from Within de Noel Llopis abordou isso recentemente no post "Remote Game Editing" . O parágrafo inicial:

Sou fã de tempos de execução mínimos do jogo. Tudo o que pode ser feito offline ou em uma ferramenta separada, deve ficar fora do tempo de execução. Isso deixa a arquitetura e o código do jogo muito simples e enxuto .

(O artigo é uma leitura altamente recomendada, como na maioria das coisas de Noel, se você concorda 100% ou não.)

Acredito que a chave aqui é manter a complexidade fora do mecanismo. Você ainda pode ter flexibilidade, mas é flexibilidade no pipeline de conteúdo. E você obtém melhor desempenho ao não gastar tempo convertendo e movendo dados.

Estranhamente, um melhor desempenho pode se traduzir em menor tempo de iteração, apesar de perder algumas das habilidades de edição no mecanismo: é mais fácil tentar algo se você puder carregar o jogo em um segundo.

A adoção de alguns dos princípios da " filosofia unix " ajudará você a manter sua cadeia de ferramentas flexível: um pequeno pipeline modular.

Minha filosofia pessoal: coloque o máximo de dados possível offline, mas forneça suporte ao mecanismo para receber novos dados armazenados a qualquer momento. (Observe que esses novos dados não precisam ser reproduzidos até um ponto conveniente: o botão "atualizar" é pressionado, o próximo nível começa, você faz a transição para uma nova área, qualquer que seja. A chave é encontrar o ponto ideal que minimiza tempo de iteração com complexidade mínima de código e esforço de codificação.)

Na nossa empresa, a maioria das nossas ferramentas voltadas para artistas / designers está focada em questões de interface do usuário: facilidade de manipulação de ativos únicos ou lotes deles, etc. Às vezes, são apenas ferramentas de terceiros, como Photoshop ou 3DS Max. Essas ferramentas são exportadas para um formato intermediário (geralmente xml que referencia dados binários de origem, mas nem sempre). O formato intermediário é escolhido por uma ferramenta de "criação de dados" de back-end, que o transforma em algo útil e de carregamento rápido para a plataforma de destino.

A portabilidade é alcançada adicionando ferramentas adicionais de criação de dados de back-end ou expandindo as ferramentas existentes de criação de dados de back-end, o que tem a vantagem adicional de ser invisível para os criadores de conteúdo.

Agora, com a criação de dados incrementais adequados, é possível alterar o formato inicial em segundos; seu mecanismo pode funcionar, ou uma ferramenta pode funcionar, e eles aparecerão no sistema de recursos, prontos para recarregar quando for conveniente.

As ferramentas - especialmente os dados de back-end tornam as ferramentas - geralmente são mais desajeitadas e complicadas do que o código do mecanismo. Tudo bem, porque é mais fácil refatorar / reescrever, estender e testar; você tem especificações para o comportamento delas e é bastante fácil testá-las unitariamente em comparação com algum código do mecanismo.

Minhas opiniões sobre suas perguntas:

O mecanismo deve ser capaz de carregar vários formatos de imagem? Um carregador somente TGA é muito fácil de manusear código.

(Além disso: mesmo se você usar um decodificador TGA no mecanismo, não o codifique manualmente. Você está apenas pedindo problemas - existem muitas sutilezas com a maioria dos formatos de imagem e muitas ferramentas que não aderem exatamente no formato provavelmente subespecificado. É melhor encontrar o código da biblioteca existente e bem testado para o processamento de imagens.)

Gostaria que a ferramenta aqui fosse convertida do TGA para qualquer formato interno de textura, além de metadados.

E quanto aos formatos de áudio? É possível suportar apenas o carregamento de arquivos wav? E os arquivos de música ambiente, que geralmente são enormes.

Aqui usamos três formatos: música rastreada (.xm), ADPCM (.wav) e Speex (.spx). Isso ocorre principalmente porque estamos no computador de mão e esses formatos são muito leves para decodificar.

O mecanismo deve ser capaz de análise TTF dinâmica e geração de atlas? Embalagem de textura.

Atlasing é um problema difícil: veja as respostas de suas perguntas recentes . Quase sempre vale a pena fazer offline.

Além disso, você pode transformar os metadados por caractere em uma estrutura de código de carregamento quase zero.

Para finalizar, você pode limpar e empacotar esse pipeline com o seu jogo, para a comunidade de mods. Você sempre pode adicionar mais formatos de origem. E não há nada que o impeça de preencher a lacuna entre as ferramentas de criação de conteúdo e o mecanismo em casos específicos; esperamos que seu código de processamento de dados e código de transferência / aranha possam ser refatorados em bibliotecas que possam eventualmente ser usadas diretamente pelas ferramentas de criação de conteúdo em alguns casos. Mas eu não faria esse meu primeiro objetivo, necessariamente ... Apenas esteja ciente de que será um objetivo eventual e deixe que isso influencie um pouco o seu design, e escolha primeiro os frutos mais baixos.


Como uma atualização, você pode considerar o uso do Formato de arquivo KTX para texturas. Ele tem a vantagem de ser principalmente "lido structe usado" para a maioria dos casos de GL (e, pelos seus comentários, parece que você estava mirando no GL), embora ainda seja flexível e bem definido.

A sobrecarga do cabeçalho KTX pode ser um pouco alta para dados totalmente integrados, dependendo do seu destino, e você pode querer renunciar ao suporte de troca endian, dependendo do seu caso de uso ... mas é definitivamente pelo menos valioso para considerações de design.

leander
fonte
Ótimas coisas, obrigado. Eu nunca tinha pensado em construir meu próprio formato de imagem fácil de carregar. Existe uma biblioteca de carregamento de textura mínima já construída. Então, novamente, é basicamente um fluxo de bytes com largura, altura e codificação (por exemplo, GL_RGB555).
Deft_code 21/08/10
1
Não crie seu próprio formato de imagem, mas coloque-a no formato exato que o DirectX, GL ou o que você estiver usando deseja. =) No que diz respeito às bibliotecas: há uma tonelada por aí. Para ferramentas, costumo usar apenas o material da biblioteca ImageMagick ( imagemagick.org/script/index.php ) ou até mesmo os programas ... O código ImageMagick é antigo e um pouco feio, mas rápido, flexível e rodoviário -testado. Tenho certeza que outros terão muitas outras sugestões; se você estiver usando, por exemplo, C # para sua cadeia de ferramentas, muitas dessas coisas já serão incorporadas às bibliotecas do .NET ... #
Leander
1
"Tenho certeza que outros terão muitas outras sugestões" MFC! :) Ou talvez OpenIL. Acho que um dos pontos importantes sobre a criação de ativos em formatos específicos de plataforma é que, à medida que você adiciona mais formatos de origem e mais plataformas, o número de combinações explodirá. Converter os ativos de origem em um formato intermediário e depois convertê-los em formatos específicos da plataforma reduzirá o número de rotas de conversão. Adicione outro formato de fonte, basta escrever um conversor no formato intermediário. Adicione outra plataforma, adicione um padeiro ao formato de destino dessa plataforma.
Chris Howe
1
Eu acrescentaria que manter a complexidade fora do mecanismo não significa necessariamente que a funcionalidade não esteja disponível para o mecanismo. Mantê-lo separado, porém, para que ele seja facilmente separado do mecanismo, é fundamental. Não posso enfatizar o suficiente como é útil suportar o carregamento a quente de ativos, ou seja, recarregar as coisas rapidamente. Isso também pode trazer muita complexidade ao seu sistema, portanto, você deve garantir que ele seja construído de tal maneira que o jogo não precise se preocupar com a origem dos ativos.
traço-tom-bang
3

Suas perguntas parecem muito subjetivas e dependem muito de quem é seu público-alvo.

Vamos responder à sua pergunta de análise de fonte / ttf. Se você está pensando em modders adicionando sua própria fonte, provavelmente você quer fazer o processo de importação o menor número possível de etapas. Se você estiver adicionando muitas fontes / tamanhos de fonte ao jogo internamente, talvez queira uma ferramenta um pouco sofisticada que um artista possa usar com um pouco de treinamento. Se você fará isso uma vez internamente, o tempo que você gasta criando um importador adequado provavelmente será menor do que o tempo necessário para escrever ferramentas para os casos anteriores.

É realmente uma questão de escala com todo o resto. As ferramentas incorporadas valem o esforço quando você faz algo várias vezes e deseja reduzir a complexidade / erros resultantes disso. Cada qualificador adicional que você adicionar (por exemplo, texturas TGA apenas em vez de importar, digamos, PSDs) resulta em mais tempo gasto pelo usuário final.

Lembre-se de que as ferramentas de conteúdo são geralmente usadas pelos menos inclinados tecnicamente (leia-se: artistas). Pessoalmente, gosto muito da maneira como o Unity funciona, onde você pode simplesmente arrastar um arquivo de origem (psd, 3ds, ttf, mp3, jpg, mov, o que for) e o converterá automaticamente em seu formato interno. O formato interno está oculto na maior parte do usuário final. Ele também será convertido automaticamente quando detectar a alteração do arquivo de origem. Mas isso dá muito trabalho.

Tetrad
fonte