해보지도 않고 앉아서 이게 좋을까, 저게 좋을까 공상만 하다간 네가 좋아하는 일을 찾을 수 없어. (자기관리 1622, rath offers at 2006/07/18)
718
 jdk 1.6.0_10 b14: Canvas.getGraphics().setXORMode is too slow

[Development] 

야밤을 틈타 옛 생각에 물들어.. 한창 애플릿 클라이언트 만들던 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 도 그렇고.. 버전 올라가면서 느려지는 게 왜케 많아;;



2008/07/15 07:19:06 


이 글의 트랙백 주소 http://xrath.com/blog/trackback/718
0 trackbacks were registered.

9 comments were registered.
 http://xrath.com/ rath
jdk 1.6.10 b25에서도 똑같음  (2008/07/15 07:59:59)
 http://xrath.com/ rath
뭔가 이상하다 -.- JPanel.paintComponent 로 해도 똑같네 ;; (2008/07/15 08:01:46)
 http://xrath.com/ rath
jdk 1.6.0_07 에서는 정상 작동한다. 음.. 아직은 Update 10 못쓰겠군! (2008/07/15 08:12:35)
 http://xrath.com/ rath
jdk 7 b30에서도 잘 돌아간다. 근데 FF3 에서 애플릿을 띄우니까 브라우저가 죽네 -.- 베타는 이래서 쓰면 안되는건가! (2008/07/15 08:28:43)
 http://xrath.com/ rath
jdk 1.6.0_10 b23 인데 Linux 64bit 용에서는 잘 돌아간다. 1.6.0_10과 directdraw 궁합 문제인거냐! (2008/07/16 14:42:10)
 http://jong10.com/ jong10
심오하네요.. -0- (2008/08/07 13:54:43)
 http://oscarplex.myid.net/ 오스카
700x24면 직접 픽셀 루프를 돌면서 처리해도 그 정도는 안 걸리는데(정도가 아니라 순식간) ... 혹시 _10 windows JDK 빌드에 이상한 디버깅 코드가 들어가 있는 건 아닐런지? ㄷㄷㄷ (2008/08/11 02:03:02)
 http://xrath.com/ rath
그러게요 1024x768 몇장 그려도 덜 걸릴텐데 말이에요 -.-; (2008/08/17 01:09:12)
 http://oscarplex.myid.net/ 오스카
java 쪽 살짝 개발할 일 있어서, jdk 1.6.0_10 받아서 봤는데, 문서에 Swing이나 Java2D 쪽이 Windows에서 D3D 하드웨어 가속 처리가 기본이라고 하네요. D3D 인터페이스에서 직접적으로 XOR 연산을 지원하지 않아서 그런 경우 더 느려진다고 하는 듯...

근데 최신 그래픽 드라이버에 DirectX 9.0c 이상, Shader 2.0 이상의 VGA 요구 사항이 있는데, 이 정도면 Shader로 발라주면 될텐데... 아마 나중에는 고쳐서 나올 듯? (2008/11/13 23:39:27)
OpenID    
이름 홈피
남길말
운 좋은
인간이라면
증명해봐요

좌측에 보이는 글자를 입력하세요.

OpenID 사용시 '운좋은 인간증명'이 필요없습니다.
OpenID가 없는 분은 OpenID 입력창을 비워두시고 기존 방식대로 인간증명을 하시면 됩니다.
My Amazon.com Wish List
블로그  
코멘트  
MSN 메신저 타자방
taja at xrath.com
친구로 지금 등록하세요!
Adobe Flex mxml 훈련
JMSN 0.9.8b11 릴리즈
J2SE 6 한글문서

1달러를 기부해주세요!

J2SE API 문서보기
Powered by Sun J2SE 6, Caucho Resin 3.2, Apache Lucene 2.0.0, Adobe Flex 2