2011-04-12 39 views
1

我不想在我的小部件(QPainter)的绘图函数中使用Native OpenGL来提高性能。 我看到有函数QPainter :: begin/endNativePainting(),可以帮助我。 但我找不到这样的例子... 我想知道如果这些功能是低成本,或者evry使用它们会降低性能? 2.can我可以定义beginNativePainting()和endNativePainting(),通常用于我使用的所有小部件,而不是在每个绘图函数中都使用它。qt performance - OpenGL

TNX任何帮助....

回答

1

有一些基本的示例代码的文档权:http://doc.qt.io/qt-4.8/qpainter.html#beginNativePainting

本身应该是相当廉价的功能,但称他们可能仍然会导致显着开销,因为Qt必须在beginNativePainting()调用中刷新其内部绘画队列,并且可能必须假定调用endNativePainting()后立即更改所有内容。

对于第二部分,我不确定我是否理解你的目标。基本上,如果您有QPainter对象,则可以拨打beginNativePainting()一次。但你必须将其与endNativePainting()呼叫相匹配。所以通常的地方是paint()方法。

+0

我看到了这个例子,但是没有使用它的程序(在qt examples/demos/nokia-forum中)...并且我想知道它是否真的有用,或者有其他方法可以这样做。 2.如果我打算将它用于应用程序中的很多小部件,我可以将beginNativePainting()放在QWidget的ctor和第dtor端的endNativePainting()中? .....当我有很多小部件时它真的有用吗? – dan 2011-04-12 11:31:18

+0

Qt框架提供了一个QPainter作为QWidget的paintEvent()方法的参数。使用begin/endNativePainting()只在该方法内部有意义(只要QPainter存在)。所以你不能简单地在ctor中调用beginNativePainting()(在什么上?)如果你不确定你在做什么,我建议只使用QPainter来绘制并忽略begin/endNativePainting()。只有当你遇到一些你无法用Qt API解决的问题时,那可能是需要重新考虑的问题了。 (如果你以后只是使用OpenGL,你可能想看看Qt的图形系统。) – Steffen 2011-04-12 12:38:12

+0

我必须使用opengl来提高性能....我想知道什么是最好的方法在不改变我的小部件代码中的许多部件的情况下做到这一点。 – dan 2011-04-12 12:51:01

0

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

beginNativePainting/endNativePainting是否允许Qt的绘图引擎保存此上下文并在用户完成绘制后检索它。

如果让xxxNativePainting方法做相反的事情(即自动保存并恢复OpenGL的用户配置)本来是很不错的,但由于Qt允许直接调用OpenGL原语,所以在没有大量代码的情况下保存全局状态几乎是不可能的并可能造成严重的性能下降但是,这些方法只是简单的保存Qt的内部OpenGL状态,而不是让用户代码在一个毫无意义的配置中启动(而且很可能随着每个新的Qt版本而改变),将OpenGL重置为“中立”状态。
这意味着,一开始/结束段里面,你会改过自新:无着色器链接,没有顶点数组,最具全球性的参数复位等

相反,一个简单的QGLWidget/PaintGL场景您可以一劳永逸地设置全局OpenGL状态,并且只需在每帧调用渲染原语,在调用beginNativePainting(链接/绑定着色器,设置全局参数,选择并启用各种缓冲器等)。

这也意味着你应该使用原生绘画陪练。让每个单独的小部件做自定义绘画可能会很快使您的渲染瘫痪。