야밤을 틈타 옛 생각에 물들어.. 한창 애플릿 클라이언트 만들던 2000-2001년 시절 백업해둔 시디를 뒤져보다가, 겨니와 열심히 만들던 가빠채팅 -_- 을 찾게 되었다.
암튼
java.awt.Canvas 클래스 내 EventDispatchThread (EDT) 안에서 getGraphics로 graphics context 를 가져온 뒤 여기다 setXORMode 를 입히고 fillRect 를 하면 엄청난 성능저하를 볼 수 있다. (setXORMode를 빼보니 빠르게 동작한다. 다른 부분은 아직 테스트해보지 않았음)
700x24 짜리 fillRect 하는데 2,000 ms 이상 걸린다고 하면 믿을 수 있겠는가 -_- offscreen buffer 에도 똑같이 setXORMode로 그려본 결과 이 부분에서는 전혀 성능 저하가 없다. 그나저나 2000년에 만든 코드여서 그런지 createGraphics 로 offscreen buffer를 만드는 등의 코드들이 여기저기 널려있는데, JDK 1.4부터 추가된 Canvas.createBufferStrategy 덕분에 createGraphics 는 더이상 쓸모가 없어보인다 -.-;
아무튼 미치고 팔짝 뛰겠다.
내 JRE 버전은 1.6.0_10 b14
위 코드가 멀쩡히 돌아가던 시절의 JRE는 MS JVM 1.1 -_-
참고로 옆 pc 에 깔려있던 jre 1.5 에서는 아무런 문제없이 작동한다.
테스트 코드
import java.awt.*;
public class test extends Canvas
{
public void paint( Graphics g )
{
g.setColor( Color.black );
g.fillRect( 0, 0, 400, 20 );
g.setXORMode( Color.red );
g.setColor( Color.yellow );
g.fillRect( 0, 0, 400, 20 );
g.setPaintMode();
}
public static void main( String[] args ) throws Exception
{
Frame f = new Frame("-_-");
f.setSize( 400, 400 );
f.setLayout(new BorderLayout());
f.add( new test() );
f.setVisible(true);
}
}
테스트 결과 jdk 1.6.0_10 계열에서만 생기는 문제인 듯 하다. 1.6.0_07 이하 버전에는 XORMode 가 정상적으로 동작한다.
GWT 1.5 RC1 도 그렇고.. 버전 올라가면서 느려지는 게 왜케 많아;;