Решил сравнить Swing и Qt в плане отрисовки окошек на небольшом примере из Qt Examples. Набросал аналогичный код на Java (см. ниже) и получилось у меня вот так:
Сразу же возникает вопрос: почему шрифт в JTextArea какой-то не правильный?
Но самое интересное, что при ресайзе этих окошек Qt все делает просто моментально и плавно, а в Java почему-то все происходит рывками и с заметным шлейфом от перерисовки рамки окна. Вопрос: что же я делаю не так? Или это вообще свойственно для Swing тормозить подобным образом даже для таких простых окошек?
Также глянул на вкладку Performance в Process Explorer для каждого из процессов:
Особенно заметна разница в потреблении памяти — java использует почти в 10 раз больше! Больше 100Мб для окошка, растянутого почти на весь экран, это нормально для Swing? Неужели действительно такая большая разница? Наверняка я что-то делаю не правильно...
Вот мой код на Java:
import static java.awt.GridBagConstraints.BOTH;
import static java.awt.GridBagConstraints.CENTER;
import static java.awt.GridBagConstraints.HORIZONTAL;
import static java.awt.GridBagConstraints.NONE;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.GroupLayout.ParallelGroup;
import javax.swing.GroupLayout.SequentialGroup;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
@SuppressWarnings("serial")
public class BasicLayouts extends JFrame {
public BasicLayouts() {
super("Basic layouts");
// create components of window
createMenuBar();
Container horizontalLayout = createHorizontalGroupBox();
Container gridLayout = createGridLayout();
Container formLayout = createFormLayout();
Container textArea = createTextArea();
Container dialogButtons = createDialogButtons();
// set group layout to content pane
Container contentPane = getContentPane();
GroupLayout mainLayout = new GroupLayout(contentPane);
contentPane.setLayout(mainLayout);
mainLayout.setAutoCreateContainerGaps(true);
mainLayout.setAutoCreateGaps(true);
// add components of window to group layout
mainLayout.setHorizontalGroup(mainLayout.createParallelGroup()
.addComponent(horizontalLayout).addComponent(gridLayout).addComponent(
formLayout).addComponent(textArea).addComponent(dialogButtons));
mainLayout.setVerticalGroup(mainLayout.createSequentialGroup()
.addComponent(horizontalLayout).addComponent(gridLayout).addComponent(
formLayout).addComponent(textArea).addComponent(dialogButtons));
//
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setMinimumSize(getSize());
setVisible(true);
}
private void createMenuBar() {
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
fileMenu.setMnemonic(KeyEvent.VK_F);
JMenuItem exitItem = new JMenuItem(new AbstractAction() {
{
putValue(NAME, "Exit");
putValue(MNEMONIC_KEY, KeyEvent.VK_X);
}
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(exitItem);
menuBar.add(fileMenu);
setJMenuBar(menuBar);
}
private Container createHorizontalGroupBox() {
JPanel panel = new JPanel();
GroupLayout groupLayout = new GroupLayout(panel);
groupLayout.setAutoCreateGaps(true);
final int nButtons = 4;
SequentialGroup horizontalGroup = groupLayout.createSequentialGroup();
ParallelGroup verticalGroup = groupLayout.createParallelGroup();
for (int i = 1; i <= nButtons; i++) {
JButton button = new JButton("Button " + i);
horizontalGroup.addComponent(button, GroupLayout.DEFAULT_SIZE,
GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
verticalGroup.addComponent(button);
}
groupLayout.setHorizontalGroup(horizontalGroup);
groupLayout.setVerticalGroup(verticalGroup);
panel.setLayout(groupLayout);
Insets insets = new Insets(2, 2, 2, 2);
panel.setBorder(new CompoundBorder(new TitledBorder("Horizontal layout"),
new EmptyBorder(insets)));
return panel;
}
private Container createGridLayout() {
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
JLabel label1st = new JLabel("Line 1:");
JLabel label2nd = new JLabel("Line 2:");
JLabel label3rd = new JLabel("Line 3:");
JTextField textField1st = new JTextField();
JTextField textField2nd = new JTextField();
JTextField textField3rd = new JTextField();
JTextArea textArea = new JTextArea(
"This widget takes up about two thirds of the grid layout.");
textArea.setLineWrap(true);
textArea.setWrapStyleWord(true);
JScrollPane scrollPane = new JScrollPane(textArea);
Insets insets = new Insets(2, 2, 2, 2);
panel.setBorder(new CompoundBorder(new TitledBorder("Grid layout"),
new EmptyBorder(insets)));
Component glue = Box.createGlue();
panel.add(glue, new GridBagConstraints(0, 0, 2, 1, 0.5, 1.0, CENTER, BOTH,
insets, 0, 0));
panel.add(label1st, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, CENTER,
NONE, insets, 0, 0));
panel.add(label2nd, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, CENTER,
NONE, insets, 0, 0));
panel.add(label3rd, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, CENTER,
NONE, insets, 0, 0));
panel.add(textField1st, new GridBagConstraints(1, 1, 1, 1, 0.5, 0.0,
CENTER, HORIZONTAL, insets, 0, 0));
panel.add(textField2nd, new GridBagConstraints(1, 2, 1, 1, 0.5, 0.0,
CENTER, HORIZONTAL, insets, 0, 0));
panel.add(textField3rd, new GridBagConstraints(1, 3, 1, 1, 0.5, 0.0,
CENTER, HORIZONTAL, insets, 0, 0));
panel.add(scrollPane, new GridBagConstraints(2, 0, 1, 4, 1.0, 1.0, CENTER,
BOTH, insets, 0, 0));
Dimension zeroSize = new Dimension(0,
textField1st.getPreferredSize().height);
textField1st.setPreferredSize(zeroSize);
textField2nd.setPreferredSize(zeroSize);
textField3rd.setPreferredSize(zeroSize);
scrollPane.setPreferredSize(zeroSize);
return panel;
}
private Container createFormLayout() {
JPanel panel = new JPanel();
GroupLayout groupLayout = new GroupLayout(panel);
groupLayout.setAutoCreateGaps(true);
JLabel label1st = new JLabel("Line 1:");
JLabel label2nd = new JLabel("Line 2, long text:");
JLabel label3rd = new JLabel("Line 3:");
JTextField textField = new JTextField();
JComboBox comboBox = new JComboBox();
JSpinner spinner = new JSpinner();
groupLayout.setHorizontalGroup(groupLayout.createSequentialGroup()
.addGroup(
groupLayout.createParallelGroup().addComponent(label1st)
.addComponent(label2nd).addComponent(label3rd)).addGroup(
groupLayout.createParallelGroup().addComponent(textField)
.addComponent(comboBox).addComponent(spinner)));
groupLayout.setVerticalGroup(groupLayout.createSequentialGroup().addGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(label1st).addComponent(textField)).addGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(label2nd).addComponent(comboBox,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE,
GroupLayout.PREFERRED_SIZE)).addGroup(
groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
.addComponent(label3rd).addComponent(spinner)));
panel.setLayout(groupLayout);
Insets insets = new Insets(2, 2, 2, 2);
panel.setBorder(new CompoundBorder(new TitledBorder("Form layout"),
new EmptyBorder(insets)));
return panel;
}
private Container createTextArea() {
JTextArea textArea = new JTextArea(
"This widget takes up all the remaining space "
+ "in the top-level layout.");
textArea.setLineWrap(true);
textArea.setRows(4);
return new JScrollPane(textArea);
}
private Container createDialogButtons() {
JPanel panel = new JPanel();
JButton ok = new JButton("OK");
JButton cancel = new JButton("Cancel");
GroupLayout groupLayout = new GroupLayout(panel);
groupLayout.setAutoCreateGaps(true);
groupLayout.setHorizontalGroup(groupLayout.createSequentialGroup().addGap(
0, 0, Short.MAX_VALUE).addComponent(ok).addComponent(cancel));
groupLayout.setVerticalGroup(groupLayout.createParallelGroup()
.addComponent(ok).addComponent(cancel));
groupLayout.linkSize(ok, cancel);
panel.setLayout(groupLayout);
return panel;
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new BasicLayouts();
}
});
}
}
Здравствуйте, kamre, Вы писали:
K>Решил сравнить Swing и Qt в плане отрисовки окошек на небольшом примере из Qt Examples. Набросал аналогичный код на Java (см. ниже) и получилось у меня вот так:
Какая версия JVM? K>Сразу же возникает вопрос: почему шрифт в JTextArea какой-то не правильный?
В Java давно проблема со шрифтами, так как отрисовка своя собственная даже шрифтов. http://rsdn.ru/forum/message/1580305.1.aspx
K>Но самое интересное, что при ресайзе этих окошек Qt все делает просто моментально и плавно, а в Java почему-то все происходит рывками и с заметным шлейфом от перерисовки рамки окна. Вопрос: что же я делаю не так? Или это вообще свойственно для Swing тормозить подобным образом даже для таких простых окошек?
Там достаточно длинная цепочка вызовов Layout manager. К тому же в client JVM она скорее всего долгое время интерпретируется пока до JIT дело не дойдет.
K>Особенно заметна разница в потреблении памяти — java использует почти в 10 раз больше! Больше 100Мб для окошка, растянутого почти на весь экран, это нормально для Swing? Неужели действительно такая большая разница? Наверняка я что-то делаю не правильно...
JVM не ограничивается одним Swing. Это достаточно толстая такая прослойка в целом.
И, да. UI в Java как хромал так и хромает, хотя уже много делается для того чтобы это исправить. QT, конечно же более выигрышно смотрится.
Для Java кроме Swing существуют и другие решения.
Так вроде бы уже с 1.6.10 отрисовка делается через системные вызовы? Да и на скриншотах видно, что cleartype в java "правильный".
B>Там достаточно длинная цепочка вызовов Layout manager. К тому же в client JVM она скорее всего долгое время интерпретируется пока до JIT дело не дойдет.
Т.е. именно поэтому приложения на Swing тормозят подобным образом? И это никак не исправить?
K>>Особенно заметна разница в потреблении памяти — java использует почти в 10 раз больше! Больше 100Мб для окошка, растянутого почти на весь экран, это нормально для Swing? Неужели действительно такая большая разница? Наверняка я что-то делаю не правильно... B>JVM не ограничивается одним Swing. Это достаточно толстая такая прослойка в целом.
Ну не в 10 же раз... И это еще по сравнению с Qt, которая тащит свои достаточно толстые runtime библиотеки. Изначально при старте Java приложение занимает где-то под 30Мб (как раз весь рантайм нужный загрузился), но зачем оно потом до 100Мб отжирает?
B>И, да. UI в Java как хромал так и хромает, хотя уже много делается для того чтобы это исправить. QT, конечно же более выигрышно смотрится. B>Для Java кроме Swing существуют и другие решения.
Swing и Qt весьма похожи в том, что все компоненты рисуют сами с нуля, а не пользуются системными. Но как-то у Qt это заметно лучше получается: гораздо быстрее и отличий меньше от системного LAF.
Т.е. с кодом на Java у меня более или менее все в порядке и положение уже не улучшить?
K>Так вроде бы уже с 1.6.10 отрисовка делается через системные вызовы? Да и на скриншотах видно, что cleartype в java "правильный".
Можно ссылочку? Я такого не помню.
Здесь только несколько фиксов связаных с рендерингом, которые дают повод для сомнений в нативном рендеринге: http://java.sun.com/javase/6/webnotes/6u10.html
B>>Там достаточно длинная цепочка вызовов Layout manager. К тому же в client JVM она скорее всего долгое время интерпретируется пока до JIT дело не дойдет. K>Т.е. именно поэтому приложения на Swing тормозят подобным образом? И это никак не исправить?
Почему-же. Можно поиграться с настройками JVM. mixed mode, client mode и ключи для JIT.
Можно даже профайлер запустить и посмотреть, вдруг это лечится.
K>Ну не в 10 же раз... И это еще по сравнению с Qt, которая тащит свои достаточно толстые runtime библиотеки. Изначально при старте Java приложение занимает где-то под 30Мб (как раз весь рантайм нужный загрузился), но зачем оно потом до 100Мб отжирает?
И все же JVM не Qt, а Qt не JVM. Поэтому данное сравнение не совсем корректно. А ещё GC. Можно попробовать ограничить размер хипа через -Xmx. Хотя ни к чему хорошему это не приведет. Опять же особо любознательные могут запустить профайлер.
K>Swing и Qt весьма похожи в том, что все компоненты рисуют сами с нуля, а не пользуются системными. Но как-то у Qt это заметно лучше получается: гораздо быстрее и отличий меньше от системного LAF.
Именно поэтому Qt на столько популярен, а Swing совсем нет.
K>Т.е. с кодом на Java у меня более или менее все в порядке и положение уже не улучшить?
На вскидку никаких видимых проблем не обнаружено.
Всё таки — вы сравниваете C++ Qt vs Java Swing...
Java кушает память — да, Свинг удобен своей MVC, после использования его коммерческие гриды для .net кажутся странным произведением...
после кодинга на C++ программы на Java кажуться обжорами и медленными...
B>>В Java давно проблема со шрифтами, так как отрисовка своя собственная даже шрифтов. B>>http://rsdn.ru/forum/message/1580305.1.aspx
K>Так вроде бы уже с 1.6.10 отрисовка делается через системные вызовы? Да и на скриншотах видно, что cleartype в java "правильный".
Поиграйтесь со следующими параметрами http://java.sun.com/j2se/1.5.0/docs/guide/2d/flags.html
Здравствуйте, Blazkowicz, Вы писали:
B>>>В Java давно проблема со шрифтами, так как отрисовка своя собственная даже шрифтов. B>>>http://rsdn.ru/forum/message/1580305.1.aspx
K>>Так вроде бы уже с 1.6.10 отрисовка делается через системные вызовы? Да и на скриншотах видно, что cleartype в java "правильный". B>Можно ссылочку? Я такого не помню. B>Здесь только несколько фиксов связаных с рендерингом, которые дают повод для сомнений в нативном рендеринге: B>http://java.sun.com/javase/6/webnotes/6u10.html
Так как раз по этой ссылке и написано: "6656651 Windows Look and Feel LCD glyph images have some differences from native applications." И теперь в NetBeans и в IDEA (Windows LAF) шрифт выглядит не хуже, чем в Eclipse.
B>>>Там достаточно длинная цепочка вызовов Layout manager. К тому же в client JVM она скорее всего долгое время интерпретируется пока до JIT дело не дойдет. K>>Т.е. именно поэтому приложения на Swing тормозят подобным образом? И это никак не исправить? B>Почему-же. Можно поиграться с настройками JVM. mixed mode, client mode и ключи для JIT. B>Можно даже профайлер запустить и посмотреть, вдруг это лечится.
Неужели рассчет Layout такой ресурсоемкий? Что-то не очень верится. Да и с Metal LAF меньше томозит, хотя пересчет Layout такой же должен быть. И вообще, если еще и
JFrame.setDefaultLookAndFeelDecorated(true);
сделать в начале main, то уже довольно быстро работает с Metal LAF. И кстати объем испольуемой памяти для Metal LAF не растет, так в пределах 35Мб где-то и остается все при изменении размеров окна.
K>>Ну не в 10 же раз... И это еще по сравнению с Qt, которая тащит свои достаточно толстые runtime библиотеки. Изначально при старте Java приложение занимает где-то под 30Мб (как раз весь рантайм нужный загрузился), но зачем оно потом до 100Мб отжирает? B>И все же JVM не Qt, а Qt не JVM. Поэтому данное сравнение не совсем корректно. А ещё GC. Можно попробовать ограничить размер хипа через -Xmx. Хотя ни к чему хорошему это не приведет. Опять же особо любознательные могут запустить профайлер.
Почему не корректное? Сравниваем отрисовку внутри окна средствами Qt и средствами Swing/Java2D. На остальные не используемые в данный момент части JRE должен быть константный overhead.
Хотя запустить профайлер — интересная идея. Но почему тогда программисты из SUN не запускали профайлер? Или они посчитали, что это нормальное использование памяти?
K>>Swing и Qt весьма похожи в том, что все компоненты рисуют сами с нуля, а не пользуются системными. Но как-то у Qt это заметно лучше получается: гораздо быстрее и отличий меньше от системного LAF. B>Именно поэтому Qt на столько популярен, а Swing совсем нет.
Да, похоже на то...
Re[4]: Java Swing по сравнению с Qt
От:
Аноним
Дата:
26.01.09 17:13
Оценка:
Здравствуйте, zubr, Вы писали:
Z>Всё таки — вы сравниваете C++ Qt vs Java Swing...
Ну да, а что не так в этом сравнении? К тому же есть и Qt Jambi...
Z>Java кушает память — да, Свинг удобен своей MVC, после использования его коммерческие гриды для .net кажутся странным произведением... Z>после кодинга на C++ программы на Java кажуться обжорами и медленными...
А что, 100Мб на такое простое окошко разве не обжорство? И такие жуткие тормоза при ресайзе окна разве нормально?
Здравствуйте, kamre, Вы писали:
K>Сразу же возникает вопрос: почему шрифт в JTextArea какой-то не правильный?
Был заинтригован. В Windows L&F прописан monospaced PLAIN 12, который выглядит как надо. Вероятно он наследовался от JScrollPane, удаление которого решило проблему.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
Анонимом я оказался, с другого компа отправлял и что-то с логином перепутал...
А>>И такие жуткие тормоза при ресайзе окна разве нормально? B>Дай бинарник — сравнить.
По сравнению со Swing resize у Qt просто идеальный для этого примера.
Еще заметил, что зависит от темы винды: если выставить у тему Classic, то и Swing начинает нормально работать.
Здравствуйте, kamre, Вы писали:
K>Бинарник для Qt? Вот сюда залил: http://ifolder.ru/10236262 Еще может понадобиться Microsoft Visual C++ 2008 SP1 Redistributable Package, т.к. Qt собрана с помощью MSVC 2008 Express.
K>По сравнению со Swing resize у Qt просто идеальный для этого примера. K>Еще заметил, что зависит от темы винды: если выставить у тему Classic, то и Swing начинает нормально работать.
Никакой особой разницы не заметил на обеих темах. Единственное что у меня LCD матрица довольно тормозная.
Здравствуйте, Blazkowicz, Вы писали:
B>Здравствуйте, kamre, Вы писали:
K>>По сравнению со Swing resize у Qt просто идеальный для этого примера. K>>Еще заметил, что зависит от темы винды: если выставить у тему Classic, то и Swing начинает нормально работать. B>Никакой особой разницы не заметил на обеих темах. Единственное что у меня LCD матрица довольно тормозная.
Ну а разница то между Qt и Swing хорошо заметна?
У меня на Athlon XP 2500+, NVidia 7600GS разница очень заметна. Swing вообще вот так себя ведет:
и нормально отрисовывать окно успевает только когда я мышку останавливаю.
Re[5]: Java Swing по сравнению с Qt
От:
Аноним
Дата:
26.01.09 19:08
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, zubr, Вы писали:
Z>>Всё таки — вы сравниваете C++ Qt vs Java Swing... А>Ну да, а что не так в этом сравнении? К тому же есть и Qt Jambi...
был бы вообще шоколад сравнить C++ Qt vs Java Swing vs Java Qt Jambi
Z>>Java кушает память — да, Свинг удобен своей MVC, после использования его коммерческие гриды для .net кажутся странным произведением... Z>>после кодинга на C++ программы на Java кажуться обжорами и медленными... А>А что, 100Мб на такое простое окошко разве не обжорство? И такие жуткие тормоза при ресайзе окна разве нормально?
Аноним 788 wrote:
> А что, 100Мб на такое простое окошко разве не обжорство?
Если я ничего не путаю, то магическое число 100мб — дефолтный размер кучи. И gc начинает свои грязные дела, когда объекты перестают помещаться.
Т.е. оно доходит до 100мб в процессе работы и больше не растёт (конечно, если прога больше не просит и утечек памяти нет).
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.>Если я ничего не путаю, то магическое число 100мб — дефолтный размер кучи. И gc начинает свои грязные дела, когда объекты перестают помещаться. .>Т.е. оно доходит до 100мб в процессе работы и больше не растёт (конечно, если прога больше не просит и утечек памяти нет).
Здравствуйте, kamre, Вы писали:
K>Особенно заметна разница в потреблении памяти — java использует почти в 10 раз больше! Больше 100Мб для окошка, растянутого почти на весь экран, это нормально для Swing? Неужели действительно такая большая разница? Наверняка я что-то делаю не правильно...
Покрути настройки JVM. Даже могу подсказать магическую строку, которую мы используем:
"-Xms32m -Xmx132m -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30 -XX:NewSize=5m -XX:MaxNewSize=5m -XX:SurvivorRatio=6 -XX:TargetSurvivorRatio=80 -XX:-UseConcMarkSweepGC -XX:-CMSIncrementalMode". Эта строчка для оптимизации расхода памяти, кроме того, она настраивает GC так, что он будет отдавать свободную память назад системе.
Для такого просто примера можно поменять параметр -Xms32m (минимальный размер кучи) на что-нибудь типа "-Xmx16m".
Вообще, сам по себе SWING не занимает много места в памяти. У нас достаточно сложное приложение со сложными окошками и контролами занимает где-то 12Мб кучи (по данным JConsole). Но у JVM достаточно большие минимальные фиксированные расходы на JIT-компиляцию и всякие свои внутренние дела, так что минимальный размер всей программы получается где-то около 40Мб.
PS: а сейчас стоит посмотреть ещё на QT Jambi — это QT binding для Java. Ооооочень достойная вещь, да ещё и скоро бесплатно будет (в марте).
Здравствуйте, denis.zhdanov, Вы писали:
DZ>Здравствуйте, ., Вы писали:
.>>Если я ничего не путаю, то магическое число 100мб — дефолтный размер кучи. И gc начинает свои грязные дела, когда объекты перестают помещаться. .>>Т.е. оно доходит до 100мб в процессе работы и больше не растёт (конечно, если прога больше не просит и утечек памяти нет).
DZ>64 по дефолту
не, там уже сложнее (see Automatic Selection of Collector, Heap Sizes, and Virtual Machine)
правда это не объясняет проблем топик кастера у меня, правда, на его примере меньше — так что думаю таки l&f неклассичный подкачал.
Здравствуйте, kamre, Вы писали:
K>Ну а разница то между Qt и Swing хорошо заметна?
Нет.
K>У меня на Athlon XP 2500+, NVidia 7600GS разница очень заметна. Swing вообще вот так себя ведет: K>http://pic.ipicture.ru/uploads/090126/6Q2ZV2ETDR.png K>и нормально отрисовывать окно успевает только когда я мышку останавливаю.
Core 2 Duo 2.60GHz, встроенное видео — Intel G965. Подобных эффектов не наблюдаю.