엔진은 소스 프로세스 엔티티를 어떻게 좋아합니까?


9

소스 엔진 (그리고 전임자, goldsrc, quake)에서 게임 오브젝트는 월드와 엔티티의 두 가지 유형으로 나뉩니다. 세계는 맵 지오메트리이며 엔터티는 플레이어, 파티클, 사운드, 점수 등입니다 (소스 엔진의 경우).

모든 엔터티에는 해당 엔터티에 대한 모든 논리를 수행 하는 사고 기능이 있습니다.

따라서 처리해야 할 모든 것이 think 함수가있는 기본 클래스에서 온 경우 게임 엔진은 모든 것을 목록에 저장하고 모든 프레임에서 루프를 통해 해당 함수를 호출 할 수 있습니다.

처음에는이 아이디어가 합리적이지만 게임에 엔티티가 많은 경우 너무 많은 리소스가 필요할 수 있습니다.

소스와 같은 엔진은 어떻게 게임 오브젝트를 처리 (처리, 업데이트, 그리기 등)합니까?


2
왜 중요 <some commercial engine>합니까?
공산주의 오리

8
@ 공산당 오리, 여기서 실제 질문은 엔진이 어떻게 성공적인지 엔진에서 배울 수있는 방법
subb

답변:


5

글쎄, 그것을 할 수있는 다른 방법은없는 거의 없다 - 당신은거야 통해 호출 루프 think()마다 몇 프레임하면 적어도 모든 엔티티.

엔티티를 자체 스레드에 넣을 수는 있지만 전체 상태 동기화 악몽이 있습니다.

처음에는이 아이디어가 합리적이지만 게임에 엔티티가 많은 경우 너무 많은 리소스가 필요할 수 있습니다.

그렇기 때문에 소스 엔진은 한 번에 존재할 수있는 엔티티 수에 제한을 두지 않습니다 . 4096 개의 엔티티 절반 (2048) 만 네트워크로 연결할 수 있습니다. 이 한계 중 하나를 넘어 가면 게임이 중단됩니다.

그렇기 때문에지도를 만들 때 약 800 개 이상의 엔터티를 사용하지 않는 것이 좋습니다.


2 ^ 12 함수 호출이 여전히 각 프레임마다 BIG 번호가 아닙니까?
JulioC 2016 년

@ 줄리아 : 60fps에서 초당 246k 함수 호출은 많지만 오늘날의 하드웨어에서는 확실히 가능합니다. 그러나 이것은 소스 엔진이 충돌하기 전에 허용 되는 절대 최대 값입니다. 일반적으로 맵에는 엔티티가 훨씬 적습니다.
BlueRaja-대니 Pflughoeft

5
엔티티는 다음에 생각할 시간이 있으며, think 함수는 모든 엔티티가 아니라 모든 프레임에서 호출되는 것은 아닙니다. 지진 2의 최소 사고 시간은 0.1 (100msec)이며 엔터티 처리에는 10fps에 불과합니다.
bcsanches

"엔터티를 자체 스레드에 넣을 수는 있지만 전체 상태 동기화 악몽이 생겨 가치가 없습니다." 가치가 없다고 생각되면 Killzone 4 슬라이드를 확인하십시오. de.slideshare.net/jrouwe/…
Tara

3

언급 한 단계는 대부분 별도의 엔진에서 수행됩니다. 단순한 게임 엔진은 일반적으로 한 번에 통과합니다. 시퀀스

for each object
    do physics
    do game logic
    draw

된다

call physics subsystem
call game logic subsystem
call drawing subsystem

물리 엔진은 위치와 크기를 관리합니다.

Game Logic Engine은 Physics Engine이 변경 한 사항 (일부는 중간 지점을 방해 할 수 있음), 캐릭터의 목표 및 수행해야 할 동작 , 예정된 스크립트 (이 기능을 생각 함 ) 를 해석합니다 .

Drawing Engine은 어떤 객체가 보이는지 그립니다. Quake 엔진이 여기에서 일종의 속임수로 인해 어떤 객체가 보이는지 알고 있습니다 (Draw 섹션 참조).

당신에게 나의 충고는 게임 엔진이 아닌 시뮬레이션이 어떻게 수행되는지 연구하는 것입니다. 게임 개발과 관련된 거대한 대중 문화가 있으며 게임 엔진은 전통과 속도로 인해 명령 언어로 만들어집니다. 그래서 좋은 교과서 (이론보다는)를 얻고 엔진을 보지 않고 엔진을 연습하는 방법 (실습)을 얻는 것이 더 깨달았습니다.

물리학

모든 엔티티를 반복하고 {생각, 그리기}하는 것에 대한 전체 개념은 아마도 문제를 일으킬 것입니다. 갈등이있을 것입니다. 밸브에 Havok이 있다고 생각하고 Havok이 충분히 올바른 물리를 처리한다고 생각합니다.

생각한다

씽크 기능은 게임의 시간이 nextthink의 시간과 같을 때 실행됩니다 . Quake 엔진에서 이러한 방식으로 작동하며 Quake 엔진은 Half Life 엔진의 기본입니다. 매번 실행되지는 않습니다.

내부적으로 엔티티 목록을 반복하고 think 함수를 호출하는 데 시간이 지 났는지 확인하는 간단한 방법이어야합니다. 시간 복잡도는 O (N)이며 N은 엔터티 수입니다.

엔터티가 매우 많은 경우 fps를 얼마나 향상 시킬지 측정해야합니다. 때문에 참고, 암달의 법칙 은 잠재적으로 눈에 보이지 않는 속도 향상이다. 내 말은, 당신은 모든 항목을 통해 반복하고 하나의 숫자를 줄이고 확인합니다.

엔티티를 nextthink로 정렬하여 속도를 높일 것입니다 (엔티티에 대한 포인터 목록을 생성하고 매번 정렬합니다. 엔티티 배열이 아닌 엔티티 배열은 언제든지 엔티티가 nextthink를 변경할 수 있기 때문에 배열에서 재정렬하려면 O 대신 O (N)이 필요합니다 ( 1) 목록에서).

Linux 에서 O (1) 스케줄러 도 살펴 봐야 합니다.

무승부

엔진은 카메라가있는 영역에서 대략 보이는 것을 그립니다. 게임 레벨은 나무로 나뉘어져 있으며 영역은 그 나무의 잎입니다. 나는 당신 에게 그것에 대한 세부 사항을 귀찮게하지 않을 것입니다 ... 따라서 엔터티가 표시되면 보이는 엔터티 세트에 넣고 그려집니다.

잠재적으로 보이는 영역을 저장합니다. 간단히 "잠재적 가시성 세트", PVS라고 합니다. 이 PVS의 시각화 , 녹색 캡슐은 선수와 그의 주위에 그의 PVS에 포함 된 내용을 렌더링됩니다.


2

따라서 처리해야 할 모든 것이 think 함수가있는 기본 클래스에서 온 경우 게임 엔진은 모든 것을 목록에 저장하고 모든 프레임에서 루프를 통해 해당 함수를 호출 할 수 있습니다.

처음에는이 아이디어가 합리적이지만 게임에 엔티티가 많은 경우 너무 많은 리소스가 필요할 수 있습니다.

실제로 모든 것을 하나의 큰 목록에 넣는 것은 바람직하지 않습니다. 예를 들어 해당 유형을 기준으로 목록에서 엔티티를 그룹화하는 경우 여러 스레드에 처리를 더 잘 분산시킬 수 있습니다. 예를 들어 Foo 유형의 모든 엔티티가 시뮬레이션 단계에서 다른 엔티티와 상호 작용하지 않는 것을 알고 있으면 완전히 오프로드 할 수 있습니다. 그들이 큰 단수 목록 전체에 willy-nilly로 흩어져 있다면 이것은 훨씬 더 어려울 것입니다.

그 시점에서 공통 기본 클래스에서 모든 것을 파생시킬 필요는 없습니다. 소스는 그와 관련하여 데이터로 구현 될 수있는 것에 대한 상속 남용을 상당히 극복합니다.

물론 다른 코어로 작업을 오프로드하기 시작하더라도 프레임 당 처리 할 수있는 엔티티 수에는 항상 상한이 있습니다. 그 주위에는 방법이 없습니다. 구현에서 그 한계가 무엇인지에 대한 아이디어가 필요하고 그것을 완화하기위한 조치를 취해야합니다 (필요하지 않은 객체의 처리 단계를 적절히 분류하여 객체의 과도 입도를 피하십시오. cetera).


1

이전 답변에 대한 생각을 고수 한 후에 고려해야 할 사항은 이러한 사고 기능을 언제 그리고 어떻게 호출 할 수 있는지에 대한 성과입니다.

소스 엔진에 게시 한 링크를 보면 다른 사람이 이미 지적한 명백한 제한 외에도 각 엔터티에 대해 생각 시간과 다른 생각 컨텍스트를 설정할 수 있다는 것을 읽을 수 있습니다. 이는 더 높은 성능을 달성하는 열쇠입니다 여러 실행 프레임을 통해 성능이 부족한 처리를 분산시키는 단계적 업데이트를 생성하거나 현재 컨텍스트 (예 : 너무 멀리 있거나 플레이어 인식을 넘어서는 엔티티)에 따라 불필요한 처리를 컬링함으로써 단계적으로 업데이트 플레이어가 가까이있는 캐릭터와 같은 수준의 "생각하는 디테일"은 단순히 2 마일 떨어진 코를 고르는 캐릭터를 볼 수 없습니다).

특정 게임 로직과 상황에 따라 더 구체적인 최적화 수준이 있습니다.


하하! 그러나 가상 함수 사용이 매우 느리다는 것을 어떻게 지적하지 않습니까?
Tara
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.