Por que apenas alguns videogames são escritos em Java? [fechadas]

171

Por que muitos videogames 3D comerciais (não 2D aleatórios de código aberto) são escritos em Java? Em teoria, faz muito sentido: você obtém um aumento de produtividade e um aplicativo de plataforma cruzada quase de graça, entre outras coisas, como a grande quantidade de bibliotecas Java e a coleta de lixo integrada (embora eu admita que ' não tenho certeza se o último é uma coisa boa). Então, por que é raramente usado? Só consigo pensar em alguns jogos comerciais populares escritos para a plataforma Java.

É por causa do desempenho? Se sim, a maior parte do trabalho pesado não seria feita pela GPU?

Sasha Chedygov
fonte
1
Re: mmyers; Eu estou um pouco em choque que esse jogo ganhou um "melhores gráficos" prêmio, mesmo em 2005 ...
CloudyMusic
2
Sim, mas a maioria dos "jogos reais" não é feita em .net gerenciado, certo? Eles são feitos na velha escola c / c ++?
21920 Hardwareguy
14
Runescape é escrito em java.
GameFreak 23/06/09
44
Minecraft é escrito em Java!
DaGrevis

Respostas:

155

O mundo do desenvolvimento de jogos é engraçado: por um lado, eles geralmente aceitam novas idéias, por outro lado, ainda estão na idade da pedra.

A verdade é que raramente há muito incentivo para mudar para .NET / Java / qualquer coisa que não seja C / C ++.

Muitas empresas de jogos licenciam partes do mecanismo de jogos de outras empresas. Essas partes são escritas em C ++ e, embora você possa ter acesso à fonte para poder portá-la, é preciso muito esforço (e, é claro, a licença precisa permitir).

Além disso, já existe muito código herdado em C ++. Se o código de projetos anteriores puder ser reutilizado (por exemplo, se você estiver escrevendo uma sequência), isso conta ainda mais a favor de continuar com o mesmo idioma, em vez de reescrevê-lo em um novo idioma (mais porque você provavelmente reintroduzirá uma tonelada de bugs que você precisará gastar tempo resolvendo.

Finalmente, é raro os jogos serem escritos em 100% C ++ de qualquer maneira - muito é feito usando linguagens de script, sejam personalizadas ou apenas integrando linguagens existentes (Lua é uma das mais populares atualmente).

No que diz respeito à coleta de lixo, isso pode ser um pouco problemático. O problema não é tanto o que existe, é mais como ele funciona - o coletor de lixo DEVE não bloquear (ou pelo menos garantir um bloqueio muito breve), pois é simplesmente inaceitável que o jogo congele por 10 segundos enquanto ele verifica toda a memória alocada para ver o que pode ser liberado. Eu sei que o Java tende a engasgar bastante no GC quando está quase ficando sem memória (e para alguns jogos por aí, isso acontecerá).

Você também é um pouco mais restrito no que pode fazer: não pode explorar completamente o hardware devido à sobrecarga do tempo de execução. Imagine o Crysis sendo escrito em Java ... mesmo que essa seja a única diferença visível, não seria a mesma (também tenho certeza de que você precisaria de um Core i7 para executá-lo.).

Isso não significa que essas linguagens não têm seu lugar no desenvolvimento de jogos - e não, não estou me referindo apenas à programação de ferramentas. Para a maioria dos jogos, você não precisa do desempenho extra que obtém do C ++, incluindo jogos em 3D, e se estiver escrevendo tudo do zero, pode fazer sentido usar algo como XNA - na verdade, há um boa chance que vai.

No que diz respeito aos jogos comerciais - o RuneScape conta? Esse pode ser o jogo Java mais bem-sucedido do mercado.

Michael Madsen
fonte
16
Bem, obviamente você não executaria o Crysis na JVM; inferno, se você codificasse esse jogo na linguagem assembly, ainda precisaria de um supercomputador para executá-lo em configurações completas. Mas +1 pela excelente percepção, obrigado.
Sasha Chedygov
15
Você não pode comparar o Unreal Tournament 3 ou Crysis com o Runescape. Se a qualidade gráfica é uma preocupação, você precisa usar um idioma de baixo nível com o mínimo de sobrecarga possível. Obviamente, para Indy ou jogos onde os gráficos não são o principal ponto de venda, Java é uma excelente alternativa ao C / C ++.
GuiSim 23/06/09
6
@GuiSim: Para a maioria dos jogos, a qualidade gráfica NÃO é um grande ponto de venda. Há apenas alguns jogos em que posso pensar que foram criados com gráficos em mente (estou pensando em Crysis, mas Half-Life 2 também, na época). Eu não acho que a maioria dos desenvolvedores de jogos se importe tanto com gráficos, desde que sejam "bons o suficiente" (também conhecidos como a maioria dos outros jogos).
Sasha Chedygov
4
Os gráficos realmente têm muito pouco a ver com o idioma. Física, IA, sim. Gráficos, não.
julianr
10
@JulianR pode haver uma carga de trabalho significativa para preparar e manter uma cena a ser renderizada com eficiência, portanto o idioma e a sobrecarga do idioma associado são importantes para os gráficos.
KSchmidt 08/12/2009
95

Eu acho que John Carmack disse isso melhor com:

O maior problema é que o Java é realmente lento. Em um nível puro de CPU / memória / tela / comunicação, os telefones celulares mais modernos devem ser plataformas de jogos consideravelmente melhores do que um Game Boy Advanced. Com o Java, na maioria dos telefones, você fica com a potência da CPU de um PC IBM original de 4,77 mhz e um péssimo controle sobre tudo. [... snip ...] Escreva uma vez, execute em qualquer lugar. Ha. Hahahahaha. No momento, estamos testando apenas em quatro plataformas, e nem um único par tem exatamente as mesmas peculiaridades. Todos os jogos comerciais são aprimorados e compilados individualmente para cada plataforma (geralmente mais de 100). Portabilidade não é uma justificativa para o desempenho terrível.

( fonte )

É verdade que ele estava falando de plataformas móveis, mas eu encontrei problemas semelhantes com o Java como um todo, oriundos de C ++. Sinto falta de poder alocar memória na pilha / heap nos meus próprios termos.

Marc
fonte
60
Essa citação foi de 2005. Tanto a tecnologia Java quanto a potência do celular melhoraram consideravelmente desde então. Comparar jogos para celular vs jogos para PC é comparar maçãs com laranjas.
23909 Chris Dail
78
John Carmack disse isso. Caso encerrado.
GuiSim 23/06/09
41
Eu fico desconfortável quando leio "Java é realmente lento". É como dizer que um carro esportivo de US $ 50 mil é lento comparado a um carro esportivo de US $ 100 mil. Claro, é mais lento, mas 90% das vezes, o trabalho que ele faz ainda é ótimo e pela metade do custo;) Nenhuma guerra de chamas foi planejada. Eu concordo que as razões acima são por que Crysis e jogos similares não são escritos em Java.
Ross
17
@ Chris Dail, isso ressalta toda a questão do desempenho do Java. O desempenho do Java melhorou? Não, os telefones celulares ficaram mais rápidos. Os jogos devem aumentar os limites do realismo e, portanto, aumentar os limites do hardware, e desperdiçar% 30-% 40 do seu desempenho antes mesmo de você escrever uma linha de código é inaceitável.
cgp
8
Acho essa disputa muito estranha. Java ME não é o mesmo que Java no Android e também não é o mesmo que Java em PCs. O Java ME geralmente contava com os fabricantes de telefones para criar uma JVM. Alguns fizeram um bom trabalho, outros não. Não admira que Carmack estivesse reclamando deles. O Android tem sua própria VM, que não é uma JVM. E tem alguns problemas sérios (do meu ponto de vista). O HotSpot VM da Oracle é completamente diferente dos dois casos. Se as pessoas comparam todas essas coisas, a única coisa que posso concluir é que elas não sabem do que estão falando.
Malcolm
54

Por um lado, a falta de sobrecarga de operadores do Java torna toda a matemática com a qual você precisa lidar para obter um pipeline de gráficos de trabalho muito, muito chato e difícil de ler.

Toda a multiplicação de matrizes e vetores afins com os quais você precisa lidar são muito mais fáceis de seguir se estiverem em expressões matemáticas bem formadas, em vez de expressões orientadas a objetos, como

product = vector.multiply(projectionMatrix).dotProduct(otherVector);

Isso é terrível. A matemática não deveria ser assim.

Welbog
fonte
19
Lembro que em 96 eu acho que sim, alguns dos designers da Sun estavam fazendo uma apresentação sobre Java em Berkeley. William Kahan ( en.wikipedia.org/wiki/William_Kahan ) estava dando a mínima para eles sobre esse mesmo problema. :)
JP Alioto
13
acho que há uma boa razão para não permitir sobrecarga de operador em um idioma: impedir que as pessoas o usem. é uma ferramenta poderosa e muito interessante para matemática, mas é perigosa para todo o resto. Por mais preguiçosos que sejam os codificadores, eles tendem a usá-lo incorretamente para encurtar o código, e no momento em que as pessoas começam a executar um mapa multiplicando um iterável por uma função, ou mesmo quando todas as operações aritméticas são definidas para funções, a legibilidade do código está prestes a chegar a 0. e Sim, gastei muito tempo portando código assim. : -S é uma escolha de design. e as escolhas de design sempre tendem a ser discutíveis.
Back2dos 19/10/09
19
Punir todo mundo por algumas maçãs podres? Essa é uma das razões pelas quais prefiro C #. Se eu realmente preciso sobrecarregar o operador, está lá.
ChaosPandion
1
Basicamente, a sobrecarga do operador é realmente realmente apropriada para 2-3 situações diferentes no projeto de POO (vetores, matrizes, números complexos). Na maioria das outras situações, é muito pouco definido e leva apenas a códigos desleixados, sintaxe fraca e documentação pobre, mesmo de pessoas que sabem usá-lo. Acho que é por isso que a Sun optou por não usá-lo em Java, e acho que é uma decisão válida.
bgroenks
1
@MMJZ: O que as expressões lambda têm a ver com a sobrecarga do operador?
Sasha Chedygov
26

Eu acho que o .NET tinha (tem) muitos dos mesmos problemas percebidos que o Java tem. A Microsoft acaba de fazer um trabalho melhor de marketing para desenvolvedores com o XNA :-)

Joel Martinez
fonte
10
O XNA também possibilita implantar seu aplicativo .NET no XBox. Eu não vi nada tão suave para Java.
StriplingWarrior
Você também pode implantar no Zune.
Cbeuker
Pouco de uma questão mais velho, mas apenas para atualização, agora você pode escrever jogos XNA para Windows Phone, bem :-)
Joel Martinez
3
@JoelMartinez outra atualização: não é possível escrever jogos XNA para o Windows Phone 8. #
Tomas Andrle
@TomA Agora é possível escrever jogos de monogame para o WP8
Alex Lapa
17

Pontos menores primeiro:

  • qualquer aumento de produtividade do Java é hipotético. A sintaxe é quase idêntica ao C ++; portanto, você está realmente apenas aproveitando as economias do gerenciamento de memória e das bibliotecas padrão. As bibliotecas têm pouco a oferecer aos desenvolvedores de jogos e o gerenciamento de memória é um problema controverso devido à coleta de lixo.

  • multiplataforma "de graça" não é tão bom quanto você pensa, porque poucos desenvolvedores desejam usar o OpenGL e várias plataformas principais provavelmente não possuem uma boa implementação ou wrappers Java para suas bibliotecas nativas, seja para gráficos, áudio, redes etc.

Mas, principalmente, o problema é a compatibilidade com versões anteriores. Os desenvolvedores de jogos mudaram para C ++ de C e para C de assembly apenas porque a rota de migração foi tranquila. Cada um interopera intimamente com o anterior e todo o código anterior era utilizável no novo idioma, geralmente por meio de um único compilador. Portanto, a migração foi tão lenta ou rápida quanto você gostou. Por exemplo, alguns de nossos cabeçalhos antigos em uso hoje ainda têm #ifdef WATCOMCe acho que ninguém usou o compilador Watcom aqui em uma década ou mais. Há um investimento maciço no código antigo e cada bit é substituído apenas conforme necessário. Esse processo de substituição e atualização de bits e partes de um jogo para o outro não chega nem perto de ser prático se você mudar para um idioma que não interage nativamente com o código existente. Sim, a interoperabilidade C ++ / Java é possível, mas muito impraticável em comparação com simplesmente escrever "C com um pouco de C ++" ou incorporar blocos asm em C.

Para substituir adequadamente o C ++ como a linguagem de escolha dos desenvolvedores de jogos, ele deve fazer uma de duas coisas:

  1. Seja facilmente interoperável com o código legado existente, preservando assim o investimento e mantendo o acesso às bibliotecas e ferramentas existentes, OU
  2. Demonstravelmente, demonstre antecipadamente um aumento de produtividade para que o custo de reescrever todo o seu próprio código (ou retrabalhar as interfaces em componentes reutilizáveis ​​que possam ser usados ​​nesse idioma) seja mais do que coberto.

Subjetivamente, não acho que o Java atenda a nenhum deles. Uma linguagem de nível superior pode encontrar a segunda, se alguém for corajoso o suficiente para ser o pioneiro. (O EVE Online é provavelmente o melhor exemplo que temos de que o Python é utilizável, mas que usa uma bifurcação da linguagem principal do Python, muitos componentes C ++ para desempenho, e mesmo isso é para um jogo bastante pouco exigente em termos modernos.)

Kylotan
fonte
Só queria acrescentar que o EVE Online é uma simulação espacial 'online', na qual batalhas entre jogadores de 1000 contra 1000 são comuns, o que pode ser considerado um cenário exigente em termos de desempenho. Embora suas partes com muita velocidade sejam escritas em C / C ++, ainda é um estudo interessante sobre os desafios do uso de uma linguagem de alto nível (Python) em jogos.
Hakan Deryal 15/10/12
No entanto, lembre-se de que o desempenho em jogos para vários jogadores do lado do servidor é medido por métricas ligeiramente diferentes do desempenho em jogos para um jogador do lado do cliente - o primeiro está mais preocupado com a taxa de transferência, o último com a latência.
Kylotan
Sim, isso é verdade, mas essas batalhas incluem mais de 2000 navios na tela, mais de 2000 projéteis (mísseis, com animações), explosões etc., o que requer um desempenho gráfico pesado. De qualquer forma, obrigado pela resposta detalhada, ainda é verdade.
Hakan Deryal 16/10/12
1
Se você acha que a sintaxe C e Java é a mesma e, portanto, tem alguma relação com o desempenho, você realmente não entende o que está acontecendo. Como C poderia decidir em tempo de execução que uma determinada função está sendo chamada com os mesmos parâmetros repetidamente e substituir a chamada de função inteira por uma constante, mantendo a chamada de função quando há um desvio nos parâmetros? Não estou dizendo que o tempo de execução é sempre melhor ou pior, apenas que ele não tem nenhuma relação com a sintaxe!
Bill K
1
@ BillK - você parece ter lido errado. Mencionei a sintaxe apenas com referência a 'produtividade' - não a 'desempenho'. É verdade que as otimizações do JIT poderiam tornar o Java mais rápido em teoria, mas isso não ocorre na prática, pelo menos não no software de jogos.
Kylotan
12

Eu estou jogando o The Sims 3, e eu fiz algumas cutucadas. O mecanismo gráfico é C ++, enquanto o mecanismo de script e comportamento é C # / Mono. Portanto, enquanto o C ++ está disponível para bits críticos no tempo, outras coisas como .interaction, lógica do jogo, a IA está em uma linguagem gerenciada orientada a objetos.

John Simon
fonte
5
e depois para a versão para Mac, eles colocam tudo dentro de uma máquina virtual modificada do Wine. Ainda mais rápido do que seria em linha reta Java Eu acho :-)
Ben Gotow
10
O Wine não é uma máquina virtual, é uma biblioteca de tempo de execução que imita o comportamento das bibliotecas de tempo de execução do Windows. Daí o nome (Wine Is Not a Emulator).
Nate CK
2
Isso é muito comum em jogos, muitas vezes a lógica que não é de tempo crítico é escrita em algum tipo de linguagem de script, geralmente lua ou python.
KSchmidt 08/12/2009
Não é baunilha Mono, no entanto. A EA precisava de uma equipe especial trabalhando em seu próprio CLR personalizado em tempo integral para fazê-lo funcionar.
Crashworks 9/12/09
4
Apenas uma nota lateral que o The Sims 3 é notório por ter baixo desempenho, mesmo em computadores excelentes.
Lotus Notes
12
  • Existem boas portas de mecanismos / bibliotecas de jogos?
  • Muitos desenvolvedores de C / C ++, principalmente os do Windows (onde a maioria dos jogos comerciais são gravados), estão familiarizados com o Visual Studio. Não há comparação nos IDEs.
  • Em geral, o Java foi vendido para empresas devido à sua digitação sólida e à percepção de não haver problemas de gerenciamento de memória.
  • E sim, Java ainda sofre com a percepção de que é lento, e seu gerenciamento de memória é ruim e, para jogos, provavelmente não é adequado para a tarefa. Conforme declarado em algumas das outras respostas, a coleta de lixo não será suficiente quando você estiver lidando com requisitos de alto desempenho em tempo real. Os videogames levam as CPUs e GPUs ao limite.
cgp
fonte
1
+1 para o texto em negrito. As pessoas parecem não perceber que quando seu jogo está rodando a 20 qps, geralmente é um hardware vinculado a 20 qps. Ele realmente quer chegar a mais de 30 qps .. mas não pode.
GuiSim 23/06/09
Não acho que apenas o GC seja o problema em termos de desempenho ... nem mesmo isso, associado à fase lenta de inicialização ... são problemas gerais de desempenho, mas sou apenas eu.
Rogerdpack #
2
Acho que neste momento tenho mais chances de concordar do que no passado. A otimização da JVM melhorou; no entanto, tendo em vista as melhorias de desempenho em linguagens de tipo fraco como JavaScript e outras, o desempenho do Java em comparação é bastante imperdoável. Há muitos apologistas para o desempenho do Java. (mas o desempenho percebido no final é tudo o que importa) '
cgp
10

Uma das maiores razões pelas quais Java e outras linguagens de máquina virtual não são usadas para jogos é devido à coleta de lixo. O mesmo vale para o .NET. A coleta de lixo já percorreu um longo caminho e funciona muito bem na maioria dos tipos de aplicativos. Porém, para fazer a coleta de lixo, você precisa pausar e interromper o aplicativo para coletar o lixo. Isso pode causar atraso periódico quando a coleta acontece.

Java tem o mesmo problema para aplicativos em tempo real. Quando as tarefas precisam ser executadas em um horário específico, é difícil que uma tarefa automatizada, como a coleta de lixo, respeite isso.

Não é que o Java seja lento. É que Java não é bom em lidar com tarefas em tempo real.

Chris Dail
fonte
1
No entanto, você pode escrever seu próprio agendador para o coletor de lixo se quiser ir até o Java para portar um novo ambiente. A memória deve ser recuperada de qualquer maneira, e em um ambiente em tempo real, você pode ter a opção de quando agendar seu GC ... o melhor dos dois mundos. Eu tenho que voltar ao ponto que não há muitas razões para portar o Java para uma arquitetura para fazer as coisas que você deseja que quando o C / C ++ já faz essas coisas para você. Java brilha em outros lugares.
San Jacinto
5
Esta não é a década de 1990. Os coletores de lixo são muito bons agora quando ajustados para uma pausa baixa.
Tom Hawtin - tackline
8

Um grande motivo é que os videogames exigem conhecimento direto do hardware abaixo, muitas vezes, e realmente não existe uma ótima implementação para muitas arquiteturas. É o conhecimento da arquitetura de hardware subjacente que permite aos desenvolvedores extrair cada grama de desempenho de um sistema de jogo. Por que você dedica algum tempo para portar o Java para uma plataforma de jogos e depois escreve um jogo em cima dessa porta quando você pode simplesmente escrever o jogo?

edit: isto significa que é mais do que um problema de "velocidade" ou "não tem as bibliotecas corretas". Essas duas coisas andam de mãos dadas com isso, mas é mais uma questão de "como faço para que um sistema como a célula execute meu código java? Não existem realmente bons compiladores java que possam gerenciar os pipelines e vetores como eu preciso .. "

San Jacinto
fonte
7

Problema de desempenho é o primeiro motivo. Quando você vê o tipo de código C ++ hiper otimizado que está nos mecanismos do Quake ( http://www.codemaestro.com/reviews/9 ), você sabe que eles não vão perder tempo com uma máquina virtual.

Claro que pode haver alguns jogos .NET (quais? Estou interessado. Existem alguns realmente intensivos em CPU / GPU?), Mas acho que é mais porque muitas pessoas são especialistas em tecnologias de MS e seguiram a Microsoft quando lançaram sua nova tecnologia.

Ah, e multiplataforma simplesmente não está na mente das empresas de videogames. O Linux é apenas cerca de 1% do mercado, o Mac OS é um pouco mais. Eles definitivamente acham que não vale a pena despejar tecnologias e bibliotecas somente para Windows, como o DirectX.

Ksempac
fonte
3
"plataforma cruzada simplesmente não está na mente das empresas de videogames" - É por isso que respeito totalmente as empresas que o fazem. :)
Sasha Chedygov
Sou definitivamente grato à Carmack por estar tão comprometido com a plataforma cruzada e com o código aberto. Simplesmente afirmei o que a maioria das empresas pensa.
22410 Ksempac
1
Isso é verdade. Você não vê muitos videogames populares portados para Linux. :(
Sasha Chedygov
Plataforma cruzada não é apenas SO cruzado. Pense no PS3, Xbox 360, Wii.
julianr
"eles não vão perder tempo com uma máquina virtual". en.wikipedia.org/wiki/Quake_III_Arena#Virtual_machine , Carmack construiu o seu próprio para a lógica do jogo.
21419 James McMahon
4

Você pode perguntar por que os aplicativos Web também não são escritos em C ou C ++. O poder do Java reside em sua pilha de rede e design orientado a objetos. É claro que C e C ++ também têm isso. Mas em uma abstração mais baixa. Isso não é nada negativo, mas você não quer reinventar a roda toda vez, não é?

Java também não possui acesso direto ao hardware, o que significa que você está preso à API de qualquer estrutura.

Markus
fonte
Java pode chamar código nativo por meio de "JNI"
Bart van Heukelom
4
... e perca a portabilidade enquanto faz isso!
LiraNuna
1
Você realmente não perde muita portabilidade ao usar o JNI. Desde que você ainda seja capaz de compilar as bibliotecas nativas nas plataformas que deseja oferecer suporte, basicamente significa que você só precisa portar / recompilar 1% do seu código em vez de todo. Você ainda se beneficia muito da portabilidade do Java.
bgroenks
4

Equívocos sobre desempenho e otimizações ruins da JVM seriam o meu palpite. Digo equívocos sobre desempenho porque existem algumas portas Java de jogos em C ++ que executam mais rapidamente do que suas contrapartes em C ++ (consulte Jake 2). O verdadeiro problema, IMHO, é que muitos programadores Java não se concentram tanto no desempenho de ponta, como na facilidade de uso e na compreensibilidade / manutenção do código. No lado C / C ++, você está basicamente codificando em uma linguagem assembly de nível um pouco mais alto e é o mais próximo possível do hardware, sem escrever código assembly ou código de máquina direto.

illvm
fonte
Se estiver "o mais próximo possível do hardware, sem escrever na montagem", o Java não poderá vencê-lo, a menos que sua codificação seja terrível. Quanto mais perto você estiver do hardware, mais rápido você será capaz de chegar.
Josh Johnson
4

A lista de mecanismos de jogos na Wikipedia lista muitos mecanismos de jogos junto com a linguagem de programação em que estão escritos.

Existem vários mecanismos de jogos Java listados.

Clicar em alguns dos links levará a exemplos de jogos e demos escritos em Java. Aqui estão alguns:

Para certos jogos e situações, as compensações do Java podem ser aceitáveis.

JohnB
fonte
Eu sei que existem jogos escritos em Java. Mas, além de Minecraft e Runescape, pouquíssimos jogos comerciais tradicionais são criados para a plataforma Java. Quantos títulos AAA foram escritos em Java? E por que tão poucos? Daí a minha pergunta.
Sasha Chedygov
3

O .NET definitivamente tem alguns dos mesmos problemas que o Java tem quando se trata de intenso desempenho em 3D. A Microsoft também investiu muito mais tempo e dinheiro no desenvolvimento das bibliotecas quando se trata de trabalhar com operações pesadas em 3D.

(... pessoalmente, eu também acho que eles tiveram uma vantagem sobre a mágica entre DirectX e .NET)

Justin Niessner
fonte
2
  1. Java é lento, a maior parte do trabalho pesado não é realizada pela GPU. Ainda há animação, física e IA atingindo a CPU, que consomem muito tempo.

  2. O Java não existe nos consoles, e os consoles são um dos principais alvos dos jogos comerciais. Se você usa Java no PC, está eliminando sua capacidade de portar para consoles dentro de um prazo e orçamento razoáveis.

  3. Muitos dos codificadores mais experientes da indústria de jogos usam C e C ++ muito antes de o Java se tornar popular. Os dois pontos acima podem contribuir para isso, mas espero que muitos codificadores profissionais de jogos simplesmente não conheçam muito bem o Java.

  4. O argumento de outra pessoa sobre o middleware acima foi bom, então estou adicionando à minha resposta. Há muito código legado e middleware escrito especificamente para vincular ao C / C ++, e a última vez que verifiquei o Java não tem boa interoperabilidade. O uso do Java para a maioria das empresas envolveria a liberação de muitos códigos, muitos dos quais pagos de uma maneira ou de outra.

Dan Olson
fonte
3
Você pode usar JavaCL, JOCL ou APARAPI para transferir muito disso para a GPU.
bgroenks
2

Na verdade, é muito possível que o código gerenciado faça jogos em 3D, o problema são os mecanismos de trás. Com o .Net, por um breve período, houve um wrapper do DirectX gerenciado para o DirectX 9 da Microsoft. Isso foi antes da abstração que agora é XNA.

Tendo acesso total às APIs do DirectX, os jogos .Net funcionam muito bem. O melhor exemplo que conheço é www.entombed.co.uk, escrito em VB.Net.

Infelizmente, do lado do Java, falta seriamente - principalmente pelo fato de o DirectX não estar disponível para Java, e os programadores de jogos conhecerem e entenderem a API do DirectX - por que aprender mais uma API quando você voltará ao DirectX?

Foz
fonte
2

O marketing de jogos é um processo comercial; os editores desejam retornos quantificáveis ​​de baixo risco para seus investimentos. Como conseqüência, o foco geralmente está em truques tecnológicos (com exceções) que os consumidores compram para produzir um retorno confiável - esses tendem a ser efeitos visuais superficiais, como reflexo da lente ou resolução mais alta. Esses efeitos são confiáveis ​​porque eles simplesmente usam aumentos no poder de processamento - eles exploram os aumentos de hardware / lei de Moore. isso implica o uso de C / C ++ - o java geralmente é muito abstrato do hardware para explorar esses benefícios.

Daniel Collicott
fonte
1

Eu acho que a velocidade ainda é o problema. A plataforma cruzada será um problema, pois você não sabe qual placa 3D está disponível ao escrever o código? O java tem algo para oferecer suporte à descoberta automática de recursos 3D? E eu acho que existem ferramentas para facilitar a portabilidade de um jogo entre o wii, xbox e ps3, mas aposto caro.

O ps3 tem java, através do suporte blue ray. Verifique o site bd-j.

grumoso
fonte
1

Mesmo os jogos escritos na plataforma .Net geralmente são altamente otimizados para velocidade, como acesso direto à memória e ao barramento. O .Net permite usar C / C ++ e misturá-lo com linguagens de nível superior, como C #.

Os estúdios de desenvolvimento de jogos geralmente trabalham em conjunto com fornecedores de hardware, que fornecem acesso a interfaces de baixo nível de seus produtos. Este é um mundo em que você precisa usar o ASM e o C para a comunicação do dispositivo. Um ambiente virtual desaceleraria essas partes do programa.

De qualquer forma, os jogos 3D modernos de fato usam linguagens de nível superior. Muitas vezes, você encontrará a lógica do jogo escrita em linguagens como Lua ou Python. Mas o núcleo (E / S, threads, agendamento de tarefas) do jogo 3D típico será escrito em idiomas de baixo nível pelos próximos 25 anos ou enquanto os dispositivos não permitirem abstração e virtualização por si mesmos (que virá).

cafebabe
fonte
1

Concordo com os outros posts sobre como alavancar elementos de uma base de código, desempenho, etc. preexistentes / licenciados

Uma coisa que eu gostaria de acrescentar é que é difícil fazer truques desagradáveis ​​de DRM através de uma máquina virtual.

Também acho que há um componente de arrogância em que os gerentes de projeto pensam que podem criar código estável / confiável com C ++ com todas as vantagens de ter controle absoluto sobre suas ferramentas e recursos, MAS sem todos os negativos que complicam e atrapalham a concorrência porque "nós" são mais inteligentes do que são ".

JP772
fonte
0

O Runescape da Jagex é escrito em Java, a tag "video game" pode não se aplicar especificamente, pois é um jogo on-line, mas possui um número razoável de seguidores.

Mark Schultheiss
fonte
Desculpe, mas isso realmente não responde à minha pergunta.
Sasha Chedygov 24/06/2009
2
Mas a afirmação cega da pergunta leva à suposição de que nenhum jogo é escrito em Java, apenas apontando o caso bem-sucedido de onde ele está.
22420 Mark Schultheiss
0

Já se falou muito sobre isso, você pode encontrar até no Wiki as razões ...

  • C / C ++ para o mecanismo do jogo e todas as coisas intensivas.
  • Lua ou Python para scripts no jogo.
  • Java - desempenho muito ruim, uso de muita memória + não está disponível nos consoles de jogos (é usado em alguns jogos muito simples (sim, o Runescape conta aqui, não é Battlefield ou Crysis ou o que mais existe), apenas porque existem muitos programadores que conhecem essa linguagem de programação).
  • C # - uso de memória grande (é usado para alguns jogos muito simples, apenas porque existem praticamente programadores que conhecem essa linguagem de programação).

E eu ouvi cada vez mais programadores Java que tentam convencer as pessoas de que o Java não é lento, não é lento para desenhar um widget na tela e desenhar alguns caracteres ASCII no widget, para receber e enviar dados pela rede (e é É recomendável usá-lo nesses casos (manipulação de dados de rede) em vez de C / C ++) ... Mas é muito lento quando se trata de coisas sérias, como cálculos matemáticos, alocação / manipulação de memória e muitas dessas coisas boas.

Lembro-me de um artigo no site do MIT onde eles mostram o que o C / C ++ pode fazer se você usar os recursos de linguagem e compilador: Um multiplicador de matriz (2 matrizes), 1 implementação em Java e 1 implementação em C / C ++, com recursos de C / C ++ e otimizações apropriadas do compilador ativadas, a implementação do C / C ++ foi ~ 296 260 vezes mais rápida que a implementação do Java.

Espero que você entenda agora por que as pessoas usam C / C ++ em vez de Java em jogos, imagine o Crysis em Java, não haveria nenhum computador neste mundo capaz de lidar com isso ... + A coleta de lixo funciona bem para Widgets que acabam de destruir uma imagem mas ainda está armazenado em cache e precisa ser limpo, mas não para jogos, com certeza, você terá ainda mais atrasos em cada ativação da coleta de lixo.

Edit : Como alguém pediu o artigo, aqui, procurei no arquivo da web para obter isso, espero que esteja satisfeito ... Estudo de caso do MIT

E para adicionar, não, o Java para jogos ainda é uma péssima idéia. Apenas alguns dias atrás, uma grande empresa que eu não citaria começou a reescrever seu cliente de jogo de Java para C ++ porque um jogo muito simples (em termos de gráficos) atrasava e aquecia os laptops i7 com as poderosas placas de vídeo da geração nVidia GT 5xx e 6xx ( não apenas na nVidia, o ponto aqui é que essas placas poderosas que podem lidar com as configurações de Max na maioria dos jogos novos e não com esse jogo) e o consumo de memória foram de ~ 2,5 a 2,6 GB de RAM. Para gráficos tão simples, ele precisa de uma máquina animal.

Lilian A. Moraru
fonte
10
Você sabe claramente muito pouco sobre o tempo de execução Java moderno e a máquina virtual. O artigo que você mencionou é mais do que provável de uma década atrás ou mais, é claro que ninguém pode saber porque você não o citou. Sua percepção do Java está desatualizada.
bgroenks
2
Ok, para que o estudo prove que, para multiplicação de matrizes em larga escala, o Java perde para C quando o acesso bidimensional à matriz está sendo usado para acessar dados. Sim, eu teria adivinhado isso também. E se isso realmente é um problema para você, o que duvido que seja, é por isso que você tem JNI. Os limites de verificação de sobrecarga de matrizes aumentam nessa situação, embora seu código Java possa ter sido otimizado para melhorar significativamente os resultados. Da mesma forma, questiono sua compreensão do JIT quando ele afirma "compilação mais rápida = não é o melhor código gerado". Leia as especificações da IBM para provar o contrário.
bgroenks
3
Java NÃO é uma má escolha para o desenvolvimento de jogos. Existem muitos jogos de sucesso por aí que executam Java. Normalmente, você precisa de um pouco de ajuda do código nativo (especialmente com o LWJGL e outros) para obter os melhores resultados. Mas se eu apenas precisar portar e recompilar 1% do meu código em vez de 100%, isso me parece muito.
bgroenks
1
@bgroenks "100%" - parece que você não tem idéia sobre C / C ++ ... E, ao criar um jogo, você sempre pode usar uma biblioteca de plataforma cruzada (SDL e várias outras) ou estrutura (Qt, por exemplo). Por exemplo: A EA usa Qt para absolutamente todos os jogos que eles têm ... Qt é MUITO MAIS multiplataforma que Java e compila com código nativo.
Lilian A. Moraru
2
Eu realmente não vejo o ponto em Java quando você tem Qt. Acho o código Qt mais claro, mais fácil de entender e manter do que o código Java. Quando pergunto a meus amigos por que eles têm tanto medo de C ++, eles sempre me dizem que odeiam ponteiros e certificam-se de desalocar memória. Parece que muitas pessoas não sabem sobre shared_ptr em C ++ ... Para mim, Qt e C # .NET / C ++ .NET são os mais agradáveis ​​de se escrever. O código Java geralmente é muito inchado com o tratamento de exceções, geralmente desatualiza bibliotecas (Ele está indo bem principalmente apenas no lado do servidor, mas o resto ...) e documentação frequentemente desatualizada.
Lilian A. Moraru