qt性能–;OpenGL

qt性能–;OpenGL,qt,qt4,embedded-linux,Qt,Qt4,Embedded Linux,我不想在我的小部件(QPaint)的绘制功能中使用原生OpenGL来提高性能。 我看到有一个函数QPaint::begin/EndNativePaint(),可以帮助我。 但我找不到这样的例子。。。 我想知道这些功能是低成本的,还是每次使用都会降低性能? 2.我可以为我使用的所有小部件定义BeginativePainting()和endNativePainting(),而不是在我拥有的每个绘制函数中使用它吗 tnx的任何帮助…文档中有一些基本的示例代码: 函数本身的成本应该相当低,但调用它们可能

我不想在我的小部件(QPaint)的绘制功能中使用原生OpenGL来提高性能。 我看到有一个函数QPaint::begin/EndNativePaint(),可以帮助我。 但我找不到这样的例子。。。 我想知道这些功能是低成本的,还是每次使用都会降低性能? 2.我可以为我使用的所有小部件定义BeginativePainting()和endNativePainting(),而不是在我拥有的每个绘制函数中使用它吗


tnx的任何帮助…

文档中有一些基本的示例代码:

函数本身的成本应该相当低,但调用它们可能仍然会导致明显的开销,因为Qt必须在
BeginativePainting()
调用上刷新其内部绘制队列,并且可能必须假设只要调用
endNativePainting()
就可以更改所有内容


至于第二部分,我不确定我是否理解你的目标。基本上,如果您有一个QPaint对象,您可以调用
BeginativePainting()
一次。但是您必须将其与
endNativePaint()
调用相匹配。所以通常的位置是paint()方法。

文档中有一些基本的示例代码:

函数本身的成本应该相当低,但调用它们可能仍然会导致明显的开销,因为Qt必须在
BeginativePainting()
调用上刷新其内部绘制队列,并且可能必须假设只要调用
endNativePainting()
就可以更改所有内容


至于第二部分,我不确定我是否理解你的目标。基本上,如果您有一个QPaint对象,您可以调用
BeginativePainting()
一次。但是您必须将其与
endNativePaint()
调用相匹配。因此,通常的位置是paint()方法。

Qt使用一系列OpenGL功能来实现其2D绘制,包括自定义着色器和各种帧缓冲区。它使OpenGL陷入了一个相当混乱的状态

beginativepainting
/
endNativePainting
允许Qt的绘图引擎保存此上下文,并在用户完成绘图后检索它

如果
xxxNativePaint
方法正好相反(即自动保存和恢复OpenGL的用户配置),那就太好了,但是由于Qt允许直接调用OpenGL原语,如果没有大量代码和潜在的严重性能影响,保存全局状态几乎是不可能的

相反,这些方法只是保存Qt的内部OpenGL状态,而不是让用户代码以一种毫无意义的配置启动(并且可能随着每个新的Qt版本而改变),将OpenGL重置为“中立”状态。
这意味着,在“开始/结束”部分中,您将从一块干净的石板开始:没有着色器链接,没有顶点数组,大多数全局参数将重置,等等

与简单的
QGLWidget
/
PaintGL
场景相反,在该场景中,您可以一次性设置全局OpenGL状态,只需在每帧调用渲染原语,在调用
beginativepainting
(链接/绑定着色器、设置全局参数、选择并启用各种缓冲区等)


这也意味着你应该少用本地绘制。让每个小部件进行自定义绘制可能很快就会让你的渲染陷入困境。

Qt正在使用一系列OpenGL功能来实现其2D绘制,包括自定义着色器和各种帧缓冲区。它将OpenGL置于一种非常混乱的状态

beginativepainting
/
endNativePainting
允许Qt的绘图引擎保存此上下文,并在用户完成绘图后检索它

如果
xxxNativePaint
方法正好相反(即自动保存和恢复OpenGL的用户配置),那就太好了,但是由于Qt允许直接调用OpenGL原语,如果没有大量代码和潜在的严重性能影响,保存全局状态几乎是不可能的

相反,这些方法只是保存Qt的内部OpenGL状态,而不是让用户代码以一种毫无意义的配置启动(并且可能随着每个新的Qt版本而改变),将OpenGL重置为“中立”状态。
这意味着,在“开始/结束”部分中,您将从一块干净的石板开始:没有着色器链接,没有顶点数组,大多数全局参数将重置,等等

与简单的
QGLWidget
/
PaintGL
场景相反,在该场景中,您可以一次性设置全局OpenGL状态,只需在每帧调用渲染原语,在调用
beginativepainting
(链接/绑定着色器、设置全局参数、选择并启用各种缓冲区等)


这也意味着你应该少用本地绘画。让每个小部件进行自定义绘画可能很快就会让你的渲染陷入困境。

我看到了这个例子,但没有程序(在qt示例/演示/诺基亚论坛中)使用它…我想知道它是否真的有用,或者有其他方法可以这样做。2.如果我要在应用程序中的许多小部件中使用它,我可以将BeginativePainting()放在QWidget的ctor中…和endNativePainting()中在dtor中?…当我有很多小部件时,它真的有用吗?Qt框架为您提供了一个QPainter作为QWidget的paintEvent()方法的参数。使用begin/endNativePainting()仅在该方法内部有意义(只要QPainter存在)。因此您不能简单地在ctor中调用BeginativePainting()(关于什么?)如果您不确定自己在做什么,我建议您只使用QPainter进行绘制和编辑