I only see a bunch of small collections (I tried on
  6u10) - probably because for each pixel you set an
  int[1] array is created.

  I don't see the heap growing. Run it with -verbose:gc ,
  see what it says.

  If you want to try the approach Clemens suggested, you'll
  only need to change your random_fill method:
   import java.awt.image.DataBufferInt;
   ...
    int data[] = ((DataBufferInt)(_bimg.getRaster().getDataBuffer())).getData();
    for (int i = 0; i < data.length; i++) {
        r = rand.nextInt() % 256;
        g = rand.nextInt() % 256;
        b = rand.nextInt() % 256;
        data[i] = 0xff<<24 | r<<16 | g<<8 | b;
    }

  (in real life examples you'll need to calculate
   the index for each element based on raster's
   data)

  Note that you can only cast to DataBufferInt here
  because you create an INT_RGB image.

  Also, getting the DataBuffer of a BufferedImage
  will forfeit any possibility of caching this image
  in video memory. For this particular case
  it doesn't matter that much since you're updating
  it on every frame, but it is something that needs
  to be considered.

  You can use DataBuffer to set pixels without
  having to reference the array directly - by using
  DataBufferInt.setElem(i, val). This will keep the
  possibility of the image being cached in vram, but
  may be slightly slower than direct array access
  approach.

  Thanks,
    Dmitri


[EMAIL PROTECTED] wrote:
As requested, here a small runnable test. When you run it please start the JVM with 
something like "-XX:NewSize=256m -XX:MaxNewSize=256m", elsehow the memory 
message wont be of much use.

Here comes the code:

-----------------------------------------------------------------------------------------------------------------------

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Small example to compare MemoryImageSource and BufferedImage.
* * @author kif
 *
 */
public class SetPixelTest {
        private static MyDrawingArea _mda;
        private static boolean _use_mis = false;
        private static JCheckBox _jcb_use_mis;
        
        public static class MyDrawingArea extends JPanel {
                private static int IMG_WIDTH = 256;
                private static int IMG_HEIGHT = 256;
                
                // either use a BufferedImage ...
                private BufferedImage _bimg;
                
                // ... or a MemoryImageSource
                private Image _img;
                protected int[] _pixels;
                protected MemoryImageSource _mis;
                
                public MyDrawingArea() {
                        setPreferredSize(new Dimension(400,400));
                        setBackground(Color.black);
                        
                        _bimg = new BufferedImage(IMG_WIDTH,IMG_HEIGHT, 
BufferedImage.TYPE_INT_ARGB);
                        _pixels = new int[IMG_WIDTH*IMG_HEIGHT];
                        _mis = new MemoryImageSource(IMG_WIDTH, IMG_HEIGHT, 
_pixels, 0, IMG_WIDTH);
                        _mis.setAnimated(true);
                        _img = createImage(_mis);
                }
                
                public void random_fill() {
                        Random rand = new Random();
                        int r, g, b, rgb;
                        
                        if (_use_mis) { // MemoryImage Source
                                int pixel_counter = 0;
                                for (int y=0; y<IMG_HEIGHT; y++) {
                                        for (int x=0; x<IMG_WIDTH; x++) {
                                                r = rand.nextInt() % 256;
                                                g = rand.nextInt() % 256;
                                                b = rand.nextInt() % 256;
                                                rgb = 0xff<<24 | r<<16 | g<<8 | 
b;
                                                _pixels[pixel_counter++] = rgb;
                                        }
                                }
                                _mis.newPixels();
                        } else { // BufferedImage
                                for (int y=0; y<IMG_HEIGHT; y++) {
                                        for (int x=0; x<IMG_WIDTH; x++) {
                                                r = rand.nextInt() % 256;
                                                g = rand.nextInt() % 256;
                                                b = rand.nextInt() % 256;
                                                rgb = 0xff<<24 | r<<16 | g<<8 | 
b;

                                                _bimg.setRGB(x, y, rgb);
                                        }
                                }
                        }
                        repaint();
                }
                
                public void paint(Graphics g) {
                        if (_use_mis) { // MemoryImage Source
                                g.drawImage(_img, 0, 0, getWidth(), 
getHeight(), this);
                        } else { // BufferedImage
                                g.drawImage(_bimg, 0, 0, getWidth(), 
getHeight(), this);
                        }
                }
        }
        
        /**
         * @param args
         */
        public static void main(String[] args) {
                JFrame window = new JFrame("Pixel Performance Test");
                _mda = new MyDrawingArea();
                
                // if someone closes the main window, the program shall end.
                window.addWindowListener(new WindowAdapter() {
                                public void windowClosing(WindowEvent e) {
                                        System.exit(0);
                                }
                });

                JButton jb_fill = new JButton("Random Fill");
                jb_fill.addActionListener(new ActionListener() {
                        public void actionPerformed(ActionEvent e) {
                                for (int i=0; i<10; i++) {
                                        _mda.random_fill();
                                }
                                
                                
System.out.println((Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/(1024*1024)
                                +" / 
"+Runtime.getRuntime().totalMemory()/(1024*1024)+"MB");
                        }
                });

                _jcb_use_mis = new JCheckBox("Use MemoryImageSource");
                _jcb_use_mis.addItemListener(new ItemListener() {
                        public void itemStateChanged(ItemEvent e) {
                                _use_mis = _jcb_use_mis.isSelected();
                        }
                });
                JPanel buttons = new JPanel();
                buttons.add(jb_fill);
                buttons.add(_jcb_use_mis);

                window.setLayout(new BorderLayout());
                window.add(_mda, BorderLayout.CENTER);
                window.add(buttons, BorderLayout.SOUTH);
                window.pack();
                
                window.setVisible(true);
        }

}

-----------------------------------------------------------------------------------------------------------------------

Just run it and press the button a few times. Then click on the Checkbox and 
repeat.

MfG;
ChaosE
[Message sent by forum member 'chaose71' (chaose71)]

http://forums.java.net/jive/thread.jspa?messageID=269278

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to