2012-10-01 6 views
6

안녕 얘들 아 libGDX와 게임을 만들기 위해 노력하고있어 정말 페인트 루프와 논리 루프를 별도의 스레드에서 실행하는 것처럼 당신이 간단한 자바 스윙 게임을 만드는 것처럼 게임을 스레드 싶어요 paintcomponent 루프와 runnable run loop를 가지고있다.자바 스레드 libGDX

나는 C로 스레딩 한 경험이 있지만 은 스레드를 확장 할 수있는 유일한 방법은 스레드를 확장 한 다음 실행을 만드는 것이었다. 루프에 거기에 루프

하지만 실행 루프를 만드는 지점은 각 화면이 자유롭게 논리를 계산할 수 있도록하는 것이므로 사용자 정의 쓰레기가있는 일종의 추상 스크린 클래스가 필요하게됩니다. 광고 클래스는

을 구현

필자가

답변

11

libGDX 라이브러리는 이미 OpenGL 컨텍스트 업데이트를 위해 별도의 렌더링 스레드를 실행합니다. (: P 약) 우리는 이미 UI 스레드가 계속 실행 만 이벤트가 전달해야 할 경우 운영 체제에서 실행되도록 예약되지 않은 것을 알게 http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

참조하십시오. 이것이 우리가 일반적으로 참조하는 두 번째 스레드를 렌더링 스레드로 인스턴스화하는 이유입니다. 이 스레드는 시작할 때 응용 프로그램에 의해 인스턴스화 된 그래픽 모듈에 의해 생성됩니다.

주요 게임 오브젝트에 ApplicationListener.render() 방법은 그래서 그냥이 방법의 구현에 렌더링 루프의 몸을 넣어, (그래서 60HZ에 대해이어야 함) 모든 화면 재생에 대해 한 번이 렌더 스레드에 의해 호출됩니다 .

ApplicationListenercreate 방법에서 추가 게임 스레드를 만들 수 있습니다 (dispose 방법으로 정리해야합니다). render 스레드 이외에 기존 스레드가 게임 논리에 적합한 위치라고 생각하지 않습니다.

스레드 간 통신의 경우 기존 Java 동기화 방법을 사용할 수 있습니다. Java의 ArrayBlockingQueue<>을 사용하여 요청을 백그라운드 스레드에 보냈습니다. 그리고 Gdx.app.postRunnable()을 사용하여 데이터를 렌더링 스레드에 푸시하도록 내 백그라운드 스레드를 가져 왔습니다 (이러한 런타임은 render()이 호출되기 전에 다음 프레임에서 실행됩니다).

+0

어쩌면 나는 렌더가 스레드이고 끊임없이 반복한다는 것을 알았다.그러나 나는 실제 게임 로직을위한 별도의 스레드를 가질 수 있는지를 찾고있었습니다. libGDX가 렌더링을위한 새로운 쓰레드를 생성한다면 부모 또는 원 쓰레드에 어떻게 접근 할 수 있습니까? – Mintybacon

+0

@Mintybacon 스레드 간 통신 옵션에 대한 자세한 내용은 필자의 대답을 업데이트했습니다. 희망이 도움이됩니다. –

0

가 확실 의미하지 무엇을이 상황에 대한 스레드를 구현하는 간단한 이상의 표준적인 방법이지만,이 화면의 도면 (디스플레이에 변경 사항이 반영되도록 표준 묻는)는 전용 단일 스레드 (예 : 스윙 프레임 워크 참조). 이는 여러 스레드가 화면을 그리는 것을 어렵게하지 않기 때문에 어렵습니다. 단지 몇 가지 구현 만이이를 수행합니다. 따라서 GUI 프레임 워크를 직접 구현하려는 경우 단일 스레드 드로잉 접근 방식이 권장됩니다.

귀하의 비즈니스 논리는 많은 요소에 따라 다릅니다. 매우 간단한 접근법이 실제로 각 활동에 대해 새 스레드를 생성 할 수 있습니다. 이들 스레드는 그 결과를 상기 GUI 스레드에 게시 할 수있다. 이 접근 방식의 문제점은 자바에서 모든 스레드가 네이티브 OS 스레드에 매핑되기 때문에 동시에 많은 활동이 동시에 실행되면 효율성이 크게 떨어질 수 있다는 것입니다. 스레드 풀을 사용하여이를 피할 수 있습니다. Java 표준 라이브러리는 스레드 풀을 ThreadPoolExecutor으로 제공하거나 조금 더 높은 추상화를 원할 경우 ExecutorService을 제공합니다.

+0

감사합니다. ThreadPoolExecutor를 살펴보고 다시 방문하십시오. – Mintybacon