首先,虽然信号\插槽是 Qt 的一个强大而令人敬畏的特性,但由于增加的开销和渲染顺序问题,我永远不会在我的渲染例程中使用它们;尤其是后者。此外,没有必要按照您建议的方式进行。因此,在我看来,您将渲染例程分散到整个项目中的想法是一个非常糟糕的想法。我在自己的项目中所做的如下:
我的派生QGLWidget
拥有一个Renderer
作为单例实现的类。它包含几个函数中的所有 OpenGL 调用。我创建了一个系统,其中可绘制的所有内容都派生自同一个基类。当我想渲染时,我构建了一个渲染队列,我priority_queue
用自定义排序函数实现了它。当是渲染帧的时候了,我只是不停地弹出并渲染,直到队列为空。使用事件驱动的渲染系统执行此操作,同时保持正确的渲染顺序可能会让您发疯。
为了完整起见,我的(简化的)QGLWidget 定义:
#include <QtOpenGL/QGLWidget>
#include "global.h"
#include "renderer.h"
/**
* Derivation of QGLWidget.
*/
class Engine : public QGLWidget
{
Q_OBJECT
private:
Renderer* renderer;
private slots:
void renderTimeout(); // my render-loop is timer based
void onTap(QMouseEvent* qme);
void onMove(QMouseEvent* qme);
protected:
void initializeGL();
void resizeGL(int w, int h);
/* for debugging I use QPainter for drawing overlays,
* so I can't use PaintGL */
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent* qme);
void mouseMoveEvent(QMouseEvent* qme);
public:
Engine( QWidget* parent = 0 );
~Engine();
signals:
void tapOccurred(QMouseEvent* qme);
void moveOccurred(QMouseEvent* qme);
};