I wrote my own game engine based on Java 2D API. I run some demos on fullscreen mode on my 22" monitor but I’m not glad because of performance. Why is performance so low?
I would recommend you try a hardware acceleration binding like LWJGL or JOGL that allow you to use OpenGL/DirectX, this will give you much better performance and is a must for nice smooth games.
If you don’t want to learn OpenGL, you could try port it over to the Slick Library, it has OpenGL hardware acceleration and a very similar api to Java2D, this should make it easy to port your engine over. http://slick.cokeandcode.com
So nobody uses Java 2D in fullscreen games?
You’ll need to be more specific. What jdk version, what OS, what video board.
What kind of stuff your application does?
Many use fullscreen mode for gaming and are happy with it.
Dmitri
Java 6 update 3
Windows XP SP2
resolution: 1680x1050 px
EDIT: and olny ~20 fps
What kind of operations do you do?
Images? If so, translucent, bitmask?
antialiased rendering? Shapes?
What do you use for double-buffering?
BufferStrategy or VolatileImage? (I suggest the former).
If you can distill your app to a simple test case, that’d be the best.
Java 6 has Direct3D pipeline enabled in full screen mode. Check that it’s
working : set J2D_TRACE_LEVEL=4 env. variable before starting
your application and post the output.
also, the upcoming 6u10 (jdk6.dev.java.net) will have a new DirectX 9 based
pipeline enabled by default in both windowed and full-screen mode. You
may want to try it out.
Thanks,
Dmitri
It’s everything what I draw:
g.clearRect(0, 0, size.width, size.height);
// Tło
int width = background.getWidth(null);
int height = background.getHeight(null);
int x = 0;
int y = 0;
int rowCount = TileSet.pixelsToTiles(size.height, bgSize.height) + 1;
int columnCount = TileSet.pixelsToTiles(size.width, bgSize.width) + 1;
for (int row = 0; row < rowCount; row++, y += height)
{
for (int column = 0; column < columnCount; column++, x += width)
g.drawImage(background, x, y, null);
x = 0;
}
// Kafelki
tileSet.draw(g, size, point);
// Duszki
player.draw(g, point);
monster.draw(g, point);
// FPS
g.drawString("FPS: " + getFPS(), 0, (int)g.getFont().getStringBounds("K", g.getFontRenderContext()).getHeight());
I don’t use any antialiasing or something like that…
I use BufferStrategy.
How can I do this?
What kind are your images? BufferedImages? How do you load them?
How can I do this?
Run cmd.exe, then:
#> cd
#> set J2D_TRACE_LEVEL=4
#> java -jar YourApp.jar
This will print out a bunch of debug information on the console.
Also, could you try this:
#> java -Dsun.java2d.trace=log -jar YourApp.jar > log 2>&1
Let it run for a few seconds, then quit the app.
This last command will trace the rendering primitives.
If you could post a representative piece out of that, it’d help
diagnosing the issue.
The code that you posted seem fine - it should work just fine.
Dmitri
E:\Documents and Settings\Konrad\Moje dokumenty\Projekty\Dema\MyGameLibTest\dist
>java -jar MyGameLibTest.jar
[W] GetFlagValues: DDraw screen locking is disabled (W2K, XP+)
[I] InitDirectX
[V] CheckRegistry: Found Display Device 0: WinFast A340
[I] CreateDevice: lpGUID=0x0 hMon=0x0
[I] DDSetupDevice
[I] DDraw::CreateDDPrimarySurface: back-buffers=0
[V] DDSetupDevice: successfully created primary surface
[V] DDSetupDevice: successfully setup ddraw device
[I] DDSetupDevice
[I] DDraw::CreateDDPrimarySurface: back-buffers=0
[V] DDSetupDevice: successfully created primary surface
[V] DDSetupDevice: successfully setup ddraw device
[I] DDSetupDevice
[I] DDraw::CreateDDPrimarySurface: back-buffers=1
[V] DDSetupDevice: successfully created primary surface
[V] DDSetupDevice: successfully setup ddraw device
[I] D3DContext::D3DContext
[V] D3DUtils_SelectDeviceGUID: using TNL rasterizer
[I] D3DContext::CreateD3DDevice
[I] D3DContext::CreateAndTestD3DDevice
[I] D3DContext::InitD3DDevice: d3dDevice=Ox114340
[V] D3DContext::CreateAndTestD3DDevice: D3D device creation/initialization succe
ssful
[W] TestRenderingResults: Quality test failed due to value 0 at (40, 6)
[I] CreateD3DDevice: tests PASSED, d3d enabled (forced: no).
I load this by:
public Image getImage(String fileName)
{
return new ImageIcon(fileName).getImage();
}
return new ImageIcon(fileName).getImage();
Yuck.
Try ImageIO.
Try ImageIO.
In theory it shouldn’t matter that much although it certainly is
wasteful (pulling swing just for loading images).
Are those images 1-bit transparent, translucent? Gifs, pngs, jpegs?
There used to be a bug where some kind of loaded images weren’t
being accelerated.
Also, could you add the output with -Dsun.java2d.trace=log?
Thanks,
Dmitri
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture", AnyAlpha, "D3D
render target")
D3DDrawGlyphs
They’re pngs. Some of them are transparent.
You seem to be getting full hw acceleration, I’m not sure why it
only gives you 20fps.
What video board do you have?
Also, could you please set this property: -Dsun.java2d.trace=count (note - count, not log)
let it run for 10-15 seconds and quit. It will print out the summary of
which primitives were used.
Thanks,
Dmitri
279 calls to DXDrawLine
147375 calls to sun.java2d.loops.Blit::Blit(IntRgb, SrcNoEa, IntRgb)
85 calls to sun.java2d.windows.DDBlitLoops::Blit("Integer RGB DirectDraw", SrcNo
Ea, "Integer RGB DirectDraw")
7 calls to sun.java2d.d3d.DelegateSwToTextureLoop::Blit(Any, SrcNoEa, "Direct3D
Texture")
321 calls to D3DDrawGlyphs
7 calls to sun.java2d.loops.Blit::Blit(ByteIndexed, SrcNoEa, IntArgbPre)
7 calls to sun.java2d.loops.Blit::Blit(ByteIndexedBm, SrcOverNoEa, IntRgb)
350 calls to DXFillRect
27599 calls to sun.java2d.d3d.D3DTextureToSurfaceBlit::Blit("Direct3D Texture",
AnyAlpha, "D3D render target")
59 calls to DXDrawRect
323 calls to D3DFillRect
143 calls to sun.java2d.loops.DrawGlyphListAA::DrawGlyphListAA(AnyColor, SrcNoEa
, IntRgb)
1 call to GDICopyArea
176556 total calls to 13 different primitives
WinFast A340
Before anyone else googles around… with “WinFast A340” he means a GeForce FX 5200.
Yeah, I have one of those here. They aren’t speed demons for sure.
But I would have expected to get something more decent out of it.
Have you tried changing the display mode to something like
1200x1024? Just to see what kind of improvement you’d get?
Dmitri
I can’t set this resolution. But when I set it on 1024x768 I get 30 FPS.
Is your app available online? I could try on my 5200 and other boards…
Dmitri
I can’t download it- it complains that the user limit is reached.
Dmitri