2010-08-19 4 views
3

나는 이것을 어딘가에서 보았지만 어디서나 C#으로 기억할 수는 없다고 확신한다.길게 걸리는 방법을 멈추기

나는 업데이트되는 각각을 통해 반복되는 게임 개체를 가지고 있습니다. 오래 걸리는 경우 업데이트 방법을 깨는 것이 가능합니까?

예를 들어 프로그래머가 1 업데이트주기 동안 더 오래 걸리는 코드를 추가하면 게임의 프레임 속도가 일정하게 유지되도록 업데이트 중 (업데이트 중)을 종료 할 수 있습니까?

나는 이것이 쓰레드로 할 일이 있을지 모르지만 나는 확실하지 않다.

감사합니다.

Phil.

답변

3

업데이트 인터페이스를 제어하는 ​​경우 허용 된 시간을 전달하고 게임 개체 자체를 종료 할 수 있습니다. 일종의 협동 멀티 스레딩.

실제 스레드의 오버 헤드를 줄이기 때문에 매우 많은 오브젝트가있는 경우 가장 좋은 방법이 될 수 있습니다.

2

예 스레드가 필요합니다.

오히려 게임 라이브러리가 자신의 스레드 모델

편집의 지원 여부를 볼 수도 있습니다 원시의 pthreads (또는 플랫폼 특정 상당) 이상 : 당신의 자신의 코드가 있다면 -이 아마 얻을 수있는 더 열심히 비트 중 하나입니다 권리. 스레딩은 까다 롭고 스레드 액세스를 제어하며 우선 순위와 할당량은 더욱 어렵습니다.

일반적으로 스레드를 죽이는 것은 좋지 않습니다. 정리 코드는 항상 까다 롭습니다. 가장 쉬운 방법은 각 반복마다 점검되는 작업자 스레드의 루프에 플래그를 넣는 것입니다. 그런 다음 컨트롤러 스레드는 오버런이 발생하고 스레드가 종료되면이를 '죽게'설정할 수 있습니다. 교착 상태의 스레드를 닫는 것이 어렵습니다.

+0

아니요, 지원하지 않으므로 진행 중입니다. 감사. –

+0

모든 게임 사이클 동안 스레드를 생성하고 종료하는 것은 좋은 생각이 아닙니다. – casablanca

2

스레딩은 작업을 독립적 인 작업 단위로 분해하는 일반적인 방법입니다.

또 다른 방법은 시간을 기준으로 프레임에 걸쳐 작업을 분산시키는 것입니다. 다행스럽게도 각 프레임을 발전시키는 프로그램 타이머가 있습니다.

알고리즘을 조각으로 나눕니다. 단편 조각이 20ms보다 오래 실행됩니다. "이벤트"를 트리거하면 해당 이벤트가 시작될 때부터 시간을 기록하고 충분한 시간이 경과하면 20 밀리 초가 걸리고 알고리즘의 다음 부분을 실행하십시오. 가난한 사람의 시간 조각입니다. :-)

다음은 게임/시뮬레이션이 기계주기 대신 시간을 사용하도록하는 사이트입니다. 어떤 상태를 업데이트하는 프레임 속도를 죽일 이유

Fix Your Timestep

+0

매우 흥미로운 기사 감사합니다 :) –

0

진짜 문제는 무엇입니까?

그것은 디자인의 문제,하지만 당신은 여러 가지 이유로, 스레드가 필요합니다

: 당신이 일정한 프레임 속도를 원하는

  • , 이것은 표시 전용 스레드를 의미하며, 대부분의 작업을 수행해야합니다 그래픽 카드는 요즘에도 여전히 있지만
  • 당신은 입출력에 반응하기를 원한다. 다른 스레드이다. 실제로 대부분의 IO는 전용 스레드를 필요로한다. 키보드 + 마우스를 하나로 묶을 수 있지만 네트워킹에는 두 가지가 필요할 것이다. 보내려면 하나,받는 사람은 하나)
  • 상태를 업데이트하는 등 여러 가지 스레드 (적어도 하나)를 원할 것입니다. ... 마지막으로
  • , 당신은 아마 그것은 크게 다르지 않다 일부 대기열을 담당 할 것이다 그들 모두를 지배하는 스레드 (안 반지, 스레드), 및 파견 이벤트

을해야합니다 당신이 그것에 대해 생각하는 모델 - 뷰 - 컨트롤러 모델은, 당신은 단지

일반적으로 입력/출력에 다른 구성 요소를 추가,이 다음과 같이 실행합니다

  • 사용자가 마우스를 클릭, 마우스 수신기 스레드 이벤트를 생성합니다 (MouseClicked 같은 위치에)
  • 컨트롤러 스레드는 이벤트를 수신하여 게임의 상태를 업데이트하는 "모델"스레드로 보냅니다 (동작 시작, 등 ...). 긴 동작 인 경우 컨트롤러가 더 좋을 것입니다
  • 보기 스레드는 디스플레이를 담당하고 표시 할 버퍼를 주기적으로 변경하며, 백그라운드에서 실행되는 계산과는 독립적으로 작동합니다. 따라서 스레드는 스레드 풀 (pool) 부분적으로 업데이트 된 상태가 아닌 일관된 상태를 보려면 동기화 (잠금)가 필요합니다.

나는 그것이 매우 옳고 (몇 가지 방법이 있습니다) 복잡하다는 것을 추가했습니다. 너가 너무 많은 실을 추가하면 너는 너의 발 아래 기계가 무너질 것이고, 교착 상태, 라이브 록, 기아 등등의 가능성이있다.

너는 무언가를 빨리 달성하고 싶으면,기구를 얻으 십시요 : Ogre은이다 좋은 오픈 소스 그래픽 라이브러리 예를 들어. 그렇지 않으면 게임 프로그래밍에 대한 리소스가 있습니다.

관련 문제