Qt如何删除OpenGL中的大量指定图形?

How to delete a large number of specified graphics in OpenGL with Qt?

我使用 OpenGL 和 Qt 绘制了数百万条线。有些行不需要删除,有些行需要删除。所以我把需要删除的行指针放到了QList。当需要删除这些行时,我先删除指针,然后清除QList。但是我发现这个操作很耗时,尤其是在我的嵌入式设备中。像这样的一些代码:

class Drawable : protected QOpenGLExtraFunctions
{
......
}

class GlWidget : public QOpenGLWidget, protected QOpenGLFunctions_ES2
{
public:
void addNeedToDeleteDrawable(Drawable *drawable){
    need_to_delete_drawerlist.append(drawable);
    alldrawerlist.append(drawable);
}
void deleteDrawable()
{
    if(need_to_delete_drawerlist.isEmpty()) return;
    for(auto& p : need_to_delete_drawerlist){
        auto index = alldrawerlist.indexof(p);
        delete p;
        p = nullptr;
        alldrawerlist.removeAt(index);
    }
    need_to_delete_drawerlist.clear();
}
private:
QList<Drawable*> alldrawerlist;              //contains all lines to paint
QList<Drawable*> need_to_delete_drawerlist;  //contains lines need to delete
}

当我需要删除需要删除的行时,调用函数deleteDrawable()。当 need_to_delete_drawerlist 包含数百万个元素时,这种方式会花费大量时间。有没有其他方法可以实现或者如何优化这个功能?

如果你有足够的内存预算,你可以尝试重用 Drawable 对象而不是删除它们。 首先,保留一个(全局)自由列表:

QList<Drawable*> freelist;

然后,当你分配一个新的Drawable时,先看看freelist中有没有:

Drawable *newDrawable() {
    if (freelist.isEmpty())
        return new Drawable;
    return freelist.takeFirst();
}

您还可以创建此函数的变体,直接执行正确的初始化:

template<typename... Args>
Drawable *newDrawable(Args&&... args) {
    if (freelist.isEmpty())
        return new Drawable(std::forward<Args>(args)...);
    auto el = freelist.takeFirst();
    *el = Drawable(std::forward<Args>(args)...);
    return el;
}

最后,当您打算删除 Drawable 时,请改为调用 freelist.append(drawable)