Motores de jogo Java [fechados]

estive a investigar o desenvolvimento de jogos recentemente e a minha primeira linguagem de programação é Java. Depois de jogar muitos jogos impressionantes desenvolvidos em C++ Eu me perguntei Por Que Java não é muito usado na indústria de jogos. Eu olhei para jMonkeyEngine 3 e alguns outros ambientes de motor de jogo, mas as imagens que eu vi são muito menos deslumbrantes. Títulos como Need for Speed Hot pursuit form EA and Assassins Creed from ubisoft transmitam tal realismo. Por que Java não pode produzir jogos de força da indústria ? É a obra de arte?

o Java e o c# têm uma colecção automática de lixo e o C++ não. o programador tem de prestar mais atenção à utilização da memória para o avoud pendurar ponteiros e assim por diante.

Obrigado, pessoal.

Author: Piotr, 2011-01-25

7 answers

Java e C# têm lixo automático a colecção e o C++ Não. programador tem que prestar mais atenção para uso da memória para avoud balançando ponteiros e assim por diante.

Você mesmo respondeu à sua pergunta.

Nos jogos, a programação da recolha de lixo não é uma vantagem. Mesmo que o desempenho de Java esteja mais ou menos em par com C++ para a maioria das tarefas, e o JIT pode até mesmo fazer otimizações muito agressivas que batem as que podem ser feitas durante o análise estática; a coleta de lixo pode fazer com que os framerates caiam no pior momento.

Também, para tarefas intensivas gráficas Java não é muito apropriado, pois há muitas coisas que são consideradas inseguras pelo tempo de execução, e assim são proibidas (como ponteiros de fundição para reinterpret dados).

Uma outra questão importante é o saber-fazer já estabelecido na indústria. A inércia do C++ na indústria de jogos é enorme. Todos os desenvolvedores de jogos hoje conhecem C e c++. Ter um grande o pool de desenvolvedores para contratar a partir diminui um dos riscos de gestão que são as pessoas-chave que deixam a empresa. Mas apesar disso, houve alguns jogos de sucesso com algumas partes escritas em Java, como o vampiro Mascarado-redenção.

Um jogo mais recente como Minecraft é escrito completamente em Java; mas não possui gráficos de última geração, pois a ênfase é colocada mais na natureza dinâmica do ambiente virtual.

E muitos outros jogos e motores têm um tempo de execução que suporta uma linguagem de scripts gerenciada (alocação de memória automática segura e coleção) construída em cima de uma plataforma de renderização de alto desempenho e de rede (escrito em C/C++), como Unreal Engine, por exemplo.

 20
Author: fortran, 2015-05-05 18:38:37

Geralmente tudo o que foi dito aqui foi uma razão para não portarmos para Java para o desenvolvimento do jogo; foi. A indústria do jogo está neste momento a atingir uma mudança de paradigma . Três coisas mudaram ou estão mudando a indústria de jogos:

  • pirataria
  • Client-server program models
  • modelos de programas de redes modulares

Um jogo já não depende de si mesmo. As principais vantagens que existiam no primeiro (baixo nível linguagens) estão diminuindo sendo pesadas pelas vantagens que existem em linguagens como C# e Java (linguagens de alto nível). Dois exemplos rudes mas inegáveis são os jogos que funcionam emFacebook , emeios remotos como telefones, tablets, etc .

É importante afirmar que em todos os dois cenários, todas as três preocupações acima enumeradas estão dissolvidas. Um jogo que não pode funcionar sem um servidor não precisa se preocupar com ser infringido cópia (hospedagem privada através de reverso engenharia não incluída). A demanda por jogos dependentes da rede requer uma linguagem que possa equilibrar o desempenho do sistema com o desempenho da rede (normalmente um impasse entre Java e C/C++, favorecendo C/C++ estritamente devido à abundância de bibliotecas pré-existentes). No entanto, um jogo projetado em um módulo de programa de rede modular seria impraticável para se desenvolver em linguagens de baixo nível, como C/C++. Uma empresa que estaria interessada em desenhar um jogo em C / C++ para um Modular-networking program model would have to create a virtual machine entirely devoted to that one game, or reprogram/recompile the game a number of times too insane to think. IMO, embora possa ser muito cedo para dizer qual a linguagem preferida, eu estou colocando minhas apostas em Java por três razões chave.

  • 1) o JVM permite que aplicações baseadas em Java executem virtualmente em qualquer plataforma, seja derivada da Apple, Android, Windows 8 ou Linux / UNIX (suporte virtualmente em qualquer hardware plataforma também).

  • 2) Java usa OpenJL (a derivada OpenGL, que será executada no OpenGL como um cliente-jmonkey é um motor projetado no OpenJL). É importante notar que apenas o Microsoft Windows usa DirectX, como bom como pode ser, tem apenas um recuo. Virtualmente todos OS SO que podem executar jogos serão capaz de renderização em OpenGL e design modular está pressionando sobre isso como nunca antes. (Por favor, note, a Microsoft está tentando desviar este problema através de monopolizar a distribuição do Windows 8).

  • 3) Java suporta threading internamente dentro do JVM, o que lhe permite tirar o máximo partido dos processadores multi-core sem o uso de qualquer biblioteca de terceiros. Actualmente, esta é uma desvantagem para todos os outros idiomas (especialmente os desenvolvidos para telefones).

Embora a JVM apresente uma preocupação de latência, deve notar-se que tais preocupações podem ser eliminadas através de roscagem. Eu também não estaria muito preocupado com o Windows 8 e o push of Microsoft. O Google tem uma ação de US $720/share, a Apple tem US $526/share, sendo a Microsoft US $ 27 até o momento. Enquanto a Apple é provável que seja realizada pelo impulso da Microsoft principalmente devido ao uso de C#, O Google, por outro lado, é provável que lucre com isso. A Microsoft nunca teve muita sorte ao competir contra o Google e o Google/Android usa fortemente Java. Angry Birds foi originalmente projetado em Java FYI, e portado para C# para o iPhone. Se o Google / Android aplicar a padronização, a Microsoft deixará de existir como uma mosca, levando maçã com eles.

 18
Author: C.Jepson, 2012-12-20 04:36:26
A resposta à sua pergunta é arte e recursos financeiros. E a originaly Minecreft foi desenvolvida por uma pessoa em java. Enquanto que as tetas como AC ou NFS são desenvolvidas a partir de equipes de milhares de pessoas. Compare os recursos. Além disso, a Ubisoft utiliza o motor de jogo da custrom. Se você é o único developper você deve se concentrar na idéia por causa da falta de recursos. E se você tem uma idéia, o colecionador garbege não é praticável em jogos normais de desenvolvimento exclusivo. E como um único desenvolvedor você deve escolha a tecnologia de desenvolvimento mais rápida.
 4
Author: fil mihaylov, 2015-08-04 07:01:59

Eu queria abordar apenas um tópico paralelo desta questão, mas a coleta de lixo não é necessária para criar os aspectos de baixo nível, desempenho-críticos de um motor de jogo do tipo AAA. Na verdade, evitar esse tipo de referenciamento e sistema de coleta de objetos é útil. Você quer mesmo tipos definidos pelo Usuário para ser contíguo na memória e encaixar objetos adjacentes no cache, etc.

Para além das questões de desempenho da recolha de lixo em intervalos periódicos e de espalhando objetos na memória, os jogos não podem se dar ao luxo de ser vazados com seus recursos mais volumosos, e o coletor de lixo impede as coisas lá. Sim, acabei de dizer que a GC impede a capacidade de evitar fugas.

A recolha de lixo não é uma bala de prata contra fugas de recursos.

Por mais contra-intuitivo que pareça, veja as aplicações mais falidas que existem hoje: aquelas em que quanto mais tempo as usa, mais e mais o uso da memória continua a aumentar. Normalmente não são aplicações C ou C++. Aplicações C / C++ podem ser notórias por colidir, mas não tanto por vazamento. Aqueles que vazam são mais frequentemente programados em línguas com coleta de lixo.

Por exemplo, veja os jogos em Flash. Há muitos lá fora, e não apenas um software Amador completo, que usam mais e mais recursos e ficam mais lentos e lentos quanto mais tempo você joga o jogo, forçando-o às vezes a reiniciar o seu navegador para obter o jogo rápido novamente. No entanto, estão codificados em ActionScript, uma linguagem que tem recolha de lixo. Em teoria, a recolha do lixo deve reduzir as fugas. Na prática, ele muitas vezes elimina os vazamentos físicos mais baratos e mais fáceis de consertar e spot (whoops eu esqueci de excluir esta corda) em troca dos vazamentos lógicos muito mais caros e difíceis de isolar (whoops, a lógica do sistema faz com que recursos volumosos para permanecer em torno de até que todo o jogo é encerrado).

Isto é porque numa linguagem GC, se quiseres crie a propriedade partilhada de um novo recurso, {[[0]}, tudo o que tem de fazer é guardar um cabo/referência para ele noutro objecto, A. B e C também podem armazenar uma pega para {[[0]}, e agora {[[[0]} tem três proprietários e só serão libertados se os três proprietários libertarem a referência. O Usuário só vê e trabalha com o que A armazena, então a lógica do jogo envolve remover R de A periodicamente, mas as referências a ele permanecem em B e C silenciosamente que o código esqueceu de lançar. Em C / C++, o ponteiro dangling aqui em B e C pode ser realmente preferível, uma vez que levaria a um problema imediatamente detectável e corrigível durante os testes de reprodução, onde o programador que executa um depurador irá rapidamente detectar e corrigir o problema. Em uma linguagem GC, é extremamente difícil de detectar e enquanto o programa não vai falhar, ele pode começar a vazar muito.

Então o GC evita de certeza ponteiros pendurados, mas se algo estivesse a balançar em C / C++ e não estivesse balançando em uma linguagem GC, então é uma fuga de recursos lógica em uma linguagem GC e uma segfault em C/C++. Por outras palavras, o GC troca ponteiros pendurados por recursos que permanecem por aí para sempre. Ele troca o que seria uma queda gritante em um vazamento silencioso que pode ser um pesadelo de depuração para descobrir (e pode até passar despercebido muito tempo depois de liberar o produto). Então para algo como um jogo que está criando mundos massivos e dinâmicos, gráficos e objetos físicos e assim por diante e possivelmente em cada quadro, vazamentos de recursos lógicos são um grande negócio.

Coleta de lixo é melhor quando vazamentos de recursos não são um grande negócio.

Este cenário anterior é, infelizmente, muito comum em um ambiente de equipe de grande escala usando GC, especialmente se cada programador não é muito cauteloso com as armadilhas da coleta de lixo e a forte necessidade de referências fracas. Então GC não é necessariamente algo para citar como uma vantagem para fazer jogos, a menos que você é apenas a falar do tipo de lógica humana de mais alto nível. A lógica de Sistema de baixo nível, delicada, que tem de criar e acessar constantemente e destruir recursos Geralmente vai se sair melhor, mesmo em termos de evitar vazamentos, sem ele.
 3
Author: Team Upvote, 2015-05-06 00:39:03
Não é inteiramente verdade que a recolha de lixo não é utilizada na indústria do jogo. Unreal Engine 3 tem coleta de lixo implementado para as classes 'Script'. Para eles, o desempenho é aceitável quando usado levemente; o trabalho pesado é feito pelo código C / C++ que gerencia sua própria memória.

Como fortran disse, Java não é realmente usado na indústria de jogos por causa de preocupações sobre a velocidade (Java executa código em um VM, não nativamente... a maior parte do tempo) e porque já existem grande número de talentosos Programadores de jogos que escreveram um monte de código oft usado em C e c++. Isso não quer dizer que você não pode fazer uso de Java para fazer um jogo, porque há alguns jogos Java lá fora, mas a indústria de jogos 'mainstream' investiu fortemente em uma infra-estrutura C / C++.

 1
Author: James, 2011-01-25 17:52:30
O Fortran e o James já o cobriram bastante bem, mas uma outra coisa que eu gostaria de mencionar, que fortran meio que insinuou ao falar sobre inércia, é a gigantesca piscina de bibliotecas disponíveis Em C++. Ter várias bibliotecas C++ para quase tudo o que você possa pensar é uma grande razão para não mudar para Java. Isso não quer dizer que não haja bibliotecas para Java agora, mas as C++ já estão maduras e têm grandes comunidades de devs experientes. Nao ter que reescrever a mesma coisa que você já fez 1000x antes é uma grande economia de tempo.
 0
Author: Gemini14, 2011-01-26 10:54:51

U pode encontrar jogos escritos em java (jmonkey engine escrito totalmente em java).

Aqui -->"http://www.indiedb.com/engines/jmonkeyengine/games".

1.mundo em ascensão .

2.minecraft.

3.mynthurana.

Tudo no motor jmonkey. A qualidade de seus gráficos são intensos e os desafios são bons. Eu diria que a exigência de desenvolvimento de jogos é ter um mínimo de duas pessoas. Java está bem.
 -2
Author: azhar, 2018-01-04 11:43:08