Java2D ou SDL para a criação de jogos MMO 2D?

Olá galera, estou precisando muito da opinião de vocês, principalmente daquelas pessoas que tenham ao menos um pouco de conhecimento sobre Java2D e SDL.

Estou com a pretensão de criar um MMO em 2D mas estou com uma séria dúvida quanto a qual dessas duas tecnologias utilizar.

Inicialmente iria desenvolver este meu jogo com C++/SDL por ter um razoável conhecimento em C++, ouvir muitas recomendações sobre esta API e ter encontrado tutoriais interessantes sobre a SDL (em inglês).

Mas fui obrigado a aprender Java para fazer trabalhos da universidade e acabei adorando esta linguagem. Essa minha adoração se dá por diversos motivos: java é multiplataforma, é totalmente orientada a objetos, tem bastante recursos disponíveis, e um ótimo suporte.

Quando fiquei sabendo da possibilidade de se criar jogos para desktop utilizando Java fiquei intrigado, pois sempre ouvi, não sei se equivocademente, que jogos em Java seriam apenas para mobile, pois para desktop estes ficariam lentos devido a JVM.

Percebi que muitas das críticas disparadas contra o Java para jogos, geralmente eram para jogos em 3 dimensões. Isso me deixou mais feliz, pois o projeto que já tenho em mente há bastante tempo inicialmente seria em 2D, e prefiro muito programar em Java a C++.

Outro ponto positivo para o Java que é essencial para o meu projeto é quanto a conexões de rede, que dizem ser ótimas nessa linguagem.

Então descobri que a melhor maneira de se criar jogos 2D em Java é utilizando a Java2D.

Criou-se então algumas dúvidas na minha cabeça. Será que com o Java2D meu jogo terá a mesma qualidade gráfica, sonora, de E/S (teclado e mouse por exemplo) e de rede da SDL? Será que com o Java2D o meu jogo terá uma velocidade geral e de rede equivalente a SDL? Será que com a Java2D terei as mesmas facilidades da SDL? Será que encontrarei recursos e suporte para as diversas áreas do meu jogo(gráfico, som, rede, …)?

Fiquei bem tentado a criar este jogo com Java2D por gostar da linguagem, achar ela mais fácil, e sempre encontrar suporte aqui no GUJ. Além do mais estaria me aprimorando bastante no Java o que poderia ser bom para o meu futuro. O que vocês acham?

Gostaria muito que me ajudassem com isso, pois só preciso tomar esta decisão para inicar o meu projeto.

Desde já agradeço.

Olá gabrielost,

o java2D é uma boa api, mas existem alguns problemas relacionados a ela e a classe BufferedImage. Alguns metodos nessa classe acabam por desacelerar a imagem na placa de vídeo e hà um bom artigo sobre isso aqui:

http://www.jhlabs.com/ip/managed_images.html

A SDL é uma biblioteca amplamente usada para jogos, e se for o caso também existe um mapeamento dela para linguagens modernas(java, c#).

Eu recomendo você utilizar uma engine já pronta como a Unity ou a Jmonkey no caso do java.

http://www.jhlabs.com/ip/managed_images.html

Primeiramente, defina seu objetivo. Você quer só desenvolver o jogo para aprendizado e diversão, como um projeto Indie? Ou você quer se profissionalizar e tentar no futuro entrar na indústria AAA?

Se for o primeiro objetivo, Java é uma ótima linguagem. Você pode aprender muito com ela, sem tanto estresse que teria com ponteiros perdidos e integração de blbiotecas no C++. Eu recomendaria java principalmente se esse é seu primeiro projeto do gênero.

Se seu objetivo for montar um portifólio para tentar um futuro cargo na Blizzard, Ubisoft, EA, ou outra grande empresa desse gênero, use o C++. É a linguagem em que todas trabalham.

A SDL é uma API ótima, mas seria ainda melhor se você fizesse seu jogo usando ela como base, mas OpenGL como seu renderizados gráfico, mesmo que seja só um jogo 2D. Vai valorizar mais seu portifólio e já serviria de estudo para o que virá pela frente: o 3D. Há vários tutoriais sobre essa combinação no Ponto V!, todos em português:
http://www.pontov.com.br/site/index.php/cpp/56-opengl

Uma outra coisa que você tem que se perguntar é: Você tem certeza que quer desenvolver um jogo massivo? Fazer um game multiplayer é uma coisa, mas para milhares de jogadores, o buraco é muito mais embaixo. Se você não tem muita experiência com redes, comece apenas com um jogo multiplayer, para um grupo de 4 ou 6 jogadores. O trabalho já será bastante grande.

Faz muitos anos que o Java para desktop é extremamente veloz. Para você ter uma idéia, tenho uma versão do Particles implementada também em SDL, que é mais lenta que a versão em Java 2D. E olha que por lá usei otimizações agressivas, como implementar um modelo de reaproveitamento da partícula.

As críticas são, em geral, ao Java 3D. O JMonkeyEngine não fica atrás de nenhuma API 3D que conheço.

O C++ também tem suporte excelente a rede, especialmente com o pacote boost:asio.

Essa é uma excelente opção. Outra opção é usar a Slick2D e, no futuro, espero que o projeto Alegria. A maior dificuldade de jogos em Java ainda é a API de som, que é um pouco baixo nível demais (mas muito poderosa). Tenho classes prontas para trabalhar com ela, se quiser posso te passar.

O Java2D é muito mais poderoso que a SDL. Ele usa aceleração gráfica para quase tudo. Tem o suporte que falta na SDL a transformações, como escala e rotação, inclusive com anti-aliasing. Ele tem a mais também suporte avançado ao desenho de primitivas gráficas.

O java dá um ótimo suporte a arquivos de som mid e wav. O projeto javazoom complementa com mp3 e ogg. Ele também permite trabalhar canal a canal, e mexer em característica como volume e direcionalidade, como a SDL faz. O javax.sound ainda permite que você manipule o stream de som enquanto o toca. É um recurso avançado e um tanto difícil de usar, mas com ele você pode criar filtros para sons com eco, por exemplo. Na parte de midi, ele permite inclusive a geração de músicas em tempo de execução.

O suporte nativo do Java para dispositivos de entrada restringe-se a teclado e mouse. Se você quiser também integrar joystick, volantes, etc. dê uma olhada no projeto JInput.

Sim, a velocidade deve ficar equivalente, senão mais rápida. A linguagem dificilmente é um gargalo no jogo, esqueça essa bobagem. Geralmente, os gargalos serão seus algorítmos e, principalmente, o vídeo. Em Java você terá muito mais facilidades do que com a SDL, não só na parte do Java2D, mas também graças ao garbage collector. A API do java também ajuda um bocado, embora em C++ você tenha boas facilidades de jogos na boost (como geradores de números aleatórios mais interessantes, por exemplo).

Uma ótima idéia. Outra opção excelente seria usar o C# com o XNA. A grande vantagem dessa opção é que você poderia portar o seu jogo para o X-Box e Windows Phone 7 no futuro e inclusive disponibilizar seu jogo na Live!. O C# é uma linguagem muito próxima do Java, mas ainda mais poderosa e fácil de usar, com uma API igualmente grande e completa.

No caso de se manter no Java, a Slick2D já suporte também ao Android.

Ah, quase esqueço. Fiz um artigo no Ponto V, que fala sobre o uso de java no desenvolvimento de jogos. Acho que você vai gostar de ler:
http://www.pontov.com.br/site/index.php/java/47-javageral/87-java-no-desenvolvimento-de-jogos

E como seu jogo é em rede, sempre tem a possibilida de fazer um híbrido. Você pode usar uma linguagem no servidor e outra no cliente. É comum servidores em java servires clientes em C++, ou vice-versa.

Quando você pensar que Java não serve para desenvolvimento de jogos, jogue um pouco de Taikodom, Minecraft ou mesmo Runescape.

Aqui está a versão do Particles em SDL.
Se reclamar do MSCV100.dll (ou algo parecido) sera necessário baixar e instalar o redistributable do Visual 2010:
http://www.microsoft.com/downloads/details.aspx?familyid=A7B7A05E-6DE6-4D3A-A423-37BF0912DB84

Note que os efeitos em Java ficaram bem mais bonitos, pois pude colocar mais partículas. E o FPS não deixa nada a desejar.

Mas aqui não uso OpenGL. A renderização das primitivas é feita usando a SDL_gfx. Ela é uma biblioteca muito otimizada, mas faz tudo na CPU e não na GPU, como o java faz.

Muito obrigado mesmo pelas informações Vini, me ajudou bastante. =)

Ainda hoje decido qual linguagem+API utilizar.