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?
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?
Respostas:
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.
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.
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.