Мобильная платформа, которую я использую в моем текущем проекте UE 4.27, имеет низкую производительность, поэтому я рассматриваю, могу ли я приостановить поток рендеринга и выпустить ресурсы рендеринга на сцене, когда программа вступает в фон (чтобы уменьшить использование видео памяти). Сначала я проверил его в режиме редактора, но результат не уменьшил использование видео памяти, как я ожидал. Регистрация ресурсов использует актеры сцены для регистрации всех ресурсов и спасения их членам класса Tarray. При выпуске интерфейс FCEREDELEGATES :: ApplicationWillEnterbackgroundDelegate < /code> уведомляет метод выпуска для их освобождения.
Вот пример кода: < /p>
// Here is registeration code.
for (TActorIterator It(GetWorld()); It; ++It)
{
AActor* Actor = *It;
TArray MeshComponents;
Actor->GetComponents(MeshComponents);
for (auto* Comp : MeshComponents)
{
if (Comp && Comp->GetStaticMesh())
{
// Push the static mesh pointer to the
optimizer->RegisterDefaultResources(Comp->GetStaticMesh());
}
}
}
...
// Here is resource release code (In another function).
for (auto Res : DefaultResources)
{
// Texture release.
if (UTexture2D* Tex = Cast(Res))
{
if (Tex->Resource)
{
Tex->ReleaseResource();
}
}
// Static mesh release.
else if (UStaticMesh* Mesh = Cast(Res))
{
if (Mesh->GetRenderData())
{
for (auto& LOD : Mesh->GetRenderData()->LODResources)
{
ENQUEUE_RENDER_COMMAND(ReleasePositionVBResource)([lodRes = LOD.VertexBuffers.PositionVertexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
ENQUEUE_RENDER_COMMAND(ReleaseMeshVBResource)([lodRes = LOD.VertexBuffers.StaticMeshVertexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
ENQUEUE_RENDER_COMMAND(ReleaseIBResource)([lodRes = LOD.IndexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
}
}
}
}
...
// Here is release call (In another function).
SCOPED_SUSPEND_RENDERING_THREAD(false);
StopRenderingThread();
RHIExit();
GIsRunning = false;
MemoryOptimizer->OptimizerBackgroundProcess(); // Here is release logic.
< /code>
В режиме редактора поток рендеринга действительно остановлен. Но графическая память не выпущена. Я не понимаю, почему.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ead-in-ue4
Как приостановить нить рендеринга в UE4? ⇐ Android
Форум для тех, кто программирует под Android
1756153436
Anonymous
Мобильная платформа, которую я использую в моем текущем проекте UE 4.27, имеет низкую производительность, поэтому я рассматриваю, могу ли я приостановить поток рендеринга и выпустить ресурсы рендеринга на сцене, когда программа вступает в фон (чтобы уменьшить использование видео памяти). Сначала я проверил его в режиме редактора, но результат не уменьшил использование видео памяти, как я ожидал. Регистрация ресурсов использует актеры сцены для регистрации всех ресурсов и спасения их членам класса Tarray. При выпуске интерфейс FCEREDELEGATES :: ApplicationWillEnterbackgroundDelegate < /code> уведомляет метод выпуска для их освобождения.
Вот пример кода: < /p>
// Here is registeration code.
for (TActorIterator It(GetWorld()); It; ++It)
{
AActor* Actor = *It;
TArray MeshComponents;
Actor->GetComponents(MeshComponents);
for (auto* Comp : MeshComponents)
{
if (Comp && Comp->GetStaticMesh())
{
// Push the static mesh pointer to the
optimizer->RegisterDefaultResources(Comp->GetStaticMesh());
}
}
}
...
// Here is resource release code (In another function).
for (auto Res : DefaultResources)
{
// Texture release.
if (UTexture2D* Tex = Cast(Res))
{
if (Tex->Resource)
{
Tex->ReleaseResource();
}
}
// Static mesh release.
else if (UStaticMesh* Mesh = Cast(Res))
{
if (Mesh->GetRenderData())
{
for (auto& LOD : Mesh->GetRenderData()->LODResources)
{
ENQUEUE_RENDER_COMMAND(ReleasePositionVBResource)([lodRes = LOD.VertexBuffers.PositionVertexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
ENQUEUE_RENDER_COMMAND(ReleaseMeshVBResource)([lodRes = LOD.VertexBuffers.StaticMeshVertexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
ENQUEUE_RENDER_COMMAND(ReleaseIBResource)([lodRes = LOD.IndexBuffer](FRHICommandListImmediate& RHICmdList)
{
auto& res = const_cast(lodRes);
res.ReleaseResource();
});
}
}
}
}
...
// Here is release call (In another function).
SCOPED_SUSPEND_RENDERING_THREAD(false);
StopRenderingThread();
RHIExit();
GIsRunning = false;
MemoryOptimizer->OptimizerBackgroundProcess(); // Here is release logic.
< /code>
В режиме редактора поток рендеринга действительно остановлен. Но графическая память не выпущена. Я не понимаю, почему.
Подробнее здесь: [url]https://stackoverflow.com/questions/79746164/how-to-suspend-the-rendering-thread-in-ue4[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия