QOpenGLDebugLogger Class
QOpenGLDebugLogger를 사용하면 OpenGL 디버깅 메시지를 기록할 수 있습니다. 더 보기...
| 헤더: | #include <QOpenGLDebugLogger> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS OpenGL) target_link_libraries(mytarget PRIVATE Qt6::OpenGL) |
| qmake: | QT += opengl |
| 상속: | QObject |
- 상속된 멤버를 포함한 모든 멤버 목록
- QOpenGLDebugLogger는 3D 렌더링의 일부입니다.
공개 타입
| enum | LoggingMode { AsynchronousLogging, SynchronousLogging } |
속성
- loggingMode : LoggingMode
공개 함수
| QOpenGLDebugLogger(QObject *parent = nullptr) | |
| virtual | ~QOpenGLDebugLogger() |
| void | disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity) |
| void | disableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType) |
| void | enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity) |
| void | enableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType) |
| bool | initialize() |
| bool | isLogging() const |
| QList<QOpenGLDebugMessage> | loggedMessages() const |
| QOpenGLDebugLogger::LoggingMode | loggingMode() const |
| qint64 | maximumMessageLength() const |
| void | popGroup() |
| void | pushGroup(const QString &name, GLuint id = 0, QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource) |
공개 슬롯
| void | logMessage(const QOpenGLDebugMessage &debugMessage) |
| void | startLogging(QOpenGLDebugLogger::LoggingMode loggingMode = AsynchronousLogging) |
| void | stopLogging() |
신호
| void | messageLogged(const QOpenGLDebugMessage &debugMessage) |
상세 설명
서론
OpenGL 프로그래밍은 오류가 발생하기 매우 쉽습니다. 대부분의 경우, OpenGL 호출 중 단 한 번의 오류만으로도 애플리케이션의 전체 구역이 작동하지 않게 되어 화면에 아무것도 표시되지 않을 수 있습니다.
OpenGL 구현에서 오류가 반환되지 않았음을 확실히 확인하는 유일한 방법은 모든 API 호출 후마다 ` glGetError `를 통해 확인하는 것입니다. 게다가 OpenGL 오류는 누적되므로, `glGetError`는 항상 다음과 같은 루프 내에서 사용해야 합니다:
GLenum error = GL_NO_ERROR;
do {
error = glGetError();
if (error != GL_NO_ERROR) {
// handle the error
}
} while (error != GL_NO_ERROR);오류 스택을 지우려고 할 때는, GL_NO_ERROR가 반환될 때까지 계속 진행하는 것뿐만 아니라, GL_CONTEXT_LOST가 반환되면 루프를 중단해야 합니다. 이 오류 값은 반복적으로 발생하기 때문입니다.
(애플리케이션 개발자로서) 우리가 관심을 갖는 다른 정보들도 많이 있습니다. 예를 들어 성능 문제나 더 이상 사용되지 않는 API 사용에 대한 경고 등이 있습니다. 이러한 종류의 메시지는 일반적인 OpenGL 오류 보고 메커니즘을 통해 보고되지 않습니다.
QOpenGLDebugLogger는 OpenGL 디버그 로그에 대한 접근을 제공함으로써 이러한 문제들을 해결하는 것을 목표로 합니다. 사용 중인 OpenGL 구현체가 이를 지원한다면( GL_KHR_debug 확장을 노출함으로써), OpenGL 서버에서 발생하는 메시지는 내부 OpenGL 로그에 기록되거나, OpenGL에서 생성되는 즉시 “실시간”으로 리스너에게 전달됩니다.
QOpenGLDebugLogger는 이 두 가지 작동 모드를 모두 지원합니다. 두 모드의 차이점에 대해서는 다음 섹션을 참조하십시오.
OpenGL 디버그 컨텍스트 생성
효율성상의 이유로, OpenGL 컨텍스트가 디버그 컨텍스트가 아닌 한 OpenGL 구현체는 디버그 출력을 전혀 생성하지 않아도 됩니다. Qt OpenGL에서 디버그 컨텍스트를 생성하려면, ` QOpenGLContext ` 객체를 생성하는 데 사용되는 ` QSurfaceFormat `에 ` QSurfaceFormat::DebugContext ` 형식 옵션을 설정해야 합니다:
QSurfaceFormat format;
// asks for a OpenGL 3.2 debug context using the Core profile
format.setMajorVersion(3);
format.setMinorVersion(2);
format.setProfile(QSurfaceFormat::CoreProfile);
format.setOption(QSurfaceFormat::DebugContext);
QOpenGLContext *context = new QOpenGLContext;
context->setFormat(format);
context->create();3.2 OpenGL Core Profile을 요청하는 것은 단지 예제의 목적을 위한 것일 뿐이라는 점에 유의하십시오. 이 클래스는 GL_KHR_debug 확장 기능의 사용 가능 여부에 의존하기 때문에(아래 참조), 특정 OpenGL 또는 OpenGL ES 버전에 묶여 있지 않습니다.
QOpenGLDebugLogger 생성 및 초기화
Qt OpenGL Debug Logger는 QObject 에서 파생된 간단한 클래스입니다. 모든 QObject 하위 클래스와 마찬가지로 인스턴스를 생성하고(선택적으로 부모 객체를 지정할 수 있음), Qt OpenGL 함수와 마찬가지로 현재 OpenGL 컨텍스트가 존재하는 상태에서 initialize()를 호출하여 사용 전에 초기화해야 합니다:
QOpenGLContext *ctx = QOpenGLContext::currentContext();
QOpenGLDebugLogger *logger = new QOpenGLDebugLogger(this);
logger->initialize(); // initializes in the current context, i.e. ctxOpenGL에서 기록된 메시지에 접근하려면 컨텍스트에서 GL_KHR_debug 확장이 사용 가능해야 한다는 점에 유의하십시오. 다음 호출을 통해 이 확장의 존재 여부를 확인할 수 있습니다:
ctx->hasExtension(QByteArrayLiteral("GL_KHR_debug"));여기서 ctx 는 유효한 QOpenGLContext 입니다. 확장 기능이 지원되지 않는 경우, initialize()는 false를 반환합니다.
내부 OpenGL 디버그 로그 읽기
OpenGL 구현체는 디버그 메시지에 대한 내부 로그를 유지합니다. 이 로그에 저장된 메시지는 loggedMessages() 함수를 사용하여 가져올 수 있습니다:
const QList<QOpenGLDebugMessage> messages = logger->loggedMessages();
for (const QOpenGLDebugMessage&message: messages)
qDebug() << message;내부 로그의 용량은 제한되어 있으며, 용량이 가득 차면 새로 들어오는 메시지를 저장할 공간을 확보하기 위해 오래된 메시지가 삭제됩니다. ` loggedMessages()`를 호출하면 내부 로그도 비워집니다.
디버그 메시지를 하나도 놓치지 않으려면 이 함수를 호출하는 대신 실시간 로깅을 사용해야 합니다. 하지만 컨텍스트 생성 시점과 실시간 로깅이 활성화되기 전의 시간대(또는 일반적으로 실시간 로깅이 비활성화된 상태)에는 여전히 디버그 메시지가 생성될 수 있습니다.
메시지의 실시간 로깅
구현에서 디버그 메시지가 생성되는 즉시 OpenGL 서버로부터 해당 메시지 스트림을 수신할 수도 있습니다. 이를 위해서는 적절한 슬롯을 messageLogged() 신호에 연결하고, startLogging()를 호출하여 로깅을 시작해야 합니다:
connect(logger, &QOpenGLDebugLogger::messageLogged, receiver, &LogHandler::handleLoggedMessage);
logger->startLogging();마찬가지로, stopLogging() 함수를 호출하여 언제든지 로깅을 비활성화할 수 있습니다.
실시간 로깅은 startLogging()에 전달되는 매개변수에 따라 비동기 또는 동기 방식으로 수행될 수 있습니다. 비동기 모드(오버헤드가 매우 적기 때문에 기본값)로 로깅할 경우, OpenGL 구현체는 언제든지 메시지를 생성할 수 있으며, 해당 메시지가 로깅되도록 유발한 OpenGL 명령어의 순서와 다른 순서로 메시지를 생성할 수도 있습니다. 또한 메시지는 컨텍스트가 현재 바인딩된 스레드와 다른 스레드에서 생성될 수도 있습니다. 이는 OpenGL 구현체가 대개 다중 스레드 방식이며 비동기적이기 때문이며, 따라서 디버그 메시지의 상대적 순서와 타이밍에 대해서는 어떠한 보증도 하지 않습니다.
반면, 동기 모드에서 로깅하는 것은 오버헤드가 크지만, OpenGL 구현체는 특정 명령어로 인해 발생한 모든 메시지가 명령어가 반환되기 전에 순서대로, 그리고 OpenGL 컨텍스트가 바인딩된 것과 동일한 스레드에서 수신되도록 보장합니다.
즉, 동기 모드에서 로깅을 수행하면 디버거에서 OpenGL 애플리케이션을 실행하고, ` messageLogged()` 신호에 연결된 슬롯에 중단점을 설정한 후, 백트레이스에서 로깅된 메시지를 발생시킨 정확한 호출을 확인할 수 있습니다. 이는 OpenGL 문제를 디버깅하는 데 매우 유용할 수 있습니다. 단, OpenGL 렌더링이 다른 스레드에서 수행되는 경우, 실제 백트레이스를 확인하려면 신호/슬롯 연결 유형을 ` Qt::DirectConnection `으로 강제 설정해야 합니다.
로깅 모드에 대한 자세한 내용은 LoggingMode 열거형 문서를 참조하십시오.
참고: 실시간 로깅이활성화되면 디버그 메시지가 더 이상 내부 OpenGL 디버그 로그에 삽입되지 않습니다. 내부 로그에 이미 존재하는 메시지는 삭제되지 않으며, messageLogged() 신호를 통해 출력되지도 않습니다. 실시간 로깅이 시작되기 전에 일부 메시지가 생성되어(따라서 내부 OpenGL 로그에 남아 있을 수 있으므로) startLogging()를 호출한 후에는 항상 로그에 메시지가 포함되어 있는지 확인하는 것이 중요합니다.
디버그 로그에 메시지 삽입
애플리케이션과 라이브러리는 디버그 로그에 사용자 정의 메시지를 삽입할 수 있습니다. 예를 들어, 관련 OpenGL 명령어 그룹을 표시하여 해당 명령어에서 발생하는 메시지를 나중에 식별할 수 있도록 하는 경우입니다.
이를 위해 createApplicationMessage() 또는 createThirdPartyMessage()를 호출하여 ` QOpenGLDebugMessage ` 객체를 생성한 다음, logMessage()를 호출하여 로그에 삽입할 수 있습니다:
QOpenGLDebugMessage message =
QOpenGLDebugMessage::createApplicationMessage(QStringLiteral("Custom message"));
logger->logMessage(message);OpenGL 구현체마다 디버그 로그에 삽입할 수 있는 메시지의 길이에 대해 벤더별 제한이 있다는 점에 유의하십시오. 이 길이는 maximumMessageLength() 메서드를 호출하여 확인할 수 있으며, 제한 길이를 초과하는 메시지는 자동으로 잘립니다.
디버그 출력 제어
QOpenGLDebugMessage 또한 디버그 메시지에 필터를 적용하여 로깅되는 메시지의 양을 제한할 수 있습니다. enableMessages()을 호출하여 메시지 로깅을 활성화하고, disableMessages()을 호출하여 비활성화할 수 있습니다. 기본적으로 모든 메시지가 로깅됩니다.
다음과 같은 기준으로 메시지를 선택하여 활성화하거나 비활성화할 수 있습니다:
- 출처, 유형 및 심각도(선택 범위에 모든 ID 포함);
- ID, 소스 및 유형(선택 범위에 모든 심각도 포함);
특정 메시지에 대한 "활성화" 상태는 (id, source, type, severity) 튜플의 속성이며, 메시지 속성들은 어떠한 형태의 계층 구조도 형성하지 않는다는 점에 유의하십시오. enableMessages() 및 disableMessages() 호출 순서에 주의해야 합니다. 호출 순서에 따라 활성화/비활성화되는 메시지가 달라지기 때문입니다.
메시지 본문 자체를 기준으로 필터링하는 것은 불가능하며, 애플리케이션에서 직접 처리해야 합니다( messageLogged() 신호에 연결된 슬롯에서, 또는 loggedMessages()를 통해 내부 디버그 로그의 메시지를 가져온 후).
활성화/비활성화 상태 관리를 단순화하기 위해, QOpenGLDebugMessage 는 debug groups 개념도 지원합니다. 디버그 그룹은 디버그 메시지의 활성화/비활성화 구성 그룹을 포함합니다. 또한, 디버그 그룹은 스택 형태로 구성됩니다. 즉, pushGroup()을 호출하여 그룹을 푸시하고, popGroup()을 호출하여 그룹을 팝할 수 있습니다. (OpenGL 컨텍스트가 생성되면 스택에 이미 하나의 그룹이 존재합니다).
enableMessages() 및 disableMessages() 함수는 현재 디버그 그룹, 즉 디버그 그룹 스택의 최상단에 있는 그룹의 구성을 수정합니다.
새로운 그룹이 디버그 그룹 스택에 푸시되면, 해당 그룹은 이전에 스택의 최상위에 있던 그룹의 구성을 상속받습니다. 반대로, 디버그 그룹을 팝하면 새로운 최상위가 되는 디버그 그룹의 구성이 복원됩니다.
디버그 그룹을 스택에 추가(또는 제거)하면 QOpenGLDebugMessage::GroupPushType (또는 GroupPopType) 유형의 디버그 메시지가 자동으로 생성됩니다.
QOpenGLDebugMessage도 참조하십시오 .
멤버 유형 문서
enum QOpenGLDebugLogger::LoggingMode
LoggingMode 열거형은 로거 객체의 로깅 모드를 정의합니다.
| 상수 | 값 | 설명 |
|---|---|---|
QOpenGLDebugLogger::AsynchronousLogging | 0 | OpenGL 서버에서 전송된 메시지는 비동기적으로 로깅됩니다. 즉, 메시지를 유발한 해당 OpenGL 동작이 발생한 후 어느 정도 시간이 지난 후에 메시지가 로깅될 수 있으며, OpenGL 구현에 따라 순서가 뒤바뀐 상태로 수신될 수도 있습니다. OpenGL 구현체는 본질적으로 다중 스레드 방식이며 비동기적이기 때문에, 이 모드는 성능 저하가 매우 적습니다. |
QOpenGLDebugLogger::SynchronousLogging | 1 | OpenGL 서버의 메시지는 동기적이고 순차적으로 기록됩니다. OpenGL 구현은 본질적으로 매우 비동기적이기 때문에 이로 인해 성능 저하가 심각하지만, OpenGL은 OpenGL 명령에 의해 생성된 메시지가 해당 명령의 실행이 반환되기 전에 기록될 것을 보장하므로 OpenGL 문제 디버깅에 매우 유용합니다. 따라서 ` messageLogged()` 신호에 중단점을 설정하고 백트레이스에서 어떤 OpenGL 명령이 이를 유발했는지 확인할 수 있습니다. 유일한 주의점은 여러 스레드에서 OpenGL을 사용하는 경우, ` messageLogged()` 신호에 연결할 때 직접 연결을 강제해야 할 수도 있다는 것입니다. |
속성 문서
[read-only] loggingMode : LoggingMode
이 속성은 startLogging()에 전달된 로깅 모드를 저장합니다.
로깅이 시작되어 있어야 하며, 그렇지 않으면 이 속성의 값은 의미가 없음을 유의하십시오.
액세스 함수:
| QOpenGLDebugLogger::LoggingMode | loggingMode() const |
startLogging() 및 isLogging()도 참조하십시오 .
멤버 함수 설명서
[explicit] QOpenGLDebugLogger::QOpenGLDebugLogger(QObject *parent = nullptr)
지정된 parent 를 사용하여 새로운 로거 객체를 생성합니다.
참고: 로깅을 수행하려면 먼저객체를 초기화해야 합니다.
initialize()도 참조하십시오 .
[virtual noexcept] QOpenGLDebugLogger::~QOpenGLDebugLogger()
로거 객체를 삭제합니다.
void QOpenGLDebugLogger::disableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)
지정된 sources, types 및 severities 을 가진 메시지와 모든 메시지 ID에 대한 로깅을 비활성화합니다.
현재 제어 그룹에서 로깅이 비활성화됩니다.
enableMessages(), pushGroup() 및 popGroup()도 참조하십시오 .
void QOpenGLDebugLogger::disableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)
지정된 ids 을 가진 메시지, 지정된 sources 에서 발생한 메시지, 지정된 types 에 해당하는 메시지 및 모든 심각도 수준의 메시지에 대한 로깅을 비활성화합니다.
현재 제어 그룹에서 로깅이 비활성화됩니다.
enableMessages(), pushGroup() 및 popGroup()도 참조하십시오 .
void QOpenGLDebugLogger::enableMessages(QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType, QOpenGLDebugMessage::Severities severities = QOpenGLDebugMessage::AnySeverity)
지정된 sources, types, severities 및 모든 메시지 ID에 대한 메시지 로깅을 활성화합니다.
로깅은 현재 제어 그룹에서 활성화됩니다.
disableMessages(), pushGroup() 및 popGroup()도 참조하십시오 .
void QOpenGLDebugLogger::enableMessages(const QList<GLuint> &ids, QOpenGLDebugMessage::Sources sources = QOpenGLDebugMessage::AnySource, QOpenGLDebugMessage::Types types = QOpenGLDebugMessage::AnyType)
지정된 ids 을 가진 메시지, 지정된 sources 에서 발생한 메시지, 지정된 types 을 가진 메시지 및 모든 심각도 수준의 메시지에 대한 로깅을 활성화합니다.
로깅은 현재 제어 그룹에서 활성화됩니다.
disableMessages(), pushGroup() 및 popGroup()도 참조하십시오 .
bool QOpenGLDebugLogger::initialize()
현재 OpenGL 컨텍스트에서 객체를 초기화합니다. 초기화가 성공하려면 컨텍스트가 ‘ GL_KHR_debug ’ 확장을 지원해야 합니다. 로깅을 수행하기 전에 반드시 객체를 초기화해야 합니다.
동일한 컨텍스트에서 이 함수를 여러 번 호출해도 안전합니다.
이 함수는 이전에 초기화된 객체의 컨텍스트를 변경하는 데에도 사용할 수 있습니다. 단, 이 경우 이 함수를 호출할 때 객체가 로깅 중이어서는 안 됩니다.
로거가 성공적으로 초기화되면 true 를 반환하고, 그렇지 않으면 false를 반환합니다.
QOpenGLContext도 참조하십시오 .
bool QOpenGLDebugLogger::isLogging() const
이 객체가 현재 로깅 중이면 true 를 반환하고, 그렇지 않으면 false를 반환합니다.
startLogging()도 참조하십시오 .
[slot] void QOpenGLDebugLogger::logMessage(const QOpenGLDebugMessage &debugMessage)
OpenGL 디버그 로그에 debugMessage 메시지를 삽입합니다. 이를 통해 애플리케이션이나 라이브러리는 OpenGL 애플리케이션의 디버깅을 용이하게 하는 사용자 정의 메시지를 삽입할 수 있습니다.
참고: debugMessage 의 소스는 QOpenGLDebugMessage::ApplicationSource 또는 QOpenGLDebugMessage::ThirdPartySource 이어야 하며, 유효한 유형과 심각도를 가져야 합니다. 그렇지 않으면 로그에 삽입되지 않습니다.
참고: 로깅이 이루어지기 전에객체가 초기화되어 있어야 합니다.
initialize()도 참조하십시오 .
QList<QOpenGLDebugMessage> QOpenGLDebugLogger::loggedMessages() const
OpenGL 내부 디버그 로그에 있는 모든 사용 가능한 메시지를 읽어와 반환합니다. 또한, 이 함수는 내부 디버그 로그를 지우므로, 이후 호출 시 이미 반환된 메시지가 다시 반환되지 않습니다.
startLogging()도 참조하십시오 .
QOpenGLDebugLogger::LoggingMode QOpenGLDebugLogger::loggingMode() const
객체의 로깅 모드를 반환합니다.
참고: loggingMode 속성에 대한게터 함수입니다.
startLogging()도 참조하십시오 .
qint64 QOpenGLDebugLogger::maximumMessageLength() const
logMessage()에 전달된 메시지의 텍스트에 대해 지원되는 최대 길이(바이트 단위)를 반환합니다. 이는 디버그 그룹 이름의 최대 길이이기도 합니다. 그룹을 푸시하거나 팝할 때 디버그 그룹 이름을 메시지 텍스트로 하는 메시지가 자동으로 기록되기 때문입니다.
메시지 텍스트가 너무 길면 QOpenGLDebugLogger 에 의해 자동으로 잘립니다.
참고: 메시지 본문은 OpenGL로 전달될 때 UTF-8로 인코딩되므로, 바이트 단위의 크기는 일반적으로 QString::length()이 반환하는 UTF-16 코드 유닛 수와 일치하지 않습니다. (단, 메시지 내용이 7비트 ASCII 데이터로만 구성된 경우, 즉 디버그 메시지의 경우라면 일치합니다.)
[signal] void QOpenGLDebugLogger::messageLogged(const QOpenGLDebugMessage &debugMessage)
이 신호는 OpenGL 서버에서 디버그 메시지( debugMessage 인자로 감싸인)가 기록될 때 발생합니다.
OpenGL 구현에 따라, 이 신호는 수신자가 속한 스레드 이외의 다른 스레드에서, 심지어 이 객체가 초기화된 QOpenGLContext 가 속한 스레드와도 다른 스레드에서 발송될 수 있습니다. 또한, 이 신호는 여러 스레드에서 동시에 발송될 수 있습니다. Qt는 스레드 간 신호 발송에 큐 기반 연결을 사용하므로 일반적으로 이는 문제가 되지 않지만, 연결 유형을 Direct로 강제 설정하는 경우 이 신호에 연결된 슬롯에서 발생할 수 있는 경합 상황을 유의해야 합니다.
SynchronousLogging 모드에서 로깅이 시작된 경우, OpenGL은 이 신호가 QOpenGLContext 에 바인딩된 것과 동일한 스레드에서 발신될 것을 보장하며, 절대 동시 호출이 발생하지 않습니다.
참고: 로깅이 시작되어 있어야 하며, 그렇지 않으면 이 신호가 발생하지 않습니다.
startLogging()도 참조하십시오 .
void QOpenGLDebugLogger::popGroup()
디버그 그룹 스택에서 최상단의 디버그 그룹을 제거합니다. 그룹이 성공적으로 제거되면 OpenGL은 제거된 그룹과 일치하는 메시지, ID 및 소스를 가지며, 유형은 ` QOpenGLDebugMessage::GroupPopType `, 심각도는 ` QOpenGLDebugMessage::NotificationSeverity`인 메시지를 자동으로 기록합니다.
디버그 그룹을 제거하면 디버그 그룹 스택의 맨 위로 올라온 그룹의 메시지 필터링 설정이 복원됩니다.
참고: 디버그 그룹을 관리하기 전에객체를 초기화해야 합니다.
pushGroup()도 참조하십시오 .
void QOpenGLDebugLogger::pushGroup(const QString &name, GLuint id = 0, QOpenGLDebugMessage::Source source = QOpenGLDebugMessage::ApplicationSource)
이름 name, ID id, 출처 source 인 디버그 그룹을 디버그 그룹 스택에 추가합니다. 그룹이 성공적으로 추가되면 OpenGL은 메시지 name, ID id, 출처 source, 유형 QOpenGLDebugMessage::GroupPushType, 심각도 QOpenGLDebugMessage::NotificationSeverity 인 메시지를 자동으로 기록합니다.
새로 푸시된 그룹은 스택의 최상위에 있던 그룹과 동일한 필터링 설정을 상속받습니다. 즉, 새로운 그룹을 푸시한다고 해서 필터링 설정이 변경되지는 않습니다.
참고: 그룹 이름( source )은 QOpenGLDebugMessage::ApplicationSource 또는 QOpenGLDebugMessage::ThirdPartySource 중 하나여야 하며, 그렇지 않으면 그룹이 스택에 추가되지 않습니다.
참고: 디버그 그룹을 관리하기 전에객체를 초기화해야 합니다.
popGroup(), enableMessages() 및 disableMessages()도 참조하십시오 .
[slot] void QOpenGLDebugLogger::startLogging(QOpenGLDebugLogger::LoggingMode loggingMode = AsynchronousLogging)
OpenGL 서버에서 전송되는 메시지의 로깅을 시작합니다. 새로운 메시지가 수신되면, 로깅된 메시지를 인자로 전달하는 messageLogged() 신호가 발생합니다.
loggingMode 로깅을 비동기(기본값)로 할지, 아니면 동기식으로 할지 지정합니다.
QOpenGLDebugLogger 로깅이 시작될 때 ` GL_DEBUG_OUTPUT ` 및 ` GL_DEBUG_OUTPUT_SYNCHRONOUS `의 값을 기록하고, 로깅이 중지되면 해당 값을 원래대로 복원합니다. 또한, 이 함수가 호출될 때 설정된 사용자 정의 OpenGL 디버그 콜백은 로깅이 중지될 때 복원되며, ` QOpenGLDebugLogger `는 로깅 중에도 기존 콜백이 계속 호출되도록 보장합니다.
참고: 로깅을 중지했다가 다시 시작하지 않고서는 로깅 모드를 변경할수 없습니다 . 이는 향후 Qt 버전에서 변경될 수 있습니다.
참고: 로깅을 수행하려면해당 객체를 먼저 초기화해야 합니다.
stopLogging() 및 initialize()도 참조하십시오 .
[slot] void QOpenGLDebugLogger::stopLogging()
OpenGL 서버에서 메시지 로깅을 중지합니다.
startLogging()도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.