Справочник API: DirectContext (Состояние GL и контекст)
Класс DirectContext — это ваш мост к GPU. Он управляет подключением к базовому графическому API (OpenGL, Metal, Vulkan или Direct3D) и обрабатывает жизненный цикл ресурсов GPU.
Создание контекста
Обычно вы создаете один DirectContext на приложение и используете его повторно на протяжении всего времени его работы.
// Для OpenGL
DirectContext context = DirectContext.makeGL();
// Для Metal (macOS/iOS)
DirectContext context = DirectContext.makeMetal(devicePtr, queuePtr);Отправка команд
Skia записывает команды рисования во внутренний буфер. Вы должны явно указать Skia отправить эти команды на GPU.
flush(): Отправляет записанные команды в буфер драйвера GPU.submit(): Гарантирует, что GPU фактически начинает обработку команд.flushAndSubmit(syncCpu): Самый распространенный способ завершить кадр. ЕслиsyncCpuравен true, он блокируется до полного завершения работы GPU.
context.flushAndSubmit(true);Управление состоянием GL
Когда Skija используется вместе с другим кодом OpenGL (например, в игровом движке или пользовательском интерфейсе), внешний код может изменить состояние OpenGL (например, привязать другую программу или изменить область просмотра). Skia должна знать об этих изменениях, чтобы избежать ошибок рендеринга.
Сброс состояния
Если вы или используемая вами библиотека изменяет состояние OpenGL, вы обязаны уведомить Skia:
// Уведомить Skia, что ВСЕ состояния OpenGL могли измениться
context.resetGLAll();
// Или быть более конкретным для лучшей производительности
context.reset(BackendState.GL_PROGRAM, BackendState.GL_TEXTURE_BINDING);Отказ от контекста
Если базовый контекст GPU потерян (например, окно было уничтожено или драйвер аварийно завершил работу), используйте abandon(), чтобы предотвратить любые дальнейшие нативные вызовы Skia, которые могут вызвать сбой.
context.abandon();Рекомендации
- Потокобезопасность:
DirectContextне является потокобезопасным. Все вызовы к нему и все операции рисования на связанных с ним поверхностях должны выполняться в одном и том же потоке. - Гигиена состояния: Если вы смешиваете Skija с прямыми вызовами OpenGL, всегда вызывайте
context.resetGLAll()перед возвратом управления Skija. - Сброс поверхности: Если у вас несколько поверхностей, вы можете сбрасывать их по отдельности:
context.flush(surface).