Para a maioria das plataformas, você pode escrever subsistemas que abstraem das APIs específicas usadas para chamar e recuperar informações da plataforma em que você está executando. As APIs de E / S são geralmente as mais fáceis de abstrair - todos os sistemas de arquivos funcionam com algumas suposições bastante básicas sobre abertura, fechamento e leitura de arquivos, mesmo quando você considera as chamadas assíncronas. Então você tem seus sistemas principais, como ler a entrada do controlador, consultar a hora, acessar a memória e as primitivas de encadeamento, a maioria das quais funciona da mesma maneira.
Até os gráficos podem ser abstraídos em grande parte e, de fato, na maioria dos mecanismos bons. Mas você precisa empacotar as coisas 'renderizáveis' em caixas-pretas onde não é permitido saber o que está acontecendo dentro delas. Você sabe que tem uma "coisa" que renderiza em uma posição específica do mundo. Você não sabe como é renderizado, apenas é. E a camada de abstração gráfica cuida de todos os detalhes da exibição na tela. Os pipelines de construção específicos da plataforma empacotam os dados gráficos de forma que possam ser referenciados no mecanismo sem realmente saber como eles são representados internamente.
No entanto, quando tudo se resume a enviar um jogo, há algumas partes que você simplesmente não pode abstrair. Seria ridículo pensar que você poderia enviar o mesmo código no iPhone como faria no 360 ou PS3, já que os mecanismos de entrada, o modo fundamental de operação e os recursos da plataforma são muito diferentes. Você poderia criar um título do tamanho de um iPhone no 360, mas ele teria que limitar seus mecanismos de entrada apenas àqueles que o 360 pode suportar. Portanto, um cursor virtual na tela simula um dedo e, possivelmente, usa o joystick onde a entrada do acelerômetro 3D é usada.
Mais sensatamente, partes do jogo podem ser escritas de maneira reutilizável e módulos de código individuais podem ser portados entre plataformas, mesmo que a maioria do título seja diferente. Por exemplo, se você tem uma máquina de estado de IA, isso realmente não importa se está sendo executado no 360, PC ou iPhone. Seu jogo usará muitos desses componentes, e desde que eles tenham sido projetados bem para receber entradas e saídas bem definidas, o resto do jogo poderá ser envolvido em torno deles, independentemente da plataforma, e evitar a necessidade de reescrevê-los. componentes.
Essa reutilização é a chave para o desenvolvimento de várias plataformas, sem procurar um mecanismo de tamanho único que funcione em todas as plataformas. Mesmo que tal coisa existisse, seria tão prejudicada por ter que trabalhar no menor denominador comum que não seria de muita utilidade fazer jogos.