Lua를 C ++ 게임에 통합 할 때의 장단점은 무엇입니까?


37

나는 C ++ 게임 프로그래밍 서적을 가지고 있고 그것에 Lua 섹션이 있습니다. 나는 Lua 섹션을 읽기 시작했고 흥미롭게 들리지만 C ++ 게임에서 Lua를 사용하는 장단점을 결정할 수는 없습니다. 내가 현재 생각할 수있는 유일한 이점은 다시 컴파일하지 않고도 Lua를 통해 코딩 업데이트를 할 수 있다는 것입니다. 그 외에는 아무것도 생각할 수 없습니다. 그렇다면 C ++ 게임에 Lua를 추가 할 때의 장단점은 무엇입니까?

예가 이해 될 것이다.




그것은 그 질문들과 비슷하지만 여기서 중요한 것은 '죄수'입니다.
Jonathan Dickinson

@JonathanDickinson 대답은 그 방향을 가리 키지 않지만 ... 기본적으로 연결된 질문에서와 동일합니다.
bummzack

답변:


33

내가 현재 생각할 수있는 유일한 이점은 다시 컴파일하지 않고도 Lua를 통해 코딩 업데이트를 할 수 있다는 것입니다.

이 유틸리티를 너무 쉽게 할인하지 마십시오. 재 컴파일 단계를 없애기 전까지는 얼마나 생산적인지 이해할 수 없습니다 .

"흐름" 이 일에 관해서 상당히 잘 이해 심리적 개념이다. 흐름은 활동에 집중할 때, 생각없이 거의 문제를 분석하고 해결할 때 얻는 느낌입니다. "흐르고"있을 때 가장 생산성이 높습니다.

컴파일 시간은 그 모든 것을 망칩니다. 테스트하는 것 사이에 10 초의 컴파일조차도 흐름에 머무르기가 어렵습니다.

게임 플레이를 개발할 때 일반적으로 사용하는 것은 "긴밀한 루프"입니다. 아이디어가 있고 테스트를 테스트하여 작동하는지 확인한 다음 사용해보십시오. 작동하지 않으면 수정 한 후 다시 시도하십시오. "코드 투 테스트"시간은 흐름을 유지하는 데 매우 중요합니다. 가능한 한 작게 만드는 것이 중요합니다.

Lua (또는 내장 된 스크립팅 언어)를 통해 수행 할 수있는 작업은 "컴파일"이 아니라 게임에 참여하여 변경 사항을 테스트 하는 것 입니다. 게임 빌드 방법에 따라 데이터를 중지하거나 다시로드하지 않고도 새 스크립트로 게임을 다시 시작하는 명령을 실행할 수 있습니다. 재 컴파일하지 않아도되며 다시 실행할 필요가 없습니다.

적절한 엔진 지원이 제공되면이를 수행 할 수있어 생산성이 크게 향상 될 수 있습니다.


스크립팅의 또 다른 주요 이점은 신경 쓰지 않는 기능입니다. C ++을 작성하는 데 오랜 시간을 소비했다면 미누에를 쓰는 데 얼마나 많은 시간이 걸리는지 놀라게 될 것입니다. 메모리가 삭제 된 위치 이것이 해제되는 곳. shared_ptr모든 곳에서 사용하더라도 변수 유형 이름을 모두 입력하면 속도가 느려집니다.

동적 형식의 스크립팅 언어에서는 신경 쓸 필요가 없습니다. 범위는 간단합니다. 함수는 일류 객체입니다. 펑터를 수동으로 만들 필요가 없습니다. 어떤 일을하는 것은 너무 쉽습니다 .

당신이 훈련 된 프로그래머가 아니라면 이제는 부정적인 점이 있습니다. Lua에서 전역을 사용하는 것은 매우 쉽습니다 (물론이를 방지 할 방법이 있지만). 돌보지 않으면 코딩 할 때 매우 부주의 할 수 있습니다.

그러나 다시 말해서 매우 조잡하면 장점이 있습니다.


Lua의 또 다른 장점은 훌륭한 데이터 설명 언어를 만드는 것입니다. JSON은 배열 / 테이블을 빌드하고 반환하는 JavaScript 파일과 마찬가지로 테이블을 반환하는 Lua 스크립트를 만들 수 있습니다.

이것은 구성 파일에 유용합니다. Lua의 테이블 형식은 .ini 형식보다 훨씬 좋습니다. 형식은 여전히 ​​깨끗하고 간결하며 확장 가능합니다.

아, 여전히 루아 스크립트이므로 실제 논리를 수행 할 수 있습니다. 그것의 단점은 ... 글쎄, 그것은 루아 스크립트이므로 실제 논리를 수행 할 수 있습니다 . 사용자가 잠재적으로 문제를 해결할 수 있기 때문에 게임에서 비참 할 수 있습니다.

그러나 실제로 이것은 쉽게 처리됩니다. Lua는 임베딩 용으로 설계되었으므로 격리가 실제로 매우 쉽습니다. 실제로 새로운 루아 상태는 기본적으로 아무 것도 제공 하지 않습니다 . 표준 Lua 라이브러리의 가장 기본적인 것까지 노출시키기 위해 실제로 무언가를해야합니다. 파일 액세스, 게임 상태 액세스 등은 모두 옵트 아웃이 아닌 옵트 인입니다. 그리고 각 Lua 상태는 서로 분리되어 있습니다. AI 스크립트에 사용하는 Lua 상태가 구성 파일에 사용하는 Lua 상태 일 필요는 없습니다.

실제로 많은 Lua 표준 라이브러리를 등록 할 수 있지만 모든 파일 IO를 제거하고 제거하는 코드가 있습니다. 궁극적으로 Lua 스크립트 기반 구성 파일이 수행 할 수있는 최악의 상황은 게임을 메모리에서 실행하여 실행하자마자 충돌하는 것입니다. 이러한 구성 파일을 수동으로 공유하지 않기 때문에 해커에게는 그리 재미 있지 않습니다.


모든 스크립팅 언어의 가장 큰 단점은 디버깅입니다. 대부분의 스크립팅 언어에는 디버거가 없으며 Lua도 다르지 않습니다. Lua에는 디버깅 도구를 빌드하는 데 필요한 모든 도구가 있습니다. 그러나 실제로는 디버거가 내장되어 있지 않습니다. 하나로 합쳐야합니다. 그리고 그것은 합리적인 수준의 작업을 요구할 것입니다.

또는 "printf 디버깅"으로 인해 만들 수 있습니다. 그것은 실제로 얼마나 많은 루아 코드를 작성 하느냐에 달려 있습니다.


1
흐르는 것이 항상 좋은 것은 아닙니다. 자동으로 작업을 수행하는 것은 때때로 디자인 대안을 살펴 보는 데 시간이 걸리지 않음을 의미합니다.
lurscher

10
@lurscher : 디자인은 코드를 작성 하기 전에 수행하는 작업 입니다. 코드 작성, 테스트 및 디버깅을 시작하기 전에 이러한 대안을 모두 설계해야합니다.
Nicol Bolas 23.32의

23

내가 일하는 곳 :

장점 :

  • 반복 시간이 개선되었습니다. 우리 게임은 호스트 파일 시스템을 변경하여 변경 사항을 자동으로 "느슨하게"설정합니다. (다음 파일을 열 때만 적용되지만 실제로는 레벨을 다시로드하면 새로운 루아 변경 사항이 즉시 적용됩니다.)
  • 콘솔 통합 . 모든 디버그 기능은 REPL을 사용하여 기존 Quake 스타일 콘솔에 연결할 수 있습니다. 내부 빌드의 경우 텔넷을 사용하는 간단한 소켓에 lua REPL을 연결할 수 있으며 게임을 네트워크로 제어 할 수 있습니다.
  • API 감소학습 곡선 감소 . 비전문가와 디자이너는 일반적으로 프로그래머 병목 현상이 발생하는 일부 작업에 참여할 수 있습니다.
  • 특수 정적 코드 분석 . luac -l바이트 코드에서 출력을 분석 하고 볼 때 쉽게 분석 할 수 있습니다. 특히 코딩 규칙이있는 경우 대부분의 루아 소스 파일을 구문 분석하는 것은 매우 쉽습니다. 지역 대회를 시행 할 수 있습니다. 더 많은 힘 을 얻으려면 metalua 를 살펴볼 수도 있습니다.
  • 오류 처리 . API에 충돌이없는 경우 lua가 어리석은 짓을해도 API를 잡아서 복구 할 수 있습니다 lua_pcall.
  • 쉬운 API 확장 . Lua <-> C ++ API를위한 새로운 함수를 작성하는 것은 그리 어렵지 않습니다. 이를 자동화하는 데 도움이되는 패키지도 있습니다.
  • 간단한 소스 . 예를 들어 루아 인터프리터에서 부동 소수점 수학을 피하거나 (일부 임베디드 플랫폼에서 중요 함) 특정 시스템에 최적화하기 위해 변경하는 것은 그리 어렵지 않습니다!
  • 메타 테이블 . 대단해. 런타임에 흥미로운 일을 할 가능성이 너무 많습니다. 실제로는 내용이없고 게임의 C ++ 측에서 복잡한 데이터 구조를 조회하는 "가상 테이블"이 있습니다.
  • 코 루틴 . AI 행동 스크립트 등을 중지하고 재개 할 수 있다는 것은 놀라운 일입니다. 하지만 루아 스크립터는 좀 더 정통합니다. 우리는 여전히 엔진으로 이것을 "안전하게"만드는 방법을 연구하고 있습니다.

단점 :

  • 예측할 수없는 GC . 우리 step가해야 할 것을 조정하는 것은 게임마다 크게 변화합니다. 일부는 모든 프레임 (작은 작업 세트)마다 전체 GC로 더 잘 작동합니다. 더 작은 패스를 자주 사용하지 않는 경우가 있습니다. 최신 루아 버전과 일부 패치 (사용하기를 두려워해서는 안 됨)에서 GC를 개선하는 데 많은 작업이 있습니다.
  • 더 높은 오버 헤드 . 우리는 테이블 당 입력 메모리 오버 헤드를 피하기 위해 많은 큰 데이터 구조를 C면으로 유지합니다. C ++, C 및 어셈블리는 일반적으로 더 빠른 코드를 생성합니다. 따라서 성능에 중요하지 않은 게임 엔진의 90 %를 유지하고 때로는 루아에서 C로 (또는 그 반대로) 마이그레이션합니다.
  • 조각화 . 아마도 작은 메모리 시스템에서 가장 큰 문제 일 것입니다. 우리는 보통 작은 객체 풀과 루아를 위해 완전히 별개의 큰 객체 힙을 사용합니다. 우리는 게임에서 전략적 포인트에 풀 GC 패스를 넣었습니다. lua_State경우에 따라 스크립트를 언로드하거나 완전히 버립니다 . 그리고 때때로 여전히 문제가 있습니다. 작은 객체 풀의 크기 (간단하고 낮은 오버 헤드를 위해 고정되어 있음)와 루아 관련 대형 객체 힙의 크기를 조정하는 것은 어려울 수 있습니다. 그러나 약 4MB보다 큰 시스템에서는 아직 특수한 힙과 풀에 신경을 쓰지 않았습니다.
  • 유형 안전 부족 . 당신이 좋은 정적 코드 분석 도구 세트가 내장되어 있지 않은 경우 런타임 오류 검사 (아마도 사용을 많이 다시 떨어질거야 __index하고 __newindex). 컴파일 타임에 오류를 잡을 수 있다면 더 좋습니다. 이를 완화하기 위해 할 수있는 여러 가지가 있습니다.

루아가 적극 권장합니다. Squirrel 을 확인하고 싶을 수도 있지만 더 작은 사용자 기반이 있다고 생각합니다.


나는 이것을 여러 번 투표 할 수 있기를 바랍니다. 매우 포괄적이고 통찰력 있고 명확하게 구조화되어 있습니다. +1
Koarl

5

실제로 3 가지 큰 장점이 있습니다.

이러한 요소를 통해 게임 개발자는 개발 속도를 높이고 게임 품질을 향상시키는 기능을 사용할 수 있습니다.

예를 들면 다음과 같습니다.

  • 파일이나 네트워크 소켓에서 게임을 업데이트하기 만하면 게임 논리를 변경할 수 있습니다.
  • 사용자가 자신의 스크립트를 생성하도록 허용 할 수 있습니다 (봇 또는 모드 용)
  • 게임 디자이너와 아티스트는 컴파일 도구 세트를 사용하지 않고도 게임의 일부를 업데이트하고 테스트 할 수 있습니다.
  • 몇 개의 스크립트를 변경할 때마다 다시 컴파일하지 않아도됩니다.
  • 플랫폼 / 엔진 / 언어를 변경하면 전체 게임을 다시 작성할 필요가 없습니다.

1
"플랫폼 / 엔진 / 언어를 변경하면 전체 게임을 다시 작성할 필요가 없습니다." 루아에서 다른 언어로 바꾸지 않는 한. Lua에서 "전체 게임"을 작성하는 경우 엔진을 변경하면 해당 변경 사항이 Lua에 노출되어야합니다 (또는 세부 정보를 숨기려면 Lua와 엔진간에 추상화가 필요함). 그래서 나는 Lua가 그 경우 어떻게 도움이되는지 알지 못합니다.
Nicol Bolas

3

내 경험에 비추어 보았을 때

찬성

  • 초기 통합은 정말 쉽습니다. 바인딩을 생성하는 데 도움이되는 도구가 있지만 바인딩 메커니즘은 매우 간단하여 사용자 정의 기능을 사용하여 자신의 버전을 즉시 작성할 수 있습니다.
  • 게임 로직을 훨씬 빠르게 반복 할 수 있습니다 (런타임 리로딩을 구현한다고 가정).
  • 실험 할 해방 환경을 얻을 수 있습니다. 그렇게하기위한 오버 헤드가 크게 줄어들 기 때문에 더 많은 것을 시도 할 것입니다.
  • 익숙한 구문 : 모든 차이점에 대해 C 프로그래머는 몇 시간 안에 편안하지 않아야합니다.
  • "논리"로 게임 로직 분리 개선 : 엔진이 서비스 제공 업체가되어 Lua 클라이언트에 적절한 API를 제공해야합니다. 언어 장벽은 거기에 도달하고 멤버 변수를 조정하는 대신 그것에 대해 더 많이 생각하게 만듭니다.

단점

  • 루아 메모리 관리는 게임에 이상적이지 않습니다. 당신은 그것에 대처하고 마음에 들지 않습니다
  • 루아 디버깅은 끔찍합니다. 당신은 경험을 향상시키기 위해 노력해야합니다
  • Lua에 데이터를 유지한다는 것은 Lua에서 디버깅해야한다는 것을 의미합니다. C에서 데이터를 검사하는 것은 처음에는 까다로울 것입니다
  • 루아는 기본적으로 모든 변수가 전역 변수 인 것처럼 발 구문에서 자신을 잘 찍습니다.
  • 루아는 다른 언어와 마찬가지로 프로그래밍 언어입니다. 컴파일러를 제거했기 때문에 비 프로그래머가 마술처럼 프로그래머로 변할 것이라고 기대하지 마십시오.
  • Lua 통합 및 지원에 능숙 해지는 것은 큰 일입니다. 즉시 사용할 수 있다고 기대하지 마십시오. 실제로 몇 번의 게임에서이 비용을 상각해야한다고 가정하는 것이 공정합니다.

최종, 개인적, 평결 : 괜찮은 규모의 게임을 제작 중이고 아직 스크립팅 언어가없는 경우 Lua를 받으십시오. 그만한 가치가 있습니다.


1

Garry 's Mod는 Lua 및 C ++를 사용하는 게임의 한 예입니다. 그들은 모든 개조에 Lua를 사용하여 사람들이 훨씬 쉽게 만들 수 있습니다. C ++은 모든 내부에 사용됩니다. 내가 생각할 수있는 유일한 단점은 Lua가 C ++만큼 빠르지 않다는 사실입니다.

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