모든 게임은 각 프레임을 그려서 만들어 집니까?


60

컴퓨터 애니메이션 (게임용)에 대해 배우는 초보자입니다. 지금까지 내가 찾은 유일한 방법은 각 프레임, 모든 프레임 업데이트를 그리는 것입니다. 따라서 모든 프레임이 시작될 때 전체 프레임이 지워지고 해당 프레임에 필요한 항목이 다시 그려집니다.

내 질문은이 방법이 애니메이션과 게임을 만드는 데 사용되는 유일한 방법인지 여부입니다. 조금 비효율적 인 것 같습니다. 또한이 방법이 3D 게임에서 어떻게 작동하는지 이해하지 못합니다 . 누군가 이것을 더 자세히 설명해 주시겠습니까?


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Josh

John Carmack은 변경된 화면의 얇은 세로 슬라이스 만 그려서 PC에서 전체 화면 측면 스크롤을 수행하는 방법을 거의 발명했습니다. PC는이 기술 없이는 전체 화면 디스플레이를 충분히 빠르게 업데이트 할 수 없었습니다. 그는 Commander Keen과 같은 90 년대 초 많은 2D 게임에서 이것을 사용했습니다. 자세한 내용은 "Masters of Doom"을 읽으십시오.
애쉬

답변:


68

아주 오래된 게임에서는 프레임의 일부만 다시 그려 해당 프레임에서 변경된 기술을 사용했습니다. 내가 기억할 수있는 게임 "Little Big Adventure"는이 기술 (1994)을 사용합니다. 그러나 게임에는 대부분 정적 카메라가 있다는 것을 알 수 있습니다. 보이는 영역 밖으로 이동할 때만 장면이 다시 그려집니다. 게임을하면 해당 프레임에서 약간의 지연이 발생합니다. 최신 게임 엔진이 장착 된 최신 GPU에서 상황이 변경되었습니다. 각 프레임마다 모든 것이 다시 그려집니다. 렌더링 기술에 따라 사물이 여러 번 렌더링 될 수도 있습니다. GPU를 올바르게 사용하면 GPU의 컴퓨팅 성능이 엄청나게 높아집니다. 그러나 재사용이 일어나고 있습니다. 예를 들어 엔진은 5 번째 프레임마다 섀도 맵을 업데이트하기로 결정할 수 있습니다. 또는 광원에 변화가없는 한 조명이 업데이트되지 않습니다.


22
오래된 게임이 아닙니다. EA에서는 특정 "캐주얼"게임의 랩탑 배터리 사용을 줄이려는 노력이 있었으며 한 가지 기술은 화면의 일부만 다시 그리는 것이 었습니다. 카메라를 정지 상태로두고 화면을 가로 질러 걸어 다니면 심즈 3에서 때때로 이것을 볼 수 있습니다. 때로는 다시 그리기가 충분히 크지 않아서 픽셀이 화면. 완전히 다시 그리기를하려면 카메라를 약간 움직여야했습니다. 그러면 선이 사라집니다.
케빈 요금

12
아주 오래된 .. 1994 ... 나는 ... 이제 오래된 느낌
alseether

4
@alseether 오래 된 게임 용어. 우리는 단지 20 ~ 30 년 만에 8 비트 픽셀 블롭에서 실사 (실제 동작이 아닌 경우 사전 렌더링 된 컷신에서)로 사실감에 빠졌다는 것을 기억하십시오.
Jared Smith

16

아니.

최소한 벡터 디스플레이를 사용한 70 년대의 오래된 게임을 포함하는 경우.

예를 들어, 널리 알려진 게임 소행성 (Asteroids)은 원래 그래픽을 화면에 렌더링하는 근본적으로 다른 방식 인 벡터 디스플레이 용으로 개발되었습니다.

벡터 모니터는 1970 년대 후반에서 1980 년대 중반까지 소행성, 폭풍우, 스타 워즈와 같은 아케이드 게임에서도 사용되었습니다. 비디오 게임 아케이드에서 사용되는 기술을 설명하기 위해 Quadrascan이라는 용어를 사용했습니다.

https://ko.wikipedia.org/wiki/Vector_monitor

현대 그래픽은 래스터 리자 톤을 위해 거의 100 % 만들어졌으며, 그래픽 버퍼의 내용을 매 프레임마다 디스플레이에 씁니다.


7
벡터 디스플레이에는 분명히 "프레임"이 없습니다.
hobbs

2
@hobbs Correct, "각 프레임을 그려 모든 게임이 만들어 졌습니까?" "아니요, 모든 게임조차 프레임을 기반으로 그리는 것은 아닙니다."
Sandy Chapman

1
그러나 더 깊은 의미에서, 문제는 움직이는 항목뿐만 아니라 모든 보이는 항목을 반복적으로 그리는 것에 대한 문제였으며 대부분의 벡터 디스플레이에 대한 답은 여전히 ​​"예"입니다 (이미지 저장 튜브는 예외 임)
szulat

@szulat은 사실이지만 공정하기는 여전히 디스플레이가 검은 색인 틈새를 그리지 않습니다. 화면에서 보이는 항목 만 새로 고칩니다. 즉, 소행성에서는 화면에 배와 나머지 소행성을 다시 그릴뿐입니다.
샌디 채프먼

@SandyChapman과 다른 수준에서는 차이가 거의 없습니다. 게임이 바뀌면 화면 메모리 나 스프라이트가 업데이트됩니다. 그렇지 않으면 디스플레이의 해당 부분이 정적으로 유지됩니다. 이것은 래스터 및 벡터 시스템 모두에 해당됩니다. "소행성"은 CPU를 방해하지 않고 (벡터!) 화면 메모리에서 화면 새로 고침을 처리합니다. 마찬가지로 zx 스펙트럼 하드웨어가 래스터 비디오 신호를 생성하는 방식과 유사합니다. 실제 또는 가상 crt 빔이 다각형을 그리거나 화면을 고정 된 패턴으로 스캔하는지 여부는 부차적입니다.
szulat

11

가장 낮은 수준에서 컴퓨터의 그래픽 프로세서는 실제로 각 프레임을 처음부터 계산하여 화면으로 보냅니다. 그러나 저수준의 물건을 직접 관리하는 경우에만 노출됩니다. [1] 그러나 모든 그래픽 (및 그와 함께 게임) 엔진이 이러한 것들을 처리하므로 장면을 자유롭게 표현할 수 있습니다. 프레임 사이에서 수정할 수 있지만 영구적 일 수있는 여러 엔티티 측면에서

...이 방법이 3D 게임에서 어떻게 작동하는지 ...

3D 공간의 요소는 지속되며 그래픽 엔진은 다시 발생하는 모든 변경 사항 (카메라 이동 등)에 대해 화면의 이미지를 다시 계산합니다.

[1] ... 예를 들어 OpenGL과 같은 방식으로 자신의 엔진을 작성하는 경우 [2] 이 경우에도 프레임간에 지속적인 것을 저장할 수 있습니다.

[2] 현재 기술 수준의 옵션 이 아닙니다 .


"컴퓨터의 그래픽 프로세서가 실제로 각 프레임을 처음부터 계산합니다"를 지원하는 참조가 있습니까?
Kromster

@ 크롬 스터 : 그것은 주로 효율성 일입니다. 각 프레임 에 전체 계산 필요할 있으며 정확히 어떤 부품이 필요하지 않은지 확실하지 않으므로 정확하게 저장할 수있는 비트를 결정하려면 고가의 계산이 필요합니다. 순 성능이 향상 되더라도 프레임 속도가 일치하지 않을 수 있습니다.
MSalters

@MS는 그것이 표현되는 방식을 바꾸고 많은 이웃 답변에서 많은 점과 모순됩니다.
Kromster

"컴퓨터의 그래픽 프로세서는 실제로 각 프레임을 처음부터 계산할 것"이라는 말은 기술적으로 사실이 아니라고 말하고 싶습니다. GPU는 사용자가 말한 것을 정확하게 계산합니다. 이전 프레임을 다시 사용하려면 실제로 프레임이 기본값입니다. 많은 최신 게임 엔진 (및 운영 체제 GUI)은 처음부터 시작하기로 선택하지만 (이전 프레임은 새 프레임의 렌더링이 시간 내에 완료되지 않은 경우에만 표시됨), 그럴 필요는 없습니다.
Ove

"화면을 지워야한다"는 참조가 무엇인지 확실하지 않지만 Doom에서 프레임이 렌더링되는 방법에 대한 참조가 있습니다 : adriancourreges.com/blog/2016/09/09/doom-2016- 그래픽스 연구 ; 중간 정도의 고급 그래픽 카드는 초당 1 조 개 (픽셀 당 수천 개)를 관리 할 수 ​​있어야합니다.
pjc50

2

짧은 대답 : 아니요.

긴 이야기:

학교에서 게임 프로그래밍을 배웠을 때, 우리는 다음을 수행하도록 배웠습니다.

게임에서 원하는 fps 속도를 결정하십시오 (예 : 30).

각 간격마다 카운터에 1을 추가하는 코드를 작성하십시오 (30fps의 경우 33msec). 이 코드는 게임 루프와 동시에 실행됩니다.

그런 다음 게임 계산을 수행하는 게임 루프 (게임 상태 업데이트)는 각 프레임마다 동일한 카운터를 1 씩 줄입니다. 그러나 그래픽 계산 및 화면으로 그리기는 카운터가 0 인 경우에만 수행됩니다.

결과적으로 그래픽 프레임 속도는 CPU가 게임에서 계산을 얼마나 잘 처리하는지에 따라 조정됩니다. 게임에서 너무 많이 발생하지 않으면 계산이 쉽고 그래픽 프레임 속도가 실제 게임 상태 업데이트보다 높습니다 (화면에서 동일한 게임 상태를 두 번 이상 그리기 때문에 기본적으로 사이클 낭비).

그러나 게임에서 많은 일이 일어나고 있으며, CPU는 더 많은 작업을해야하며 게임 상태 업데이트는 화면에 그리는 것보다 우선합니다.

대부분의 경우 게임은 의도 한 속도로 계속 업데이트되지만 화면에 각 업데이트가 표시되지 않기 때문에 "지연 한"것으로 나타납니다. 화면에 각 업데이트를 강제로 적용하기 때문에 전체 게임 속도가 느려지는 것이 좋습니다.

이것은 모두 C ++로 이루어졌으며 게임 엔진이나 그래픽 카드는 없었습니다. 모든 것이 단일 코어 CPU에서 실행되었습니다. 우리는 2D 그래픽을 위해 일부 라이브러리를 사용했습니다.


1
"골든 액스"게임을 기억합니다. 8086 게임에서는 286 게임보다 게임 속도가 느리고 처리하기가 더 빨랐습니다. 참고로
akostadinov

0

비디오 게임이 매 프레임마다 디스플레이를 "그리기"여부를 말하기 전에 먼저 "그리기"의 의미를 정의해야합니다. 비트 맵을 처음부터 조립하여 모든 프레임을 그리는 것은 아닙니다. 실제로 많은 게임 플랫폼이 전체 비트 맵 전혀 조립하지 않습니다 .

비디오 게임이 디스플레이를 생성하기 위해 취할 수있는 몇 가지 방법이 있습니다. 매우 적은 수의 CPU는 CPU가 전자 빔을 켜고 끄거나 모든 픽셀 또는 벡터 스캔 게임의 경우 플롯 할 모든 도트의 XY 좌표를 설정합니다. 이 작업을 수행하는 대부분의 게임은 CPU가 충분히 빠르다는 것을 보여주기 위해 그렇게합니다. 보다 일반적으로 게임에는 CPU가없는 경우 일부 패턴의 픽셀 또는 벡터를 디스플레이에 반복적으로 출력하는 하드웨어가 있습니다. 이 패턴은 메모리 영역으로부터 순차적으로 데이터를 판독하고 각 비트 또는 비트 그룹을 픽셀 컬러로 해석함으로써 생성 될 수있다 (이를 비트 맵 디스플레이 라 함). 경우에 따라 하드웨어는 8x8, 16x16, 또는 디스플레이의 다른 크기 영역을 선택한 다음 해당 바이트를 사용하여 픽셀 데이터에 대해 읽을 메모리 범위를 선택합니다 (종종 문자 맵 디스플레이라고 함). 일부 하드웨어 플랫폼은 구성 가능한 위치로 여러 비트 맵 디스플레이를 오버레이 할 수 있습니다. 이것을 스프라이트라고합니다.

일부 플랫폼에서는 화면으로 전송되는 동안 디스플레이 패턴을 변경할 수 없지만 빔이 한 프레임 그리기를 완료 한 후 다음 프레임 그리기를 시작하기 전에 모든 업데이트를 수행해야합니다. 이러한 플랫폼에서 프레임에 표시 될 모든 항목은 해당 프레임을 시작하기 전에 디스플레이 하드웨어에로드해야하며 디스플레이는 한 번에 설정할 수있는 패턴을 표시하도록 제한됩니다. 프레임이 표시되는 동안 CPU가 실행을 중지 한 경우 동일한 프레임이 계속 표시됩니다. 다른 플랫폼에서는 패턴이 화면에 그려지는 동안 패턴을 변경하거나 재구성 할 수 있습니다. 이것은 비디오 회로 자체가 처리 할 수있는 것보다 훨씬 복잡한 화면을 보여줄 수있게합니다.

대부분의 개인용 컴퓨터 게임은 단일 비트 맵 화면을 그리도록 구성된 하드웨어를 사용하고 이미 존재하는 것과는 다른 것을 그 화면에 그리십시오. 때로는 특정 경우에 실제로 필요한지 여부에 관계없이 사물을 그리는 것이 더 쉬울 수 있지만 코드에서 화면의 일부를 변경할 이유가 없다는 것을 쉽게 알 수 있으면 해당 부분을 건너 뛰어 성능을 향상시킬 수 있습니다. 오늘날의 플랫폼은 종종 프레임이 진행되는 동안 전체 화면을 여러 번 그릴 수있을 정도로 빠르지 만 역사적으로는 그렇지 않았습니다. 예를 들어 Apple II 컴퓨터의 고해상도 화면에서 모든 픽셀을 작성하는 가장 빠른 코드는 두 개 이상의 프레임을 사용하고 Apple II 컴퓨터의 모든 픽셀을 복사하는 가장 빠른 코드입니다. 다른 버퍼의 고해상도 화면은 두 배가 걸립니다. 좋은 성능을 얻으려면 게임에서 실제로 변경된 내용 만 업데이트해야하며 이는 좋은 게임이 일반적으로 한 것입니다.


1
이 답변의 중간 쯤에 도달했으며 실제로 어떻게 질문에 대답하는지 잘 모르겠습니다. 첫 번째 단락은 CPU, XY 좌표, 전자 빔, 메모리 바이트 및 스프라이트에 대해 이야기하지만 각 프레임을 그리는 것에 대해서는 눈에 띄지 않습니다. 두 번째 단락은 길이가 긴 디스플레이 패턴에 대해 이야기하고 있는데, 그것은 나를 잃습니다. 실제로 화면을 다시 그리는 것과 관련하여 어떤 부분을 취하고 명확한 문장으로 화면 상단에 올려 놓은 다음 다시 이야기해야 할 내용을 연결하여 진행 상황을 설명해야한다고 생각합니다.
doppelgreener

1
@doppelgreener : 각 프레임을 "그리기"라는 개념은 약간 모호합니다. 각 프레임을 생성하는 데 필요한 모든 작업을 수행해야하지만 CPU와 하드웨어로 작업을 나누는 방법에는 여러 가지가 있습니다. 어떤 방법은 한 프레임과 다음 프레임 사이에 동일하게 나타나는 화면의 일부라도 CPU가 모든 프레임에 관련되도록 요구하지만 다른 프레임은 그렇지 않습니다. LCD 또는 CRT 게임에서는 빈 프레임이 아닌 모든 프레임 (전자 종이 또는 플립 도트 디스플레이를 사용하는 게임에서는 그렇지 않을 수 있음)마다 무언가를 출력 해야하지만 , 필요한 동작은 "그리기"로 간주되거나 고려되지 않을 수 있습니다.
supercat

나는 우리가 "언어를 지속적으로 그리 든"간단한 언어로 시작하여 더 정확하게 기술하는 방법이 아닌 이유에 대한 더 자세한 기술적 인 세부 사항을 설명하는 것이 좋습니다. . 게시물에는 기본적으로 요약과 개요가 필요합니다.
doppelgreener

-11

간단히 말해서, 모든 프레임이 그려지는 것이 아니라 게임이나 게임 플레이의 이야기 또는 주제를 제시하는 데 필요한 프레임 만 있다고 말합니다. 또한 특정 인스턴스에서 일어나고 싶은 일의 타이밍이 중요합니다.


9
이것은 질문에 대해 이해가되지 않습니다. 다른 것에 대해 "프레임"을 혼동했다고 생각합니다. 스토리 보드의 요소와 혼동 될 수 있습니까? OP는 특히 렌더링
Trotski94
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.