문제

저는 Java 2D 게임을 작성하는 중입니다. 내장 된 Java 2D 드로잉 라이브러리를 사용하고 있는데, JFrame의 캔버스에서 Bufferstrategy에서 획득 한 그래픽 2D (때로는 완전한 스크리닝)를 사용합니다. 버퍼 스트레이트는 이중 부러됩니다. 리페인트는 타이머를 통해 적극적으로 수행됩니다. 그래도 특히 Linux에서 성능 문제가 있습니다.

그리고 Java2D는 그래픽 버퍼를 만들고 그래픽을 그리는 방법이 매우 많기 때문에 제가 옳은 일을하고 있는지 모릅니다. 나는 Graphics2d.getDeviceConfiguration (). createcompatiblevolatileimage를 실험 해 왔지만 유망한 것처럼 보이지만 드로잉 코드를 전환하면 더 빠른 증거가 없을 것입니다.

경험상 Java 1.5+의 2D 그래픽을 화면에 렌더링하는 가장 빠른 방법은 무엇입니까? 게임이 상당히 앞서 있기 때문에 OpenGL이나 게임 엔진과 같은 완전히 다른 드로잉 방법으로 전환하고 싶지 않습니다. 기본적으로 그래픽 2D 객체를 사용하여 화면에 물건을 그리는 가장 빠른 방법을 얻는 방법을 알고 싶습니다.

도움이 되었습니까?

해결책

나는 당신과 같은 문제가 있다고 생각합니다. 여기에서 내 게시물을 확인하십시오.

Java2d 성능 문제

성능 저하의 이유와 수정 방법을 보여줍니다. 그래도 모든 플랫폼에서 잘 작동하는 것은 아닙니다. 게시물에서 이유를 알 수 있습니다.

다른 팁

이 게시물에 대한 답변, 답변 콘스티스, 내 자신의 연구 :

작동하는 것 :

  • 사용 GraphicsConfiguration.createCompatibleImage 당신이 그리는 것과 호환되는 이미지를 만듭니다. 이것은 절대적으로 필수적입니다!
  • 이중 부러 드로잉을 통해 사용하십시오 Canvas.createBufferStrategy.
  • 사용 -Dsun.java2d.opengl=True 속도를 높일 수있는 경우.
  • 스케일링을 위해 변환을 사용하지 마십시오. 대신, 당신이 사용할 이미지의 스케일링 된 버전을 캐시합니다.
  • 반투명 이미지를 피하십시오! 비트 마스크 이미지는 괜찮지 만 반투명은 Java2D에서 매우 비쌉니다.

내 테스트 에서이 방법을 사용하여 10x -15x의 속도가 높아져 적절한 Java 2D 그래픽이 가능합니다.

다음은 내 머리 꼭대기에서 몇 가지 팁입니다. 당신이 더 구체적이고 당신이하려고했던 일이라면 더 많은 것을 도울 수 있습니다. 게임처럼 들리지만 가정하고 싶지 않습니다.

필요한 것을 그리십시오! 항상 맹목적으로 Repaint ()를 부르지 말고 Repaint (rect) 또는 Repaint (x, y, w, h)와 같은 형제 자매를 사용해보십시오.

이미지 / 프리미티브를 혼합하는 데 비싼 작업이 될 수 있으므로 알파 블렌딩에 매우주의하십시오.

가능한 한 프레 렌더 / 캐시를 시도하십시오. 동일한 방식으로 원을 그리워하는 것을 발견하면 BufferedImage에 들어가는 것을 고려한 다음 BufferedImage를 그립니다. 당신은 속도를 위해 기억을 희생하고 있습니다 (전형적인 게임 / 높은 성능 그래픽)

OpenGL 사용을 고려하고 LWJGL의 Jogl을 사용하십시오. Jogl은 Java와 비슷하지만 LWJGL은 OpenGL 액세스 위에 더 많은 게임 기능을 제공합니다. OpenGL은 스윙 할 수있는 것보다 적절한 하드웨어 및 드라이버가있는 순서를 끌 수 있습니다.

아직 언급되지 않은 중요한 것이 있습니다. 화면을 가로 질러 이동하는 객체가 있고 모양이 크게 변하지 않으면 이미지로 그려서 이미지를 각 프레임에 새 위치에서 화면으로 렌더링하십시오. 객체가 매우 간단한 객체 인 경우에도 그렇게하십시오. 절약하는 시간에 놀랄 수도 있습니다. 비트 맵 렌더링은 프리미티브 렌더링보다 훨씬 빠릅니다.

또한 렌더링 힌트 설정을 명시 적으로 설정하고 품질 고려 사항이 허용되는 경우 안티 아시아 링과 같은 것을 끄는 것을보고 싶을 수도 있습니다.

Java를 사용하여 몇 가지 기본 드로잉 응용 프로그램을 수행했습니다. 그래픽 집약적 인 작업을 수행하지는 않았지만 모든 'Repaint'호출을 잘 처리하는 것이 좋습니다. 부모 컨테이너에 추가로 페인트 호출하면 렌더링하는 양이 두 배가 될 수 있습니다.

나는 누군가가 내 것보다 더 나은 대답을 제공하기를 바라고이 질문을보고있다.

그 동안 나는 다음을 발견했다 태양 백서 JDK 1.4의 베타 릴리스 후 작성되었습니다. 런타임 플래그 (기사 맨 아래)를 포함하여 미세 조정에 대한 흥미로운 권장 사항이 있습니다.

"Solaris 및 Linux 용 런타임 플래그

Java 2D는 SDK 버전 1.4의 베타 3 릴리스부터 시작하여 로컬 또는 원격 디스플레이 환경에서 작업하든 DGA를 사용할 수없는 경우 기본적으로 PixMAPS의 이미지를 저장합니다. PMOFFSCREEN 플래그 로이 동작을 무시할 수 있습니다.

-dsun.java2d.pmoffscreen = true/false

이 플래그를 true로 설정하면 DGA를 사용할 수 있더라도 Offscreen PixMap 지원이 활성화됩니다. 이 플래그를 False로 설정하면 Offscreen PixMap 지원이 비활성화됩니다. 오프 스크린 PIXMAP 지원을 비활성화하면 일부 렌더링 문제가 해결 될 수 있습니다. "

이중 버퍼링을 사용하고 메모리에서 먼저 큰 버퍼 하나를 그린 다음 모든 도면이 완료 될 때 화면으로 플러시하십시오.

명심해야 할 몇 가지가 있습니다.

1) 상쾌합니다 이 링크 Repaint를 호출하기에 좋은 옵션이 될 수있는 SwingTimers를 사용하는 방법을 보여줍니다. 다시 칠한 것을 알아 냈습니다 (이전 포스터가 말한 것처럼 너무 많은 일을하지 않으므로).

2) 하나의 스레드에서만 그리기 만하고 있는지 확인하십시오. Mulitple 스레드에서 UI를 업데이트하면 불쾌한 일이 생길 수 있습니다.

3) 이중 버퍼링. 이것은 렌더링이 더 부드럽게 만듭니다. 이 지역 더 좋은 정보가 있습니다

Pure Java 2D를 원하지 않는 경우 대안은 GTGE 또는 JGAME (Google에서 검색)과 같은 게임 라이브러리를 사용한 다음 그래픽에 쉽게 액세스 할 수 있으며 이중 버퍼링 및 훨씬 간단한 드로잉 명령을 제공하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top