현대 게임 코드에서 실제로 얼마나 많은 어셈블리가 사용됩니까? [닫은]


21

현대 게임 코드에서 어셈블리는 평균 얼마나 자주 사용됩니까?

특히 임베디드 시스템의 게임이 어셈블리를 광범위하게 사용한다고 가정하기 때문에 x86, PPC 또는 ARM과 같은 우수한 C ++ 컴파일러가있는 플랫폼에서 특히 그렇습니다.


4
C ++은 어셈블리로 컴파일되지 않습니다-머신 코드로 컴파일됩니다. 어셈블리 언어는 생성하려는 머신 코드를 정확하게 지정하는 방법입니다.
Kylotan

6
C ++은 (일반적으로) 실제로 어셈블리로 컴파일되지 않으며 머신 코드로 직접 컴파일됩니다. 문제는 아마도 손으로 쓴 어셈블리가 프로젝트에 연결되거나 인라인 어셈블리로 작성된 양을 언급하는 것일 수 있습니다.

1
그럼에도 불구하고, 나는이 질문에 실용적이고 유용한 대답이 있다고 생각하지 않습니다. 그것은 기본적으로 유사한 요소에 의존하며, 그 중 많은 것이 주관적입니다 (즉, 코드 작성자의 의견).

1
요즘 SPU 프로그래밍과 같은 예외를 제외하고는 글쓰기 어셈블리가 그리 중요하지 않지만 읽을 수있는 것은 크래시 덤프를 분석하는 데 중요합니다.
Maik Semder

4
@Legion - 컴파일러 / IDE가 발생할 수 있습니다 방출 조립,하지만 컴파일러는 보통 컴파일 과정의 한 부분으로 조립 생산하는 것을 의미하지 않는다. 그렇게 할 필요가 없으므로 결과적으로 대부분은 그렇지 않습니다.

답변:


29

대답은 "게임"의 의미와 "사용 된"에 따라 다릅니다. "사용됨"은 "특정 게임 프로젝트 중에 작성 됨"을 의미한다고 가정하겠습니다.

내가 경험 한 사람들의 경험과 일화 데이터에서

  • 브라우저 기반 게임에서? 없음
  • 전형적인 PC 게임에서? 없음 (그러나 저수준 라이브러리에서 일부를 볼 수 있습니다.)
  • iOS 및 Android 게임에서? 없음
  • "AAA"PC 게임 및 콘솔 게임? 코드베이스의 0.05 % 정도일 수도 있습니다. (라이브러리에 조금 더 있습니다.)

게임 업계에서는 어셈블리 언어에 대한 지식이 필요하지 않지만, 만드는 게임 유형에 따라 유리할 수 있습니다.

컴파일러가 사람이 직접 작성한 어셈블리보다 C 코드를 최적화하는 데 더 나은 작업을한다는 주장이있었습니다. 보통은 사실이며 때로는 거짓입니다. 그러나 요즘 계속 증가하는 CPU 복잡성과 '확장'확장 (즉, 프로세서 분리)의 필요성은 최적화 노력이 일반적으로 다른 곳에 소비됨을 의미합니다.

최근 몇 년 동안 게임 코드에서 어셈블리를 본 유일한 시점은 __asm int 3중단 점을 강요하는 진술뿐이었습니다. 개인적으로 어셈블리를 개인적으로 사용하는 경우 비정상적인 충돌 버그를 진단하는 함수의 분해를 살펴 보았습니다 .


1
SSE 지침은 어떻습니까?
군단

4
@Legion, 사람들은 보통 내장 함수 나 SSE를 래핑하는 수학 라이브러리를 사용하거나 ispc 와 같이 SSE로 컴파일하도록 특별히 설계된 특수 미니 언어를 사용하여 SSE 코드를 작성합니다 . 어셈블리를 직접 작성하는 것은 여전히 ​​매우 드 rare니다.
Nathan Reed

1
iOS 게임 관련 : 올바르게 기억한다면 3D / Math 라이브러리 Oolong은 일부 인라인 ARM 어셈블리를 사용했습니다. Apple이 Accelerate 프레임 워크를 출시 한 이후에는 더 이상 필요하지 않습니다.
Nicolas Miari

Nathan과 동의-SSE 및 유사한 명령어 별 최적화는 일반적으로 라이브러리 내에 존재합니다 (일반적으로 얻는 총 이익이 노력의 가치가있는 유일한 장소이기 때문에).
Kylotan

26

현대 콘솔 게임에서 대량의 고성능 코드는 어셈블리와 C ++ 사이의 일종의 중간 단계 인 컴파일러 내장 함수를 사용하여 작성됩니다 . 이 구조는 C ++ 함수처럼 보이고 구문 분석 되지만 실제로 단일 기계 명령어로 변환됩니다 . 예를 들어, "벡터 V의 각 값을> = a 및 <= b로 고정"함수는 다음과 같습니다.

// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
    return _mm_max_ps( a, _mm_min_ps( v, b ) );
}

이와 같은 기능에서 나는 여전히 특정 기계 명령어관련하여 생각하고 있지만 C로 작성하는 것이 편리하므로 레지스터 색상 및 일정과로드 op 및 기타 지루한 세부 사항에 대해 걱정할 필요가 없습니다.

특히 현명한 컴파일러는 똑똑한 사람이 일을 얼마나 잘 수행 할 수 있는지에 비해 코드를 벡터화하는 데 끔찍하기 때문에 CPU가 지원하는 명령에 대해 알고 있어야합니다. 또한 코드를 정렬하는 방법에 대한 미묘한 세부 사항으로 인해 기계가 수행하는 작업을 이해하지 못하면 성능에 큰 영향을 줄 수 있습니다 .

어셈블리에서는 코드를 작성하지 않아도 어셈블리에서는 여전히 디버깅 을 많이합니다. 컴파일러 최적화는 디버거가 따라 잡을 수없는 방식으로 코드를 적극적으로 재구성하므로 "릴리스 모드"를 디버깅 할 때 가장 좋은 방법은 디스어셈블러를 열고 코드를 추적하는 것입니다. 충돌의 "법의학 디버깅 (Forensic Debugging)"에 관한이 GDC 이야기 는 그 수준에서 디버깅하는 이유와 방법을 설명합니다.


3
Crashworks는 SO에서 "게임을 위해 실제로 저수준의 최적화 된 코드를 작성하는 사람" 으로 잘 알려져 있기 때문에 +1 입니다.
BlueRaja-대니 Pflughoeft

@ BlueRaja-DannyPflughoeft "잘 알려진"? 나는 기뻐! =) Nathan Reed의 의견에 비추어 볼 때 재미있는 우연의 일치는 Naughty Dog에서 저수준 최적화 기술을 많이 배웠다는 것입니다.
Crashworks

다른 곳에서도 디버깅에서 어셈블리의 중요성을 들었습니다. 그래서 저는 그것을 배울 것입니다. 통찰력과 링크에 감사드립니다.
군단

7

수동 롤 어셈블리가 필요한 문제는 점점 줄어들고 있습니다. "빠른"속도는 가독성과 디버깅 능력이 떨어지게됩니다. 대부분의 경우 속도 문제가 어셈블리로는 더 이상 나을 수없는 것이 아니기 때문에 코드 섹션에서 가장 마지막 최적화 단계 중 하나로 만 수행해야합니다. 요즘 CPU는 훨씬 빨라졌지만 메모리 속도는 그렇지 않았습니다. 종종 다른 것보다 CPU를 통해 데이터가 흐르는 방식을 제어하는 ​​것이 더 중요합니다.

최신 컴파일러를 사용하면 터치 한 레지스터를 처리해야하기 때문에 어셈블리 코드를 최적화하기가 어려워 일반적으로 수작업으로 작성된 코드에서 명령을 다시 정렬 할 수 없습니다. 어셈블리의 필요성을 줄이기 위해 이제 저수준 개념에 액세스하는 데 도움이되는 내장 함수 가 있지만 컴파일러에 친숙하고 반대하지 않고 작업 할 수 있습니다.

PS3의 SPU는 사람들이 여전히 프로세서를 최대한 활용하기 위해 어셈블리를 사용해야하는 영역 중 하나입니다 (예 : 여기 설명 된대로 수동 명령 파이프 라이닝) .


1
심지어 PS3에, 사람들은 일반적으로하지 않습니다 상당히 노출 된 어셈블리 프로그램을. 기계 명령어를 지정하는 어셈블리와 같은 구문으로 코드를 작성할 수있는 도구가 있지만 레지스터 할당, 명령어 스케줄링 및 루프 파이프 라이닝을 수행합니다. 아마도 Naughty Dog는 실제로 모든 것을 직접 할 수도 있지만 대부분의 PS3 SPU 개발자조차도 내 경험에 있지 않습니다. :)
Nathan Reed

1
@NathanReed PS2 시절, 수동 루프 파이프 라이닝은 실제로 Naughty Dog의 프로그래머 인터뷰의 일부였습니다.
Crashworks

-1

사실 우리는 멀티 플랫폼 세계에 살고 있으며 게임 코드의 일부는 로컬 플랫폼에 맞게 조정해야합니다. 물론 로컬 하드웨어를 활용하면 이점이 있습니다!

이것은 게임이나 게임 로직에 관한 것이 아니라 게임 로직이 힌지하는 코드의 최적 성능을위한 하드웨어 지역에 관한 것입니다. 예를 들어 매크로를 사용하여 코드 섹션을 실제로 감쌀 수 있습니다. 그것이 만들어진 플랫폼.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.