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)
。
我使用 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)
。