엔진 개발

엔진 개발

엔진 개발은 어떻게 이루어지며, 응용프로그램을 툴킷과 통합하려면 무엇이 필요할까요? 이 문서에서는 엔진 개발과 관련하여 자주 묻는 기본적인 몇 가지 질문에 대해 설명합니다.

소개

이 문서에서는 툴킷 엔진 개발에 관한 몇 가지 기술적인 정보를 간략히 소개합니다. 엔진 개발 시, 엔진에 로드되는 다양한 앱 및 프레임워크와 호스트 응용프로그램을 효과적으로 연결할 수 있습니다. 엔진을 사용하면 응용프로그램 간의 차이점을 추출할 수 있기 때문에 앱을 Python 및 QT를 사용하여 직관적인 방식으로 작성할 수 있습니다.

엔진은 파일의 모음으로 앱과 구조가 비슷합니다. 엔진은 engine.py 파일을 갖고 있으며, 이는 탱크 코어 엔진 기본 클래스에서 파생되어야 합니다. 그러면 다양한 엔진이 내부 복잡성에 따라 이 기본 클래스의 여러 요소를 다시 구현합니다. 기능을 요약하면 다음과 같습니다.

  • 기본 클래스가 시작 프로세스의 여러 지점에서 실행되는 다양한 init 및 destroy 메서드를 노출시킵니다. 시작 및 종료 실행을 제어하기 위해 이 메서드를 재정의할 수 있습니다.
  • 엔진은 앱에 의해 등록된 모든 명령 객체를 포함하는 commands 사전을 제공합니다. 보통 메뉴 항목이 생성될 때 이 사전에 액세스합니다.
  • UI 대화상자 및 창을 표시하는 메서드는 엔진이 QT를 실행하는 방식이 기본적인 기본 클래스 동작이 아닌 경우 재정의할 수 있습니다.

일반적으로 엔진은 다음 항목을 처리해야 합니다.

  • 메뉴 관리. 엔진 시작 시 앱이 로드되고 나면 엔진은 해당 Shotgun 메뉴를 생성하고, 여러 앱을 이 메뉴에 추가합니다.
  • 일반적으로 로깅 메서드는 응용프로그램 로그에 작성하도록 재정의됩니다.
  • UI 메서드는 보통 툴킷 앱 및 기본 호스트 응용프로그램 창 관리 설정에 의해 실행된 창이 매끄럽게 통합되도록 하기 위해 재정의됩니다.

엔진은 stgk.platform.start_engine() 명령을 사용하여 탱크 코어 플랫폼에 의해 실행됩니다. 이 명령은 구성 파일을 읽고, 엔진을 실행하고, 모든 앱을 로드하는 등의 역할을 합니다. 엔진의 목표는 일단 실행되고 나면 앱에 일관된 python/QT 인터페이스를 제공하는 것입니다. 모든 엔진이 같은 기본 클래스를 구현하기 때문에 앱이 엔진에서 UI 생성 등을 수행하기 위한 메서드를 호출할 수 있습니다. 메서드가 호스트 응용프로그램 내에서 원활하게 작동하도록 이러한 메서드를 구현하는 일은 각 엔진의 몫입니다.

엔진 통합 방식

호스트 앱의 기능이 무엇인지에 따라 엔진 개발의 복잡성이 결정됩니다. 이 섹션에서는 개발 프로세스에서 지금까지 발견한 여러 복잡성 수준을 간략하게 살펴봅니다.

QT, PyQt/PySide 및 Python이 포함되는 호스트 응용프로그램

이 접근법이 최선의 툴킷 설정으로, 엔진을 QT, Python 및 PySide를 지원하는 호스트 응용프로그램에 구현하는 작업은 매우 직관적입니다. nuke 엔진이 이 접근법의 좋은 예시입니다. 통합은 단지 일부 로그 파일 관리를 연결하는 것이며, 코드를 작성하여 Shotgun 메뉴를 설정합니다.

QT 및 Python은 포함되지만 PySide/PyQt는 포함되지 않는 호스트 응용프로그램

이 응용프로그램 클래스에는 MayaMotionbuilder 등이 포함되며, 비교적 통합이 간단합니다. 호스트 응용프로그램 자체는 QT로 작성되고, Python 인터프리터를 포함하고 있기 때문에 PySide 또는 PyQt 버전을 컴파일하고, 엔진과 함께 배포할 수 있습니다. 그러면 이 PySide가 Python 환경에 추가되고, Python을 이용한 QT 객체 액세스가 가능해집니다. 일반적으로 PySide를 컴파일할 때에는 샷 응용프로그램을 컴파일할 때 사용한 정확한 컴파일러 설정을 사용해야 올바로 작동합니다.

Python이 포함되는 호스트 응용프로그램

이 클래스에는 HoudiniSoftimage가 포함됩니다. 이 호스트 응용프로그램은 비-QT UI를 갖고 있지만 Python 인터프리터가 포함되어 있습니다. 즉, Python 코드를 환경 내에서 실행할 수 있지만 실행 중인 기존 QT 이벤트 루프는 없습니다. 이 경우에는 QT 및 PySide가 엔진에 포함되어야 하며, QT 메시지 펌프(이벤트) 루프가 UI 내 메인 이벤트 루프와 연결되어야 합니다. 간혹 이 작업을 정확히 수행하기 위한 특별한 메서드가 호스트 응용프로그램에 포함되기도 합니다. 포함되어 있지 않으면 정렬을 수행하여 QT 이벤트 루프가 정기적으로(예: on-idle 호출을 통해) 실행되도록 해야 합니다.

Python이 포함되지 않지만 플러그인을 작성할 수 있는 호스트 응용프로그램

이 클래스에는 Photoshop이 포함됩니다. Python 스크립팅이 없지만 C++ 플러그인을 생성할 수 있습니다. 이 경우에는 IPC 레이어를 포함하고 있고, 시작 시 별도 프로세스로 QT 및 Python을 실행하는 플러그인을 생성하는 것이 일반적인 전략입니다. 보조 프로세스가 실행되고 나면 IPC 레이어를 사용하여 명령이 양방향으로 전송됩니다. 이 유형의 호스트 응용프로그램은 보통 작동하는 엔진 솔루션을 얻으려면 상당한 작업이 필요합니다.

스크립트 작성 기능을 전혀 제공하지 않는 호스트 응용프로그램

호스트 응용프로그램을 어떻게 해도 프로그래밍 방식으로 액세스할 수 없는 경우에는 해당 엔진을 생성할 수 없습니다.

QT 창 부모-자식 관리

보통 창 부모-자식 관리에는 특별한 주의를 기울여야 합니다. 일반적으로 PySide 창은 위젯 계층에 친부모가 없으며, 이는 명시적으로 호출해야 합니다. 창 부모-자식 관리는 일관된 경험을 제공하는 데 중요하며, 이를 구현하지 않으면 툴킷 앱 창이 메인 창 뒤에 표시되어 큰 혼동을 줄 수 있습니다.

호스트 응용프로그램 위시리스트

다음 호스트 응용프로그램 특성을 툴킷 엔진이 이용할 수 있습니다. 더 많은 특성이 지원될수록 엔진 사용 경험이 더욱 향상됩니다!

  • 기본 제공 Python 인터프리터, QT 및 PySide!

  • 응용프로그램 시작/초기화 시 코드를 실행할 수 있는 능력.

  • 두 시점(응용프로그램이 시작 및 실행되고 있을 때와 UI가 완전히 초기화되었을 때)에 코드에 액세스하여 자동 실행할 수 있는 능력.

  • 파일 시스템 상호 작용(열기, 저장, 다른 이름으로 저장, 참조 추가 등)을 래핑하는 API 명령.

  • UI 요소를 추가하기 위한 API 명령

    • 커스텀 Qt 위젯을 앱에 패널로 추가(이상적으로는 번들 PySide를 통해 추가)
    • 커스텀 메뉴/상황에 맞는 메뉴 항목 추가
    • 노드 기반 패키지의 커스텀 노드(상호 작용을 위한 자체 UI 배포 용이)
    • 선택한 항목/노드 등을 가져오기 위한 인트로스펙션
  • 유연한 이벤트 시스템

    • "흥미로운" 이벤트가 커스텀 노드 트리거 가능
  • 비동기적 UI 실행 지원

    • 예를 들면, 커스텀 메뉴 항목이 트리거되면 나타나지만 인터페이스를 잠그지 않는 팝업 대화상자
    • 커스텀 UI 창의 부모-자식 관계가 올바로 지정되도록 최상위 창에 핸들 제공
팔로우

0 댓글

댓글을 남기려면 로그인하세요.