java AWT Image 로드시 방법론과 그 효율성에 대해 여쭤보고자 합니다
행복녀
안녕하세요. java프로그래밍을 열심히 공부하고있는 학생입니다.^^
현재 java awt로 스도쿠 게임을 만들고 있는데 image 로드시 방법론과 그효율성에 대해 여쭤보고자 합니다.java awt로 그래픽 처리를 하는데 있어서 사용되는 메소드는 아래와 같은 것을 사용하고 있습니다.
imagecell_1= toolkit.getdefaulttoolkit().getimage(.\\img\\cell\\cell1.jpg);
g.drawimage(cell_1, x, y, null);
여기서 효율성에 대한 궁금증이 생겼습니다.
제 스도쿠프로그램에서셀을 표현할때1~9 숫자가 쓰여진 이미지와,각각 3색으로 셀의 표현만총 9*3 = 27장의의 이미지 파일을 로드해야합니다.이 로드한 셀을 9*9 = 81개를 그려줘야 하며, network로 최대5인 플레이를 할 경우 81*5 = 405개의 셀이미지를 그려줘야합니다.
제가 c언어나 c++언어로 그래픽 처리를 공부할때 이미지를 얻어오는 과정은 file을 접근해서 파일의 데이터를 가져오고, 그것을 저장하는 꽤나 많은 연산을 하는과정을 거치고 있습니다.
java에서 표현은1줄이지만 내부적으로 엄청많은 작업량을 요구하고 있을 것 같다는 개인적인 생각입니다.
그렇기때문에 이미지를 그려줄때마다 계속 image 로드를 호출하는 것을 피해야 할 것 같다는 생각이 문득 들었습니다. repaint호출때마다 최대 405번의 image로드를 실행하는 연산은 불필요할 것 같아서 입니다.
이 연산량을 피하고자 여러 image 객체를 필드로 정의하고, 생성자에 image를 로드하는 것을 생각해봤습니다. 이는 처음 81번의 image 로드연산만 하면 이후에 draw메소드만 호출하면 됩니다.
하지만 생각해보니 image객체 하나에100*100 jpg 파일을 로드했을때 메모리에 잡히는 사용량을 생각해보니 이것또한 비효율 같아서 이렇게 질문을 올려 여쭤보고자합니다.
생각해보면 변수에 파일 데이터를 모두 기록할 필요없이, 내부pointer를 이용해서 주소만 참조하고 있음 되는거 아닌가 싶기도하고, 그렇게 생각하니, 디스크는 메모리보다 느린데, 이미지를 호출할때마다 디스크에 접근해서 읽어오면 이것또한 성능에 문제가 있지 않을까 생각하면서 자꾸 닭이 먼저냐 알이먼저냐 생각이 들고 있습니다.
제 생각으로는최선의 방법은 자주 사용되는 이미지는 미리 생성하고, 자주 사용되지 않는 이미지는 필요할때 마다 로드하는 방법이 최선일꺼라 생각하고는 있습니다.
항상 느끼지만, 이러한 확률분포 까지 생각하고 프로그래밍 하는 것과 연산량과 메모리 사용량의trade off상관관계는정말 머리아프게 하네요^^;;
일단이미지를 로드할때, 필드에 이미지객체를 모두 생성하고, 생성자에 모든 이미지를 객체에 집어놓고필요한 이미지를바로바로 객체를 호출해서사용하는 방법과 필요할때마다 필요한 이미지를 로드해서 그리는 방법 중 효율성은 무엇이 좋을까요?
많은 분들의 프로그래밍 스타일을 참고하고싶습니다. 알려주시면 감사하겠습니다.
02
-
갅쥐누뉨
전 이런거 아예 만들줄 모릅니다. awt로 잘 안쓴다는 말을 듣곤...걍 그쪽은 수업 듣곤..다 잊어버렸다는...;; 이럼 안되는데..ㅋㅋ
-
달달한캔디
많은 정보 감사합니다. 간단하게 네트워크 대전 스도쿠 게임만들려다가 이런것까지 물어보게되고 ^^;
하핫;; 수다님, 찬님, 사이트수다님 앞에서 저는 부족한게 많아 보이네요.
앞으로 더 열심히 공부해야겠습니다 ^^b -
꽃햇님
repaint시 효율을 말하는거면.. 기본 컴포넌트든지 이미지든지 그려주는 것은 픽셀이기 때문에 상관없습니다.(그냥 그게그거) 하지만, 이미지를 로딩을 자주하면 문제가 되겠지요.. 이걸 해결하려면, 이미지 객체를 힙에 하나만 생성하는 겁니다.(싱글톤 패턴) 조건은 이미지 하나하나 변경이 일어나지 않고 단지 호출만 하는 것이라고 가정한다면.. 이미 잘 알고 있듯이 물리적인 곳에서 데이터를 가져오는 것보다 메모리에서 가져오는 것이 어마어마하게 속도 차이를
-
미국녀
그림을 그려주는것 자체는 오래 걸리지 않을꺼라 예상되는데.
Disk에서 이미지를 읽어 오는 I/O가 더 느리지 않을까요?
27장의 이미지를 매번 읽어 들이는것이 아니라,
한번 읽고 flush 하지 않으면 Disk I/O가 별로 없을것으로 보이는데...
27장만 메모리에 올리고 있어 보세요. ㅎ.
그리고 Toolkit말고 ImageIO.read()로 읽어 들여 보세요.
아마도 ImageIO.read로 읽어 들이면,
그 내부적으로 Disk Cache를 -
옆집꼬마야
본문에 있는것처럼 적절히 타협하는게 좋을듯 싶네요.
자주쓰이는건 미리 로딩해놓고, 한번쓰이고 버리는-_-; 거 같은건 flush하세요.
임베디드환경이 아닌이상 이미지 81개쯤은 걍 로딩해도 될거 같은데요.