Alguma dica para criar jogos multiplataforma? [fechadas]

39

Você tem alguma dica / recomendação ao criar um jogo multiplataforma em C / C ++?

Matias Valdenegro
fonte

Respostas:

44

Ocultar qualquer coisa específica da plataforma atrás das camadas de abstração

Isso significa coisas como renderização, áudio, entrada do usuário e E / S de arquivo. Um truque comum para abstrair que, sem induzir uma penalidade no desempenho em tempo de execução, são os cabeçalhos independentes de plataforma com arquivos de implementação específicos da plataforma:

// FileSystem.h
class FileSystem {
public:
    FileHandle OpenFile(const char * path);
    // other stuff...
}

// FileSystemWindows.cpp
FileHandle FileSystem::OpenFile(const char * path) {
    // call windows API...
}

Em seguida, configure as compilações para cada plataforma para compilar no arquivo .cpp apropriado.

Faça com que seus pipelines de conteúdo sejam lidos em ativos independentes da plataforma e gerem conteúdo específico para cada plataforma

Por exemplo, crie suas texturas como .tga ou apenas .psd e, em seguida, tenha um pipeline que possa convertê-las automaticamente para os diferentes formatos específicos de plataforma necessários.

Não assuma um layout de memória ou endianness específico em seus dados

As plataformas podem variar em ordem de bytes, preenchimento, alinhamento e tamanho da palavra. Qualquer código que se preocupe com isso deve ser exaustivamente testado em todas as plataformas.

Teste em todas as plataformas, o tempo todo

Você será mordido por erros específicos da plataforma. Você prefere ser mordido agora, ou quando está tentando colocar o jogo fora da porta?

maravilhoso
fonte
2
falta de #ifdef PLATFORM_WINftw
tenpn
Você nunca escapará disso. Você pode apenas esperar minimizá-lo.
munificent
8
Uma boa maneira de fazer isso é mover todo o código específico da plataforma para um conjunto de bibliotecas compartilhadas com a mesma interface, então você pode limitar o # ifdef's a inicializar a biblioteca correta para a plataforma.
Neel 22/07
11
+1, ótimo comentário. Lembre-se de que mesmo o STL depende da plataforma (e sim, algumas funções fazem coisas diferentes em diferentes compiladores).
Simon
Certamente, chamar uma função extra diminuirá o desempenho? A CPU precisa carregar ou mover dados de registradores ou pior, memória que ainda é lenta. Uma chamada do sistema não seria suficiente?
TheBlueCat
10
  • Use uma API como opengl / sdl, que oferecerá um mínimo de aborrecimentos ao passar de plataforma para plataforma.

  • Certifique-se de saber quais plataformas você deseja suportar. Não use o opengl apenas porque você acha que pode querer oferecer suporte a multiplataforma no futuro. Comece quando estiver preparado.

  • Saiba quais são as limitações de hardware em cada uma das plataformas que você deseja suportar.

SD021
fonte
O segundo ponto não pode ser estressado o suficiente. Certifique-se de saber para quem o jogo se destina (o que significa que, se for um jogo casual, você gostaria de tê-lo em pelo menos OSX e Windows, assim o OpenGL seria a melhor opção). Quanto ao terceiro ponto - e é aqui que o motor entra em jogo - também é importante. Seria ilógico usar um mecanismo rico em recursos e recursos como o Unreal para criar um jogo para o DS. O ponto também está relacionado ao que eu disse em relação ao segundo: Estabeleça para quem o jogo se destina. Se você está indo para um jogo casual, os computadores da maioria das pessoas não suportam, digamos, partículas.
7

Tente evitar a dispersão #if defined(_FOO_) ... #elif defined(_BAR_) ... #else ... #endifpor todo o código.

Às vezes, parece que é a maneira mais fácil, mas isso lhe trará problemas a longo prazo. Você deve tentar limitá-los ao seu próprio arquivo, para que cada implementação de plataforma seja independente.

A adição de uma plataforma deve incluir principalmente novos arquivos de implementação e apenas modificar os poucos arquivos existentes necessários.

NocturnDragon
fonte
4

Existem muitas bibliotecas que são multiplataforma; você não precisa escrever diretamente no OpenGL para executar em qualquer lugar. OGRE é um ótimo exemplo de um mecanismo de renderização que funciona em qualquer plataforma que você gostaria de nomear.

Na minha experiência, a maior preocupação é o seu sistema de compilação. Se você desenvolver no Windows com o Visual Studio, seu código poderá ser compilado no Linux, mas você terá dificuldades para compilar com facilidade. Veja sistemas de compilação como o CMake que podem usar as mesmas instruções de compilação para gerar arquivos de projeto específicos da plataforma (makefiles no linux, VS Projects no Windows, XCode Projects no Mac, etc.).

Karantza
fonte
4

Ao escrever suas funções para salvar e carregar arquivos ou se comunicar através de uma rede, não se esqueça da continuidade .

Em vez de ler uma grande estrutura com uma única chamada para fread / fwrite ou algo de baixo nível como esse, crie um ReadByte / WriteByte e ReadFloat / WriteFloat. Então, você terá menos lugares para fazer alterações se decidir segmentar uma plataforma diferente posteriormente.

kevin42
fonte
+1 * 9000. Acho que isso realmente se aplicaria apenas a telefones celulares em termos de arquiteturas modernas / usadas (RISC); mas ainda crucial.
Jonathan Dickinson