Como são criados os jogos para diferentes plataformas?

9

Como são criados os jogos para diferentes plataformas?

Por exemplo, Call of Duty: Modern Warfare 3 está disponível no PS3, Xbox 360, Wii e PC.

Eles são completamente reprogramados sem código comum? Existe algum código intermediário?

Adriano Silva
fonte
3
Geralmente, tudo é feito em C ++ e o material específico da plataforma é relegado para algumas classes.
ashes999

Respostas:

11

A maioria dos mecanismos de jogos no nível de produção possui o que é conhecido como Camada de Abstração de Hardware. Essa é uma API genérica que o mecanismo de jogo pode usar para conversar com o hardware sem precisar saber qual é o hardware. Eles apenas chamam SoundManager.PlaySFX (SFX_ID) ou algo parecido. No gerenciador de som, porém, ele saberá em qual hardware está realmente trabalhando e fará as chamadas apropriadas para que o efeito sonoro seja reproduzido.

Isso permite que o mecanismo seja desenvolvido usando essa camada de abstração para que possa ser executado em qualquer sistema, desde que uma API seja fornecida para o hardware que corresponde à abstração. EDIT: Conforme observado por Johnathan, é necessária uma API para cada plataforma na qual você deseja executar. E ao ponto de Trevor, ao passar de um sistema de memória alta para uma memória baixa (o pior para mim era o PS3 para o PSP), talvez você precise resolver as diferentes limitações de hardware. Felizmente para mim não tive que reescrever um sistema inteiro por causa de uma plataforma, mas tive que passar e otimizar objetos para ocupar menos espaço.

O outro lado das coisas está na área da arte, onde as resoluções de texturas ou modelos e similares são diferentes. Os recursos do jogo podem ser construídos para um alvo específico, para que um PC obtenha seus arquivos wav por seus efeitos sonoros, enquanto eles se transformam nos formatos específicos que o PS3 suporta e similares.

Espero que isto ajude.

James
fonte
11
Acrescentarei a isso que, na maioria dos casos, o PC / PS3 / Xbox360 compartilhará uma base de código comum, enquanto o Wii / PS2 / PSP compartilhará uma base de código diferente. O Gameboy terá uma base de código separada por si só, e o iPhone / Android geralmente compartilhará uma base de código. Isso ocorre principalmente devido aos amplos níveis de poder de processamento, memória disponível e às faculdades gráficas das várias plataformas. Uma vez tive que portar um jogo do Xbox 360 para o PS2; muito pouco do código original sobreviveu ao processo, apenas porque supunha que havia muita memória RAM disponível para uso; Eu tive que reescrevê-lo para usar menos memória.
Trevor Powell
+1, você não mencionou explicitamente que o HAL é diferente entre as plataformas (o motivo pelo qual a Psykocyber também respondeu) - talvez adicione que você precisa de um HAL para cada plataforma? Além disso, o uso do ANSI C / ++ provavelmente é um requisito, pois você precisa compilá-lo.
Jonathan Dickinson
Trevor: Gameboy? Droga, eu devia ter viajado para o passado, melhor voltar para a minha máquina do tempo ...
3

As outras respostas explicam as coisas nos casos ideais. A maioria dos códigos é comum para jogos, e uma camada de abstração limpa é usada para partes dependentes de hardware / plataforma.

No entanto, muitos jogos têm portas feitas por uma empresa terceirizada e o código diverge significativamente. Isso é especialmente verdade nos consoles, mas também é comum nas portas para Windows ou OSX ou Linux.

Nos consoles, o hardware é diferente o suficiente para que muitas vezes partes inteiras da renderização principal (e raramente também outros sistemas) sejam reescritas completamente. No PC, você pode projetar um resumo sobre D3D e OpenGL, pois as APIs do SO diferem, mas todo o hardware do PC é aproximadamente o mesmo.

No espaço do console, você pode achar que seu mecanismo de renderização deslumbrante e super eficiente é totalmente impossível de transportar diretamente para um console diferente, pois os recursos da GPU são tão diferentes e você literalmente precisa espremer toda a última porcentagem de desempenho para obter 7 anos hardware antigo para executar seu jogo moderno. Você pode encontrar facilmente casos em que as senhas de iluminação que funcionam melhor no XBox são terrivelmente lentas no PS3 e onde a melhor abordagem para os cães PS3 no XBox. As outras diferenças de hardware e plataforma (por exemplo, as SPUs no PS3 versus a CPU de três núcleos do XBox) tornam muito difícil confiar em uma camada simples de abstração de hardware simples como seu único caminho de código dependente da plataforma.

Como cada plataforma também requer uma quantidade extensa de conhecimentos para utilizá-la adequadamente, muitos jogos exigem uma empresa de transporte terceirizada especializada para levar o jogo a plataformas adicionais. Às vezes, no espaço do PC, você pode encontrar desenvolvedores individuais que executam as portas (como Ryan "icculus" Gordon, que faz muitas portas de jogos no Linux; normalmente, normalmente, mudam D3D para GL e Win32 para POSIX / SDL), enquanto estão no espaço do console existem empresas com todas as equipes para fazer um trabalho de portabilidade bastante massivo para jogos maiores.

As portas de algumas plataformas exigem reescritas quase completas ou reprojetos de ativos. Os portos Wii do Call of Duty, por exemplo, foram feitos por uma empresa terceirizada e tudo - incluindo os ativos de arte - teve que ser refeito para se ajustar às restrições do hardware muito limitado do Wii. O Wii nem tem shaders, por exemplo, então simplesmente reutilizar o mesmo mecanismo e efeitos / materiais era totalmente impossível, e a memória limitada e a CPU / GPU exigiam texturas menores e modelos com menos detalhes, além de limitações de jogabilidade e assim por diante. As portas para plataformas móveis também são geralmente totalmente reescritas, geralmente por terceiros.

Mecanismos mais recentes facilitam a portabilidade entre plataformas, mas jogos maiores ainda precisam atualizar partes consideráveis ​​de seu código e refazer muitos ativos para mudar de plataformas e consoles de PC mais capazes para plataformas mais restritas.

Sean Middleditch
fonte
2

A resposta de James refere-se apenas ao PC e não à implementação nas plataformas específicas.
Enquanto todos os mecanismos abstraem a plataforma para a grande maioria do código do jogo, algumas partes precisam ser escritas por plataforma. Isso inclui todas as E / S, incluindo rede, renderização, áudio, entrada de dispositivo e, acho, saída de vídeo.
Compare o código de renderização para dizer Unreal no Xbox e PS3. O Xbox usa a versão Xbox DirectX, enquanto o PS3 usa libgcm (a biblioteca OpenGl é muito lenta). Para simplificar um pouco, em todas as plataformas, os programadores de jogabilidade veem apenas um "AudioSystem.PlaySound ( SoundName aqui ), enquanto que para cada plataforma que eles funcionam internamente chamaria a API de plataformas para saída de som.
Veja também o comentário do Tatrad para obter mais programação.

Peter Ølsted
fonte
11
Isso é exatamente o que James disse, mas deixou de mencionar que o HAL é diferente para cada plataforma.
Jonathan Dickinson
Na verdade, mencionei que ele será executado em qualquer sistema que uma API HAL seja fornecida, mas deixei mais claro, pois isso claramente estava causando confusão. Além disso, você não porta o código do PC para outro PC, a menos que esteja passando pelo SO como em um sistema Mac ou Unix. Para ambientes Windows, onde a maioria dos jogos roda, são os drivers de hardware que já lidam com isso, você cria um buffer de dados DirectX ou OpenGL por meio das chamadas de driver e o hardware sabe o que fazer a partir daí.
James