Рендеринг изображений в реальном времени и внеэкранный рендеринг изображений
Рендеринг изображений в реальном времени и внеэкранный рендеринг изображений

Ранее мы уже рассказывали больше о рендеринге и обработке видео. В этой статье мы хотим поговорить о изображениях. По сравнению с видео изображения действительно относительно просты. Мы знаем, что видео по существу состоит из кадров «изображений». их все понимают. Видео уже есть, нужно еще узнать о картинках? Рендеринг изображений имеет сходство с видео, но также имеет свои уникальные особенности.

Рендеринг видео обычно представляет собой рендеринг в реальном времени.,Используйте SurfaceView или TextureView.,ImageView обычно используется для рендеринга.,Путь может быть установлен,Вы также можете установить растровое изображение,Плюс холст и краска,Я непобедим,Может достигать множественных и разнообразных эффектов。ImageViewДействительно ли он непобедим??

  • В: Я хочу добавить стикеры к изображению.
  • Ответ: Все просто: я использую Cavas, чтобы разместить наклейку в определенном месте, затем создаю новое растровое изображение и помещаю его в ImageView.
  • Вопрос: Я хочу добавить несколько стикеров в разных местах.
  • Ответ: Просто, по тому же принципу я тоже могу сделать выводы из одного примера, а Кавас может все решить. Каждый раз, когда добавляется наклейка, растровое изображение создается заново и помещается в ImageView.
  • Вопрос: Могу ли я перемещать стикеры в разные места в режиме реального времени?
  • Ответ: Конечно, Canvas может поддерживать настройку позиции.
  • Вопрос: Каждый раз, когда позиция изменяется, необходимо генерировать новое растровое изображение. Не слишком ли часта эта непрерывная генерация и перезапуск?
  • Ответ: Это происходит немного часто, но для того, чтобы каждый раз генерировать Bitmap, разработчикам просто нужно уделять внимание переработке.
  • Вопрос: Помимо проблем с памятью и стабильностью, частые разрушения приведут к снижению производительности?
  • Ответ: Чрезмерное дрожание памяти действительно приведет к проблемам с производительностью.

Из приведенного выше чата мы узнали, что у ImageView есть две проблемы с обработкой изображений:

  • Проблема с перегрузкой памяти
  • рендеринг неэффективен,Плохая производительность

Как связаны изображения рендеринга ImageView и рендеринг за кадром? OpenGL имеет концепцию внеэкранного рендеринга, который, как следует из названия, представляет собой внеэкранный рендеринг, то есть открытие нового буфера для операций за пределами текущего экранного буфера. Внеэкранный рендеринг происходит на уровне графического процессора, будет создан новый буфер рендеринга и OpenGL Конвейер многопроходного рендеринга, переключение графического контекста приведет к дополнительным накладным расходам, увеличению GPU рабочая нагрузка. На самом деле, судя по описанию,Просто знай, как выйти из экранарендеринг Это больше влияет на производительность。

  • Необходимо создать новую область кэша
  • Весь процесс закадрового рендеринга,Необходимо несколько раз переключать контекст,текущий экран—>Выкл. экрана,После завершения рендеринга отобразить содержимое закадрового буфера на текущий экран.,Контекст переключается обратно в текущую среду.

Противоположностью закадрового рендеринга является живой рендеринг.,Или текущий рендеринг экрана,ЦП вычисляет кадр и другие атрибуты,Отправьте рассчитанный контент в графический процессор для рендеринга.,После завершения графического рендеринга он будет помещен в буфер кадра экрана.,Затем контроллер будет переходить в область кэша экрана, чтобы время от времени считывать полезный контент рендеринга.,таким образом отображается. Как реализовать рендеринг в картинках в реальном времени? Конечно, это SurfaceView,Так как это рендеринг в реальном времени,Должна быть концепция холста,В предыдущей статье очень четко было указаноSurfaceViewСуть полотна。Если вы не уверены, вы можете прочитать предыдущую статью.:Подключите внешнюю среду рендеринга к плееру

По нашему мнению, SurfaceView обычно больше связан с коллекцией видео или камер, и его относительно редко используют для рендеринга изображений. Но для обеспечения рендеринга изображений в реальном времени SurfaceView действительно является очень хорошим носителем.

  • Создать среду EGL
  • Поверхность для NativeWindow, сборка EGLSurface
  • Настроить ФБО
  • Рендеринг текстуры изображения

Создать среду EGL

  1. Получает EGLDisplay. EGLDisplay на самом деле является абстракцией уровня OpenGL базового устройства отображения.
  2. ИнициализироватьEGLDisplay
  3. НастройкаEGLDDisplay,Включая ARGB,рендерингтип,Версия и т. д.
  4. Установить версию OpenGL
  5. Получить EGLContext. EGLContext может использоваться несколькими средами EGL и обеспечивать многопоточное взаимодействие.
Язык кода:javascript
копировать
int EGLCore::Init(EGLContext shared_context, int egl_version) {
  if (egl_version == 0) {
    egl_version = 2;
  }
  EGLint num_configs;
  const EGLint attributes[] = {
          EGL_BUFFER_SIZE,      32,
          EGL_ALPHA_SIZE,       8,
          EGL_BLUE_SIZE,        8,
          EGL_GREEN_SIZE,       8,
          EGL_RED_SIZE,         8,
          EGL_RENDERABLE_TYPE,
          EGL_OPENGL_ES2_BIT,
          EGL_SURFACE_TYPE,
          EGL_WINDOW_BIT,
          EGL_NONE
  };

  if ((display_ = eglGetDisplay(EGL_DEFAULT_DISPLAY)) == EGL_NO_DISPLAY) {
    LOGE("eglGetDisplay() returned error %d", eglGetError());
    return Error::OPENGL_DISPLAY_ERROR;
  }
  if (!eglInitialize(display_, 0, 0)) {
    LOGE("eglInitialize() returned error %d", eglGetError());
    return Error::OPENGL_INITIALIZE_ERROR;
  }

  if (!eglChooseConfig(display_, attributes, &config_, 1, &num_configs)) {
    LOGE("eglChooseConfig() returned error %d", eglGetError());
    Release();
    return Error::OPENGL_CONFIG_ERROR;
  }
  EGLint eglContextAttributes[] = { EGL_CONTEXT_CLIENT_VERSION, static_cast<EGLint>(egl_version), EGL_NONE };
  context_ = eglCreateContext(display_, config_, shared_context, eglContextAttributes);
  if (context_ == nullptr) {
    LOGE("eglCreateContext() returned error %d", eglGetError());
    Release();
    return Error::OPENGL_CREATE_CONTEXT_ERROR;
  }
  return 0;
}

Поверхность для NativeWindow, сборка EGLSurface

  1. Поверхность можно преобразовать в NativeWindow в основном потоке.
  2. Создайте EGLSurface через NativeWindow в потоке EGL.,Эта EGLSurface не находится за кадром,Можно добиться рендеринга.
Язык кода:javascript
копировать
JNIEnv *env = nullptr;
int ret = get_env(&env);
if (env != nullptr) {
  native_window_ = ANativeWindow_fromSurface(env, surface);
}
if (ret == JNI_EDETACHED) {
  detach_env();
}
Язык кода:javascript
копировать
EGLSurface EGLCore::CreateWindowSurface(ANativeWindow *window) {
  EGLSurface surface = EGL_NO_SURFACE;
  EGLint format;

  if (window == nullptr) {
    LOGE("%s window is null.", __func__);
    return surface;
  }

  if (!eglGetConfigAttrib(display_, config_, EGL_NATIVE_VISUAL_ID, &format)) {
    LOGE("%s eglGetConfigAttrib() returned error %d", __func__, eglGetError());
    Release();
    return surface;
  }
  ANativeWindow_setBuffersGeometry(window, 0, 0, format);
  if (!(surface = eglCreateWindowSurface(display_, config_, window, nullptr))) {
    LOGE("%s eglCreateWindowSurface() returned error %d", __func__, eglGetError());
  }
  return surface;
}

Рендеринг текстуры изображения

Язык кода:javascript
копировать
if (render_screen_ == nullptr) {
  render_screen_ = new effect::OpenGL();
}
render_screen_->SetOutput(surface_width_, surface_height_);
render_screen_->ProcessImage(process_id);
if (!egl_core_->SwapBuffers(egl_surface_)) {
  LOGE("eglSwapBuffers error: %d surface: %d", eglGetError(), (egl_surface_ == EGL_NO_SURFACE));
}

Process_id окончательного рендеринга выше — это текстура, привязанная к FBO.

Что мы можем сделать, визуализируя изображения? Мы можем добиться самых разных эффектов.

Например, некоторые эффекты маски видео, эффекты фильтров и эффекты настройки цвета. Давайте рассмотрим простой эффект маски видео.

Благодаря этой статье вы сможете сделать выводы из одного примера и создать еще несколько интересных эффектов.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose