2014-12-19 8 views
2

Java Swing을 사용하여 슛 '업 타입 비디오 게임을 개발 중이며 Java Swing Timer를 사용하여 모든 화면 업데이트를 제어하고 있습니다. 주 화면은 BorderLayout을 사용하고, BorderLayout에 포함 된 Panel에서 그래픽을 수행하고 AWT Graphics 호출을 사용하여 그립니다.Java Swing Timer를 사용한 Java 2D 게임 성능

내 게임이 진행됨에 따라 화면 개체 (선박)의 움직임을 빠르게하고 싶지만 여전히 화면을 부드럽게 지나치게하고 싶습니다. 자바 스윙 타이머의 타임 아웃 값을 5ms 정도로 낮춰서 문제를 일으킬 수 있다고 생각했습니다. 그러나 나는 15 밀리미터 이하로 설정했을 때 눈치 채지 못했다. 임계 값을 초과하면 성능에 눈에 띄는 차이가 거의 없습니다. - 그 이유는 무엇입니까? -

또 다른 옵션은 각 선박이 업데이트 당 몇 개의 픽셀을 이동하지만 3 또는 4 픽셀을 초과하는 물체를 증가시키는 것입니다.

아이디어가 있으십니까? 그리고 Swing에서 게임을 계속 유지하고 싶다면이 시점에서 타사 라이브러리로 포팅하지 않는 것이 좋습니다.

감사합니다.

+0

문제는 운영 체제와 시계의 정확성에 달려 있습니다. – camickr

+2

화면이 너무 빨리 새로 고쳐집니다. 예를 들어 60Hz 화면이있는 경우 업데이트 당 여러 프레임을 그리기 시작하기 전 최소 지연 시간이 ~ 16ms입니다. 원한다면 나는 이것을 답으로 써 줄 것이다. –

+0

클래스가 막 끝나므로 지금 대답을 게시하고 있습니다. –

답변

1

이 모든 것은 소프트웨어 문제가 아니며 소프트웨어로 해결할 수도 없습니다. 화면은 초당 60 회 정도만 새로 고칠 수 있습니다. 즉, 초당 60 회 또는 약 16 밀리 초마다 한 번씩 그려집니다. 이것이 하드웨어 장벽이기 때문에 소프트웨어로 더 빨리 업데이트 할 수있는 방법이 없습니다. 아마 60Hz 모니터 만있는 사용자도 많을 수 있으므로 다른 솔루션을 살펴 보는 것이 더 가치가 있습니다.

마음에 떠오르는 한 가지 해결책은 모션 블러를 추가하여 배가 실제로 움직이지 않는 것처럼 빠르게 움직이는 것처럼 보이게 만드는 것입니다. 그것은 블러가 눈을 속여서 화면을 가로 지르지 않고 빠르게 빠르게 움직이고 있다고 생각하도록하기 때문에, 당신이 더 먼 거리로 '뛰어 오르는'것을 허락 할 것입니다. 불행히도 모션 블러를 수행하는 유일한 방법은 제 3 자 라이브러리입니다. 그래도 인터넷 검색을하는 것이 더 나을지도 모릅니다.

+0

재생 빈도 (및 지연)가 궁극적으로 사용자 환경에 영향을 미치지 만 스윙 타이머는 모니터 재생 빈도와 독립적입니다. – user2864740

+0

@ user2864740 재미 있습니다. 그럼에도 불구하고, 내가 말한 것은 여전히 ​​사실이며, 둘 다 같은 시간에 있다고 가정 할 때, 그것이 실제로 어떤 것인가의 토스이다. –

-1

더 나은 성능과 더 많은 도구를 처리 할 수있는 JavaFX (최소한) 용 스윙 엔진을 변경하는 것이 좋습니다. 요즘 스윙은 AWT와 마찬가지로 죽은 기술로 간주됩니다.

http://libgdx.badlogicgames.com/

:

http://docs.oracle.com/javase/8/javase-clienttechnologies.htm

게임의 개발을위한 이상적인이 같은 libGDX로 준비 라이브러리를 사용하는 것입니다 : 자바 FX를 공부하고 시작하는 좋은 장소는이 하나가 될 것입니다

하지만 스윙에서 게임을 만들고 싶다면 누구를 판단해야합니까? 때때로 오래된 것들을 보는 것이 좋다. 나 자신은 여전히 ​​스윙을 좋아한다. 다른 것들과 비교해도 쓸모 없다.

나는 당신이 잘못된 gameloop을 구현할 수 있다고 생각합니다. 스윙 타이머는 게임 로직을 업데이트하는 좋은 방법처럼 보이지 않습니다. 서로 다른 컴퓨터간에 서로 다른 설정을 사용하는 경우에도 일반적으로 실용적이고 쉽게 가믈 루프를 올바르게 구현할 수 있습니다. 특히 문자의 올바른 이동에 적합합니다.

gameloop은 게임의 핵심이며, 그렇지 않으면 게임이 잘못 개발되어 여러 개의 제한과 함께 구현되어야합니다. 일반적으로, gameloop에서 우리는 원하는 FPS를 고려해야합니다. 게임 업데이트 중에는 마지막 업데이트와 현재 업데이트 사이의 경과 시간 (많은 개발자가 델타라고 함)을 취해야합니다.당신은 내가 추천 인터넷에서 그것에 대해 많은 자료 찾아 볼 수

http://dewitters.koonsolo.com/gameloop.html

http://www.java-gaming.org/index.php?topic=21919.0

https://www.youtube.com/watch?v=9dzhgsVaiSo

이 지난 링크가 확실히 당신을 도울 것입니다,하지만 당신은 그것에 대해 더 원하는 경우 이 책을 살펴 보는 것이 좋습니다.

심지어 오래된 소재 (스윙 인 경우)를 사용하면 키보드 및 마우스 입력 시스템, 사운드, 최상의 성능 스윙을 사용하여 좋은 gameloop을 구현하는 방법에 대한 세부 정보를 찾을 수 있습니다. . 그리고 한 가지 더 ... 캐릭터의 움직임과 관련하여 더 나은 결과를 얻으려면 float 또는 double과 같은 십진 유형의 위치 변수 (X 및 Y)를 사용하는 것이 좋습니다.

원하는대로 할 수 있기를 바랍니다. 행운을 빕니다!

+0

JavaFX가 Swing을 대체 할 것이고 Swing이 액션 게임을 구현하기위한 좋은 선택이 아니라는 데 동의하지만 Swing을 "죽은 기술"이라고 부르는 것은 매우 부정확합니다. 스윙은 여전히 ​​더 많은 기능이 완성되었습니다. – VGR

+0

스윙은 많은 멋진 것들을 가지고 있지만 유감스럽게도 과거의 것으로 간주됩니다. http://www.oracle.com/technetwork/java/javafx/overview/faq-1446554.html (6 번 항목 참조). http://en.wikipedia.org/wiki/JavaFX를 참조하십시오. 개발자가 JavaFX로 마이그레이션하는 것이 좋으며, Swing보다 훨씬 나은 기능을 제공합니다. 의심스러운 경우 JavaFX Ensemble 데모를 찾아 직접보십시오. http://www.oracle.com/technetwork/java/javase/overview/javafx-samples-2158687.html 시장에서 일하는 사람으로서의 조언 , 가능한 빨리 JavaFX로 마이그레이션하는 것입니다. – Loa