У меня есть особая проблема в простой системе частиц, которую я написал, и теперь она мучает меня.
//Code that does NOT cause memory leak
public void draw(Graphics g) {
if (life > 0) {
g.setColor(new Color(0, 0, 0,255));
g.fillOval(x, y, 10, 10);
}
}
//Code that does cause memory leak
public void draw(Graphics g) {
if (life > 0) {
g.setColor(new Color(0, 0, 0, 127));
g.fillOval(x, y, 10, 10);
}
}
Как указано выше, первый блок кода не вызывает утечку памяти, но когда яизмените значение альфа на менее чем 255, это приведет к тому, что использование оперативной памяти программ увеличится до 1,8 ГБ.Сначала я думал, что это из-за нового ключевого слова, но потом я понял, что это произойдет, только если я изменю альфа-значение на значение меньше 255. Любая помощь в том, как решить эту проблему, будет оценена, понимание еще более приветствуется.
по запросу я добавил базовый пример кода использования.
Main:
public class Main {
public static void main(String[] args) {
MyFrame frame = new MyFrame("test");
}
}
JFrame:
public class MyFrame extends JFrame {
MyPanel pane = new MyPanel();
public MyFrame(String title)
{
setTitle(title);
setSize(400,400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
add(pane);
setVisible(true);
}
}
И, наконец, JPanel:
public class MyPanel extends JPanel {
java.util.Timer timer = new Timer();
public MyPanel()
{
//create time to just repaint 60 times a second
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
repaint();
}
},16,16);
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillRect(0,0,500,500);
//for loop to just redraw blocks to show leak
for (int i = 0; i < 20;i++)
{
for (int c =0; c < 20;c++)
{
/*
create new color which causes leak, if you set the alpha
value to 255 it does not create the leak anymore
*/
g.setColor(new Color(i * (255/ 20),0,c * (255/ 20),127));
g.fillRect(i * 10,c * 10, 10,10);
}
}
}
}