XNA e C # vs o 360 em processador de pedidos

14

Depois de ler esse discurso retórico , acho que eles provavelmente estão certos (já que o Xenon e o CELL BE são altamente sensíveis ao código ignorante de ramificações e de cache ), mas ouvi dizer que as pessoas também estão fazendo bons jogos com C #.

Então, é verdade que é impossível fazer algo profissional com o XNA, ou o cartaz estava faltando o que faz do XNA a API assassina para o desenvolvimento de jogos?

Como profissional, não quero dizer que você pode ganhar dinheiro com isso, mas mais no sentido de que os jogos mais profissionais têm modelos de física e sistemas de animação que parecem estar fora do alcance de uma linguagem com barreiras tão definidas aos intrínsecos. . Se eu queria escrever um sistema de colisão ou mecanismo de dinâmica de fluidos para o meu jogo, não acho que o C # me ofereça a chance de fazer isso como gerador de código de tempo de execução e a falta de intrínseca atrapalha o desempenho.

No entanto, muitas pessoas parecem estar bem trabalhando dentro dessas restrições, criando seus jogos de sucesso, mas aparentemente evitando qualquer um dos problemas por omissão. Não notei que nenhum jogo XNA faça algo complexo além do que já é fornecido pelas bibliotecas ou manipulado por shaders. Isso evita a dinâmica mais complexa do jogo por causa das limitações do C # ou apenas as pessoas se concentrando em fazê-lo ?

Com toda a honestidade, não posso acreditar que a guerra de IA possa manter tantas unidades de IA sem uma abordagem orientada a dados ou alguns hacks C # sujos para fazê-la funcionar melhor do que a abordagem padrão, e acho que essa também é parcialmente a minha pergunta, como pessoas hackearam o C # para poder fazer o que os codificadores de jogos fazem naturalmente com o C ++?

Richard Fabian
fonte
Rant de fato. Não encontrando alguma informação sobre o cara e vendo que eles estão (ele é?) Uma partida, eu gostaria de ver qualquer tipo de informação palpável para apoiar isso ...
Jonathan Connell
Por razões que não entendo completamente, os estúdios não parecem admitir o uso do XNA. No entanto, existem muitos exemplos neste link
Tristan Warner-Smith
Bem, a informação óbvia para fazer o backup é o fato de que a CPU é bastante inerentemente ruim em código ramificado, o que é C #. O que eu gostaria de saber é: o que os usuários profissionais de XNA estão fazendo, significa que não atingem o limite mínimo imposto pelo C #?
Richard Fabian
3
Eu não consigo entender o voto negativo ... #
FxIII
3
Eu acho que muitas pessoas estão votando contra a pergunta de Richard por causa dos (numerosos) erros técnicos em seu artigo vinculado, e alguns comentários sobre a palavra "profissional" significam "produção no nível do Halo" em vez de "ganhar dinheiro". A última é uma má escolha, mas não diminua o voto apenas porque você não concorda com o link - desative-o respondendo.

Respostas:

21

OK, apenas para fazer alguns buracos nesse discurso que você vinculou:

  • "C # depende de um intérprete" Just In Time "" - errado - é um compilador JIT . Depois que um método é JITted uma vez , o código compilado é reutilizado para cada chamada. O código compilado é muito próximo do código nativo pré-compilado.
  • "CPU Xenon é um processador" no local " - ele quer dizer" em ordem "? - E: "A CPU do Xenon não tem previsão de ramificação" . Ele implica que isso significa que a compilação JIT produz naturalmente código incorreto que deve ser reordenado pela CPU e causa muitas ramificações - o que é um absurdo absoluto . O mesmo conselho de desempenho para executar nesta arquitetura de CPU se aplica a C ++ e C #.
  • "[JIT] requer liberação constante no 360" - errado, o código compilado pode ser mantido em cache como qualquer código compilado normalmente. (Se ele significa descarga de tubulação, veja o ponto acima.)
  • "genéricos usam [...] geração de código" - os genéricos são JITted como todo o resto e, como todo o resto, o código JITted é rápido. Não há penalidade de desempenho pelo uso de genéricos.
  • "todos os bits sensuais da linguagem [...] exigem previsão de ramificação ..." - como isso também não se aplica ao C ++? - "... ou [...] geração de código no local" - ele quer dizer JITting? Eu mencionei que é rápido? (Não vou entrar em todos os lugares em que o CLR da área de trabalho usa a geração real de código - um recurso não suportado pelo Xbox 360!)
  • "[O C # não possui] as grandes bibliotecas [do C ++]" - exceto, digamos, o próprio XNA? E muito mais . (Ainda assim, este é um ponto bastante justo.)

O XNA no Xbox 360 é executado em uma versão modificada do .NET Compact Framework CLR. Não tenho dúvidas de que não está de acordo com o padrão da versão para desktop. O JITter provavelmente não é tão bom - mas também não acho que seja ruim . Estou surpreso que ele não tenha mencionado o coletor de lixo, o que é terrível comparado ao CLR da área de trabalho.

(Claro - você não deve bater o coletor de lixo em um jogo desenvolvido profissionalmente de qualquer maneira , assim como você deve ter cuidado com atribuições em qualquer jogo de nível profissional.)

(Para uma discussão técnica real do .NET Compact Framework, talvez comece com esta série de artigos: Visão geral , JIT Compiler e GC e heap .)

A maneira como ele é totalmente inespecífico sobre sua terminologia dificulta o entendimento do que ele quer dizer. Ou ele está no modo de máximo discurso retórico ou não sabe do que está falando.


Agora que nós temos que fora do caminho, aqui estão algumas coisas que você não deixar escapar usando XNA no 360, ao invés de ir nativa :

  • Acesso à unidade SIMD / Vector para realizar cálculos de ponto flutuante da CPU muito, muito rápidos
  • Capacidade de usar código de idioma nativo que provavelmente será um pouco mais rápido que C #
  • Capacidade de ficar um pouco mais preguiçoso com a maneira como você aloca memória
  • Os jogos XBLIG têm acesso a apenas 4 dos 6 núcleos (mas ainda temos todas as 3 CPUs, e eles também não são núcleos completos, para não perdermos muito) - não tenho certeza se isso se aplica a XNA não XBLIG jogos
  • Acesso total ao DirectX para realizar truques gráficos realmente obscuros

Também vale ressaltar que essas são apenas restrições do lado da CPU. Você ainda tem acesso totalmente gratuito em execução na GPU.

Descrevi essas coisas nesta resposta para o que é efetivamente a mesma pergunta que essa. Como mencionei nessa resposta, o XNA é absolutamente adequado para o desenvolvimento "profissional" .

As únicas razões que você evitaria é que você não pode contratar talentos em C #, licenciar mecanismos em C # e reutilizar o código C # existente da mesma maneira que pode com a base existente de conhecimento em C ++. Ou porque você também pode ter como alvo uma plataforma que não suporta C #.

Obviamente, para muitos de nós que não somos desenvolvedores "profissionais", o XNA é a nossa única opção de entrar no Xbox 360, fazendo questão de argumentar.


Para responder suas outras perguntas:

Nada no C # impede você de usar abordagens orientadas a dados essencialmente exatamente da mesma maneira que você as usaria no C ++.

O C # carece da capacidade de alinhar automaticamente o código no tempo de compilação e (sem precisar verificar) tenho certeza de que o JITter do CLR compacto não pode incorporar métodos (o CLR da área de trabalho). Portanto, para código crítico de desempenho, talvez seja necessário alinhar manualmente em C #, onde o C ++ fornece assistência.

Provavelmente, uma razão maior pela qual você não vê frequentemente coisas intensivas em matemática da CPU, como detecção de colisão e simulações de fluidos em C #, é a falta de acesso à unidade vetorial (como mencionado acima).

Andrew Russell
fonte
Não consigo me lembrar, mas o C # não impede que você itere através de matrizes simples? Lembro-me de algo sobre o boxe de tipos de primeira classe como int, float, char e, por causa disso, algumas abordagens orientadas a dados não funcionam o mais rápido possível. Isso está certo? Do que estou lembrando?
Richard Fabian
2
O C # exibirá os tipos de valor da caixa (não apenas os intrínsecos - você pode criar seus próprios tipos de valor) se os atribuir a um objecttipo. E na versão 1 (antes dos genéricos), não era possível colocá-los em um contêiner sem matriz sem encaixotá-los. Mas hoje em dia é extremamente fácil escrever código sem caixa. E o CLR Profiler permite detectar qualquer lugar em que você possa estar no boxe.
Andrew Russell
É possível ter um intérprete JIT? Parece paradoxal.
The Duck Comunista
Eu já vi algumas técnicas de código encadeado que eu classificaria como interpretação JIT. É definitivamente um caso de ponta.
1
@Roy T. A " XNA Math Library " (parte do DirectX) e o " XNA Framework " são duas coisas completamente diferentes, com uma colisão de nomes muito infeliz. A documentação que você vinculou não se aplica ao XNA Framework. Os tipos matemáticos do XNA Framework não usam a unidade SIMD / Vector .
Andrew Russell
5

Você teria que definir 'profissional'. Você poderia fazer Angry Birds, Plants vs Zombies, etc? Absolutamente. Você poderia fazer Crysis 2, COD, Halo? Eu duvido. O uso de C # realmente afeta os jogos que exigem muita CPU e também precisam espremer cada último byte de memória (você perde para a coleta de lixo), então ainda há muito o que fazer.

Como uma ferramenta de aprendizado para as pessoas que estão começando, uma ferramenta de prototipagem, uma plataforma para escrever jogos que podem lidar com o trade-off, etc., é fantástica e tem muito poder e simplicidade, apenas não foi projetada para fazer o que você necessariamente chame os jogos 'AAA'. Isso também elimina muita dor e sofrimento que as pessoas precisam se preocupar com a portabilidade e compatibilidade entre plataformas.

Se você criar um jogo incrível e se deparar com as limitações do que pode fazer com o XNA, sugiro entrar em contato diretamente com a MS; se a idéia for realmente boa o suficiente, eles podem permitir que você coloque suas mãos em um desenvolvimento completo kit.

Roger Perkins
fonte
Você poderia fazer uma sequela de Duke Nukem ruim? ;)
Jonathan Connell
1
A maioria dos benchmarks acha que o código C # é executado entre 30% e 70% mais lento que o código C equivalente (no PC). Quando você considera que a maioria dos jogos não é vinculada à CPU e também que partes críticas do código C # podem ser gravadas usando um código não seguro que pode ser executado quase tão rápido ou mais rápido que o código C equivalente (mais rápido porque o JIT tem muito mais informações disponíveis para do que um compilador, para que ele possa fazer melhores escolhas de otimização) , você vê que o C # é perfeitamente capaz para jogos AAA.
BlueRaja - Danny Pflughoeft
@BlueRaja: código inseguro não é uma opção para a maioria desenvolvimento XNA no Xbox 360.
1
@BlueRaja: Vale ressaltar que o unsafecódigo geralmente é mais lento que o equivalente seguro, porque reduz o número de otimizações que o CLR pode fazer. Você tem que medir.
Andrew Russell
2
@Blueraja "Quando você considera que a maioria dos jogos não é vinculada à CPU", é necessário muito? Eu não trabalhei em um jogo desenvolvido profissionalmente que não esteja vinculado em todos os eixos. se não fosse, encontraríamos uma maneira de transferir a carga para essa parte da máquina!
Richard Fabian
3

O simples fato é que você não precisa de uma contagem alta de polígonos, iluminação HDR completa ou a física mais interessante do mundo para criar um jogo interessante, e se o seu plano de jogo não incluir nenhum deles, por que não fazer um jogo mais rápido? solução de tempo de desenvolvimento?

jogos mais profissionais têm modelos phsyics e sistemas de animação

Isso está errado. Os jogos profissionais têm o que precisam para implementar sua jogabilidade e obter sua aparência artística, e nada mais e, de fato, nada menos. Um jogo não é mais profissional porque parece mais realista ou tem uma física mais detalhada. Um jogo profissional atinge seus objetivos visuais e de jogabilidade, dentro do prazo, do orçamento, etc., e é enviado e gera lucro.

DeadMG
fonte
1
A alta contagem de polígonos e o HDR cairiam na placa gráfica, não? Portanto, você deve esperar exatamente o mesmo desempenho em C # e C ++.
BlueRaja - Danny Pflughoeft
@BlueRaja: Há um custo de CPU para eles também e memória, especialmente no 360. #
DeadMG
Mais ou menos, há um pouco mais de sobrecarga nas chamadas de lib de gráficos do que no código nativo. Por outro lado, as bibliotecas gráficas modernas se esforçam MUITO para reduzir o número de chamadas no driver por quadro, pois esse é um dos principais gargalos.
drxzcl