|
@domchen 想请教下 std::shared_ptr<CommandEncoder> GLGPU::createCommandEncoder() {
processUnreferencedResources();
return std::make_shared<GLCommandEncoder>(this);
}
void GLGPU::processUnreferencedResources() {
DEBUG_ASSERT(returnQueue != nullptr);
while (auto resource = static_cast<GLResource*>(returnQueue->dequeue())) {
resources.erase(resource->cachedPosition);
resource->onRelease(this);
delete resource;
}
}
void GLGPU::releaseAll(bool releaseGPU) {
if (releaseGPU) {
for (auto& resource : resources) {
resource->onRelease(this);
}
}
resources.clear();
returnQueue = nullptr;
}
std::shared_ptr<GLResource> GLGPU::addResource(GLResource* resource) {
DEBUG_ASSERT(resource != nullptr);
resources.push_back(resource);
resource->cachedPosition = --resources.end();
return std::static_pointer_cast<GLResource>(returnQueue->makeShared(resource));
} |
Replies: 3 comments 6 replies
|
实际上我们绝大部分GPU资源都是提前统一创建的, |
|
我只是在找一些实现想看看 libpag 是如何应用的,然后发现在 libpag 的 filter 实现中是在 onDraw 中每次重新创建 program buffer 这些。 |
|
@domchen 大佬,说到RuntimeEffect,我也有个问题咨询下, 我现在也基于它做了很多特效,发光,噪声,粒子等等,多个特效封装成多个RuntimeEffect实现,目前也只是参考tgfx实现,每一次ondraw都是一次新的流程,我目前测下开只要shader里算法处理得当,性能还是可以的,所以目前还没做任何优化,如果后面一帧加载的RuntimeEffect太多,具体优化 的方向是怎么样的或者说是否有优化的必要 |
实际上我们绝大部分GPU资源都是提前统一创建的,
你可以关注一下ResourceTask的子类,整个这类task都是在RenderTask之前执行,特别是那些含有提交数据的资源一定是提前集中创建,不然会引起渲染过程中的同步卡顿。小部分纹理(主要是纯RT)是用的时候创建,是因为方便进入回收池在一帧内最大化复用,加上单纯的创建操作不涉及提交数据的话并不会造成卡顿问题,所以RT都是延迟的。还有一类是program资源,理论上应该是提前创建的,但是program基本上很少会频繁创建,创建一次就持续缓存使用,所以暂时没有专门去优化提前它。