Effectivly Drawing a Real-Time Game

Hello, I have several questions regarding the methods needed to draw a real-time game. First of all, is there a way of using Hardware accelerated graphics in Java? Secondly, and more to the point, my real-time game needs to repaint the screen every 25 milliseconds. The actual painting is done in the paintComponent method of my Game component (which extends JPanel). Anyway, I need to draw the background Image and to draw the foreground image onto existing terrain. I am painting the whole Background image (clipped to the size of the screen) each repaint. Furthermore, I draw the Foreground Image once for each polygon in my Vector of Polygons which describe the terrain - each time the graphics is clipped to the current terrain polygon I am referring to. This means I draw the amount of Polygons + 1 images every 25 milliseconds (And some of which are 3000x3000 pixels big). No wonder the screen is flickering... However, I do not know any alternate way (even though I am sure one exists). Any help would be kindly appreciated.
With Thanks,
laginimaineb.

@laginimaineb,
Create terrain image 'only once' using,
Image image = Toolkit.getDefaultToolkit().getImage(fileName);
BufferedImage bimage = new BufferedImage(3000,3000, type); //Max size set
Graphics g = bimage.createGraphics();
for(int i=0;i<noOfPolygons;i++) {
g.drawImage(image, xPos, yPos, null);
g.drawPolygon(polygon);
Image completeImage = Toolkit.getDefaultToolkit().createImage(bimage.getSource());
g.dispose();
Just draw this CompleteImage in paint() or paintComponent() method.
CompleteImage is created only once.
If you are changing terrain after 25 seconds then different logic may need.

Similar Messages

  • Threads in real time games

    For a game like Starcraft or Diablo 2 (or any real time game) is it standard practice to make a seperate thread for each object (such a monsters / units, etc.)
    Thanks.

    no, the overhead would become to great. There is one "master thread" for all monsters, which will keep track of their state, possibly one thread for each player in the case of RTS games like Starcraft. The game engine will have all kinds of tricks to make the AI seem smart, while they are actually pretty dumb and take up little cpu power. A single thread can keep track of hundreds of units this way.

  • Trouble drawing a real time line across X axis.

    Hi,
    I am trying to draw a line across the X axis in real time, but for some reason, the simply cases are way off. For example, If I try to draw the line for two minutes. my line will only make it to about 1 min 45-50 seconds within that time. I tried to make up for the difference by checking the system clock, but that has not helped. Can anyone see something obviously wrong in my code:
    protected class GraphTimerTask extends TimerTask {
         protected static final int DELAY = 31;
         protected long currentTime = 0;
         protected long previousTime = -1;
         private boolean isOn = false;
         protected Timer timer = null;
         public GraphTimerTask(Timer t) {
              this.timer = t;
              isOn = true;
         public void run() {
              if(previousTime > 0) {
                   currentTime += System.currentTimeMillis() - previousTime;
              else {
                   currentTime += DELAY;
                    Graph.this.repaint();
                 previousTime = System.currentTimeMillis();
         protected boolean isOn() { return isOn; }
         protected long getTime() { return currentTime; }
         protected void stop() { isOn = false; timer.cancel(); }
    }currentTime is the actual time that is repainted on my graph when the repaint() is called.

    Timer does not take into account the time taken to process the Timer event. The following is one of my simple examples of how to do something similar to what you want to do and to take into account (parially) the processing time..
    import java.awt.*;
    import javax.swing.*;
    import java.util.*;
    public class SimpleAnimation extends JFrame
        public SimpleAnimation()
            super("Simple Annimation Demo");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // The model instance
            AnnimationModel annimationModel = new AnnimationModel();
            // The view of the model
            AnimationView animationView = new AnimationView(annimationModel);       
            animationView.setPreferredSize(new Dimension(640, 480));
            // The view becomes the content pane
            setContentPane(animationView);
            pack();
        private static class AnimationView extends JPanel
            AnimationView(AnnimationModel annimationModel)
                // Save a reference to the model for use
                // when the view is updated
                annimationModel_ = annimationModel;
                // Listen for the events indicating that the model has changed
                annimationModel_.addObserver(new Observer()
                    public void update(Observable o, Object arg)
                        // All we need to do is to get the view to repaint
                        AnimationView.this.repaint();
            public void paintComponent(Graphics g)
                super.paintComponent(g);
                // Update the view based on the information in the model.
                g.setColor(Color.red);
                // Convert the model positions to view positions
                // in this case by scaling to the actual width and height.
                int xScreenPosition = scaleValue(annimationModel_.getX(), getWidth() - 20 ) + 5;
                int yScreenPosition = scaleValue(annimationModel_.getY(), getHeight() - 20 ) + 5;
                // Display the position of the point
                g.fillOval(xScreenPosition, yScreenPosition, 10, 10);
            private int scaleValue(double v, double size)
                return (int)((v+1.0)*0.5 * size + 0.5);
            // The saved reference to the model
            private AnnimationModel annimationModel_;
        private static class AnnimationModel extends Observable
            AnnimationModel()
                new Thread()
                    public void run()
                        long updatePoint = System.currentTimeMillis();
                        final long delta = 100;
                        final double deltaTheta =  2.0 * Math.PI * delta / (10.0 /* seconds  */ * 1000.0);
                        // Loop forever updating the model
                        // and notifying the observers.
                        while(true)
                            // Wait until the next frame update point
                            // The approach is to calcualte how long we have to wait. In
                            // this way we partially compensate for the processing time
                            updatePoint += delta;
                            synchronized (this)
                                while (updatePoint > System.currentTimeMillis())
                                    try
                                        this.wait(updatePoint - System.currentTimeMillis());
                                    catch (Exception e)
                                        // Nothing to do
                            // Update the model - in this case it is very simple
                            theta_ += deltaTheta;
                            // Notify the observers
                            setChanged();
                            notifyObservers();
                }.start();
            // Model access methods
            public double getX()
                return Math.cos(theta_);
            public double getY()
                return Math.sin(theta_);
            // The angular position of the point
            private double theta_;
        // Simple test main
        static public void main(String[] args)
            new SimpleAnimation().setVisible(true);
    }

  • How to read updated data from a real-time generated file?

    I have a question:
    I want to read the 10 mostly updated data from a real time generated data file. The data in this file is accumulated. how can i read mostly recently data to an applet? and further to using this data to draw a real-time graph? pls help
    kelvin t.l. tse

    Hi,
    I think there is no "typical" way. You will have to define a convention on how the new data are stored into the file, so as to know how to accessthem. If new data are simply put at theend of your file, you may use a RandomAccessFile to read only those lines that interest you (the 1 final lines).Otherwise, you should at least know how the data file is written.
    You can know if thedata file has been modified with the File.lastModified() method. This retrurns a long value corresponding to the date and hour the file was last modified. Store that value ito you appl. and perdiodically (use a Thread), compare that value with the value returned by lastModief(). If both value are NOt equal, then the file has been updated
    it's all a question of knowing how the data are stored into the datafie generated.
    Be also aware that you will probably have problem when your java appl. tries to read the file at the same time it is updated by the other application. I guess when theother application writes data into the file, you will not be able to read it. So, use try{} catch statements and first check to see if you can read the file with File. canRead(). If not, simply delay the reading process by asking a Thread.yield() or Thread.delay (1000)...
    vincent

  • PS CS5 real time drawing suddenly doesn't work anymore

    Suddenly real time drawing didn't work anymore. Neither with the brush tool nor the stamp tool for example. I didn't do any changes to the computer in the meantime.
    If I deactivate OpenGlide everything works fine again but there is no change if I swich it on again. Restarting the Computer also didn't work.
    Did anyone have the same experience or do you have an idea how to solve that problem (e.g. delete OpenGlide preferences for PS)?
    Thank you in advance.

    Sorry i meant OpenGL. I mixed it up with OpenGLide.
    Thank you for reminding me to go through every point of the usual to do list after an error occured.
    I forgot to update the grafic tablet driver as the system was running fine before.
    I had the Cintiq 21 UX 6.1.1-2 (wacom) driver installed and fixed it by installing the 6.1.6-4 driver.
    Thank you for helping me again too!
    If it helps other users it happened using PS CS5 12.0.2 on a Dual 2-Core 2,8. with MacOSX 10.6.6 (latest versions) installed.

  • How to save data in a 4D array and make partial plots in real time?

    Hi, this is a little complex, so bear with me...
    I have a test system that tests a number of parts at the same time. The
    experiment I do consists of measuring a number of properties of the
    parts at various temperatures and voltages. I want to save all the
    measured data in a 4-dimensional array. The indices represent,
    respectively, temperature, voltage, part, property.
    The way the experiment is done, I first do a loop in temperature, then
    in voltage, then switch the part. At this point, I measure all the
    properties for that condition and part and want to add them as a 1D
    array to the 4D array.
    At the same time, I want to make a multiple plot (on an XY graph) of
    one selected property and part (using two pull-down selectors near the
    XY graph) vs. voltage. (The reason I need to use an XY graph and not a
    waveform graph, which would be easier, is that I do not have
    equidistant steps in voltage, although all the voltage values I step
    through are the same for all cases). The multiple plots are the data
    sets at different temperatures. I would like to draw connection lines
    between the points as a guide to the eye.
    I also want the plot to be updated in the innermost for loop in real
    time as the data are measured. I have a VI working using nested loops
    as described above and passing the 4D array through shift registers,
    starting with an array of the right dimensions initialized by zeroes. I
    know in advance how many times all the loops have to be executed, and I
    use the ReplaceArraySubset function to add the measured properties each
    time. I then use IndexArray with the part and property index terminals
    wired to extract the 2D array containing the data I want to plot. After
    some transformation to combine these data with an array of the voltage
    values in the form required to pass to the XYGraph control, I get my
    plot.
    The problem is: During program execution, when only partial data is
    available, all the zero elements in the array do not allow the graph to
    autoscale properly, and the lines between the points make little sense
    when they jump to zero.
    Here is how I think the problem could be solved:
    1. Start with an empty array and have the array grow gradually as the
    elements are measured. I tried to implement this using Insert Into
    Array. Unfortunately, this VI is not as flexible as the Replace Array
    Subset, and does not allow me to add a 1D array to a 4D array. One
    other option would be to use the Build Array, but I could not figure
    out if this is usable in this case.
    2. The second option would be to extract only the already measured data
    points from the 4D array and pass them to the graph
    3. Keep track of the min. and max. values (only when they are different
    from zero) and manually reset the graph Y axis scale each time.
    Option 3 is doable, but more work for me.....
    Option 2: I first tried to use Array Subset, but this always returns an
    array of the same dimensionality of the input array. It seems to be
    very difficult, but maybe not impossible, to make this work by using
    Index Array first followed by Array Subset. Option 3 seems easier.
    Ideally, I would like option 1, but I cannot figure out how to achieve
    this.
    Your help is appreciated, thanks in advance!
    germ Remove "nospam" to reply

    In article <[email protected]>,
    chutla wrote:
    > Greetings!
    >
    > You can use any of the 3D display vi's to show your "main" 3d
    > data, and then use color to represent your fourth dimension. This can
    > be accessed via the property node. You will have to set thresholds
    > for each color you use, which is quite simple using the comparison
    > functions. As far as the data is concerned, the fourth dimension will
    > be just another vector (column) in your data file.
    chutla, thanks for your post, but I don't want a 3D display of the
    data....
    > Also, check out
    > the BUFFER examples for how to separate out "running" data in real
    > time.
    Not clear to me what you mean, but will c
    heck the BUFFER examples.
    > As far as autoscaling is concerned, you might have to disable
    > it, or alternatively, you could force a couple of "dummy" points into
    > your data which represent the absolute min/max you should encounter.
    > Autoscaling should generally be regarded as a default mode, just to
    > get things rolling, it should not be relied on too heavily for serious
    > data acquisition. It's better to use well-conditioned data, or some
    > other means, such as a logarithmic scale, to allow access to all your
    > possible data points.
    I love autoscaling, that's the way it should be.
    germ Remove "nospam" to reply

  • I would like to see the time in a waveform graph (real-time​)

    i need the x-axis of the waveform graph to show real time (from the computer clock). I have made a program with all the example. He read and log data when the chosen time has elapsed. the program work's well...but i dont't know why the x-axis blink every time he draw a point
    i can see two x-axis in the same time.
    i give you a picture of one of a part of my program, i hope someone can help me
    Attachments:
    my_software.JPG ‏128 KB

    Hi,
    I tried to reproduce what you were getting by building a simple VI but I havent had much luck (I have attached the VI).
    Could you post your code so that I can take a look at it?
    Feroz P
    National Instruments
    Attachments:
    Graph.vi ‏39 KB

  • Real time Java Communication

    I need help on developing a elearning application that enables real time communication. Can anyone help me on how to start to who can help me?

    Hi,
    I pretty new in Java. My understanding of both of the applications is very vague. Can you help me over here? Are those yahoo games considered stand alone?
    Currently i have developed a GUI, bascically an interface for users to communicate. However, that is only a dummy without any event driven. I was wondering what is needed to allow users to communicate real time. For eg...chat function like icq or audio coomunication like video conferencing. Thanks! Pls advise.

  • 'Read JPEG File.vi' does not seem to work on PXI with real-time OS

    I am trying to read a jpeg file on a PXI system with LabVIEW real-time on it. To test I created a very simple VI (attached) with only 4 objects: 'Path' --> 'Read JPEG File.vi' --> 'Draw Flattened Pixmap.vi' --> 'Picture'.
    This VI works fine on my Windows XP host machine, but it does not work on the PXI system. The error code 1 occurs in 'Read JPEG File.vi'.
    The jpeg picture is in the same directory as the VI. I don't think I got the path or filename wrong because if I change the file or path name I get another error: 7: 'File/Directory Info in Check Path.vi->Read JPEG File.vi->test.vi'.
    Maybe reading jpeg files is not supported on realtime systems? I could not find anything about it. Sol
    utions or workarounds are of course welcome!
    Attachments:
    Test_Read_JPEG.vi ‏23 KB

    'Read JPEG File.vi' is not supported on LabVIEW RT. I believe it has to do with special functions or libraries need to be called due to the JPEG image type. Instead you can use a Bitmap and the 'Read BMP File.vi', which I believe is completely implemented in G code.
    Keep in mind that the RT System doesn't really have a front panel and that the front panel is only 'available' when LabVIEW is connected to the target such as being targeted or having a remote panel to it. Generally, a deployed RT system doesn't have a UI and just communicates to a Host VI which acts as the UI. Having said that, the BMP file worked when I tested.
    Regards,
    JR A.

  • Painting in symetry in real-time?

    Hey,
    I want to be able to paint using any paint brush tool, and have Photoshop copy the brush strokes in real-time on either the X or Y or both axis'. For example, if i draw one half of a person, the other half will draw itselt exactly the same on the opposite side of the canvas.
    Can anyone help me figure out a way to do this either here or through a tutorial please?
    Thanks

    Ah ok sorry i miss understood. How do i define the texture mapping on a postcardto allow for this i can't seem to find the options for it. :\
    Thanks, Ricky
    EDIT:
    The only way i've managed to do this is by creating a poly-plane in Maya, sorting out it's UV's to mirror, then importing the OBJ into Photoshop. However i'm hoping this isnt what must be done every time i want to draw symmetrically.
    Also once i've done this, is there a way to make the plane snap to the size of the canvas and fill it? because when i opened it it was at an angle.

  • Liquid Analytics enables the sales force in real-time

    Problem
    The success of wholesale and manufacturing distribution operations largely hinges on the efficacy of sales teams that must deal with a host of pricing and product challenges. For the sales group, the biggest game changer is their ability to access and leverage insight into the customer’s behavior and historical buying patterns.
    Due to the technological limitations of the past, the sales team was unable to access information about customers’ buying patterns, leverage new products, establish dynamic pricing, and set realistic goals and as a result would miss opportunities with customers or lose their faith altogether.
    Even with these pressing needs noted and observed, not just any technology can be introduced to a sales team and expect to be adopted. This is because the unique characteristics of the sales force must be carefully considered in order to seamlessly integrate new technologies aimed at sales enablement.
    Liquid analytics understands the field and the interplay between marketers, sales teams, and customers and uses this knowledge to inform its technology. The firm understands that the sales force operates primarily in the field and therefore does not have the capability to manually input data into sales tracking forms, or that sales teams with different products visit the same customers but do not necessarily work in tandem to leverage each other’s footprints. Without a foolproof means of measurement and assessment in the field, the disconnect between the sales and marketing teams is often heightened making set goals unrealistic for sale representatives.
    Solution
    Liquid analytics uses its understanding of the sales archetype and big data and predictive analytics to bring viability to its target industries when it counts most. The proprietary technology takes predictive algorithms and mobile tracking, visualizing the various components in a comprehensive, easy-to-use dashboard. For mobile sales representatives, valuable information can be easily searched on an account, and sales activity is easily logged to demonstrate ROI.
    For wine and liquor sales representatives, the solution has been proven to do a number of things:
    The technology uses algorithms based on history of sales which are able to forecast what will be needed and allows the sales team to make fact- based orders, save time on each customer account by avoiding duplication, and increase customer loyalty. In addition, access to inventory in real time allows the sales rep to deliver in a timely manner and avoid missed shipments by 95 percent.
    The Liquid analytics dashboard allows representatives selling liquor, wine or beer to view one universal dashboard to note what sales tasks have yet to be done or have been completed and develop a workflow that collectively benefits all representatives on the account.
    The leaderboard creates a gamification experience for the sales team meant to increase sales by incentivizing through potential conversion rates and goal reward system.
    On an individual basis, representatives are able to log their hours and use the record to negotiate better terms. Logged hours also provide context as to whether a representative is spending too much time while profitability remains low, leading to new sales strategies.
    The feedback loop between the marketing and sales team is closed as the solution generates real-time notifications about where media is used by sales team as well as categorizes product attributes that can be used for better product placement and targeted campaigns.
    Watch the Video
    Join the conversation and follow us on twitter @SAPstartups #HANAusecases.

    Thanks for this pointer.
    I followed this link and enabled 0fi_gl_4 for real time reporting in R/3
    What do I do now in BW side I already have a infsource that I am updating a DSO/ODS in BW. What do I need to do in BW side to ensure that the data in R/3 will flow through to BW.
    Thanks
    Karen

  • After Effects will not RAM Preview in real time

    Recently I have started working on a new project and can't work on it because my RAM Previews are not in real time anymore. I have only had this problem since I started this project a few days ago. Every other project I have done I've never had this problem before.
    I have 10 GB of ram allocated to After Effects, my clips are in 59.94 fps which I have set the composition to as well. When I ram preview it tells me 50.019/59.94 I know what this mean, I understand it's telling me to change my composition's frame rate to 50 frames, however if I do this then music plays too slow. Right now my problem is that the clips aren't playing fast enough for me to see if my editing and time syncing is acurate. When I render the video everything is synced up fine but this is making my editing very inconvenient and I would like a fix please. I tried: Clearing my disk and media cache, unchecking "render multiple frames at once", taking off all effects on the clips, using different clips, AND even reinstalling After Effects CS6 but nothing has worked. I really badly need a fix to this problem. Any help would be greatly appreciated thanks!!

    > The clips are in 59.94 frames, so the composition is in 59.94 frames. If when I upload to the internet it goes down in frame rate so be it.
    You are misunderstanding the typical video workflow.
    Composition setting are supposed to match the characteristics of the intended output, not necessarily the characteristics of the imported footage. This is how you ensure that what you preview exactly matches what you output and what your viewers will see. Consider, also, that most compositions use assets with many different frame rates, sizes, etc.
    > I do have a large monitor but I've been using this monitor since December and haven't had a problem with it until now.
    Great. But you're having a problem now. And it's because of a bottleneck somewhere between your RAM and drawing the pixels to the screen. One more reason that this might be happening is that you're running a GPU-heavy application; note that web browsers can also be GPU hogs these days.

  • Simulation and complete lack of real time

    Hi,
    I have installed multisim and put down a a very basic 555 timer where  I noticed everything is in slow motion.
    So I hooked up a signal gen to a scope at 50 hz, the scope then draws the signal wave at less than 1hz?
    My processor is almost on idle so I cannot forsee any lack of processing power.
    What completly blows me away is that NO where in the manual is this made obvious, how can simulation of electronics be done at 1/10th of the real speed?
    What even confuses me even more is that if I up the freq of the signal gen, I get  proper high speed results plotted on the scope, so this means it has nothing to do with CPU usuage.
    When I plot 50hz I get this rediculous slow motion less than 1hz on the output of the scope.
    please help explain this?
    cheers
    Gavin

    I usually have the opposite situation. My low frequency signals are usually fairly fast and my high frequency signals simulate extremely slow.
    Multism using the transient simulation (pressing the run button)  does not run in "real time". The time indicator at the very bottom of the screen indicates what I would refer to as circuit time. It is the exact time in the real world that it would take for a circuit to accomplish what it is doing even though it may take 1 minute of our clock time to simulate a 1 second circut event. The reason behind this is that it take time for all the spice commands and circuit mathmatics to be executed, interpreted, and then a solution arrived at and then all the outputs plotted on the instruments. It is this number crunching "on the fly" that makes the simulator run out of sync with real time.
    One thing that can be used to speed things up is to look under SIMULATE>INTERACTIVE SIMULATOR SETTINGS then go down to where it says Set Maimum Timesteps (TMAX). Click the circle next to Maimum Time Step (TMAX) and in the the little box to the right change it from 1e-005 to 1e003.
    With the obve setting you can approach real time with simple circuits, but with more complex circuits or high frequency circuits this could cause problems as the simulator doesn't have time to converge to a solution and you will get "time step too small" errors or the output will not look as you expected it to look.. This setting is basically the resolution setting of the simulator. The lower this setting is the less accuate the results but the simulation speed is faster. The higher this setting is the more accuare the results but the slower the simulation speed.
    I hope I have helped somewhat and that this helps explain what you are seeing. 
    Message Edited by lacy on 10-28-2007 08:30 AM
    Kittmaster's Component Database
    http://ni.kittmaster.com
    Have a Nice Day

  • Real time intensity graphs

    Hi,
    Can somone tell me if it is possible to make intensity plots real time.
    I am currently
    filling a 256 by 256 array one row at a time with data from a counter. I
    would like to
    plot each row as it comes out without replotting any old rows nor any new
    rows of the
    array currently empty of data. Using the command PlotIntensity forces me
    to replot
    the entire 256 by 256 array each time which tremendously slows down the program.
    If anyone can help this would be much appreciated
    thanks
    ken

    > Can somone tell me if it is possible to make intensity plots real time.
    I solved this problem rather nicely by using a canvas and the CanvasScroll
    function. You can draw line or blocks of color (after having scaled them
    properly, but that is easy) on the right side and then scroll to the left by
    the same amount of pixel.
    Guillaume Dargaud
    CNR/IFA
    http://sung3.ifsi.rm.cnr.it/~dargaud/Hack/LabWindo​ws.html
    http://sung3.ifsi.rm.cnr.it/~domec/
    http://sung3.ifsi.rm.cnr.it/~chooyu/
    1. When computing, whatever happens, behave as though you meant it to
    happen.
    2. When you get to the point where you really understand your computer, it's
    probably obsolete.
    3. The first place to look for information is in the section of the manual
    where you least expect to find
    it.
    4. When the going gets tough, upgrade.
    5. For every action, there is an equal and opposite malfunction.
    6. To err is human... to blame your computer for your mistakes is even more
    human, it is downright natural.
    7. He who laughs last probably made a back-up.
    8. If at first you do not succeed, blame your computer.
    9. A complex system that does not work is invariably found to have evolved
    from a simpler system that worked just fine.
    10. The number one cause of computer problems is computer solutions.
    11. A computer program will always do what you tell it to do, but rarely
    what you want to do.
    - Murphy's Laws of Computing.

  • Real-time support in Java SE Embedded

    From what I understand, Java SE Embedded is a slimmed down SE JDK/JRE compiled to support different typical embedded processors, ARM etc.
    Does Java SE Embedded provide any additional support for handling realtime situations? For example, are there any JVM modifications to guarantee response times and execution times for time critical scenarios?
    The reason for asking is that I know a while back there was a specific Real Time Java release - did any of this technology get rolled into the new SE Embedded?
    Thanks.

    Yes, Java3D or an openGL toolkit such as JOGL or LWJGL is probably the best choice. Bearing in mind that Java3D is on the way out you may want to look at using OpenGL although there is much talk over at javagaming.org of putting together an open-source Java3D-like scenegraph renderer for the openGL toolkits and the guy working on it is very good indeed so it will probably happen. Assuming that it does, time spent learning Java3D is not wasted time.
    If you are interested in Java3D download the API and tutorials and see how you get on with it. I put together a fairly gaming oriented tutorial here http://www.newview.co.uk/e/tutorials/java3d/index.jsp which may help you get started.
    If you are serious about writing games in Java you will want to get over to the javagaming forums http://www.javagaming.org/cgi-bin/JGNetForums/YaBB.cgi because that is where you can generally find the best advice. There are a number of old threads on this question there and you will probably find it well worth your while to look through the older posts on it.

Maybe you are looking for