Qt可以在屏幕上绘制多少条线?

3
我目前正在开发一个Qt地图绘制应用程序。我试图绘制超过400,000条线,但在使用约2GB内存后崩溃,虽然我的计算机上还有空余内存。我想知道我是否达到了Qt内部的一些限制,导致出现问题。是否有人知道您可以绘制的对象数量是否受限或者是否可以更改此限制?
如果有帮助的话,我是使用C++编写的,其中一个类具有绘制线条的成员函数。大致代码如下:
QPointF fromPoint;
QPointF toPoint;
fromPoint = foo( x );
toPoint = foo( y );
m_Painter.drawLine(fromPoint, toPoint );

//m_Painter is a QPainter

编辑:事实证明问题出在代码的其他地方。这与正在进行的自定义缓存有关。尽管如此,我仍然想知道Qt可以绘制多少行是否有限制。有人知道吗?


2GB 看起来是进程的 32 位限制。你是在编译 32 位的 Windows 吗? - Bruce
不,我在64位机器上。 - Veelox
1
你是在64位机器上,还是在编译64位进程?这两者是非常不同的... - Leonardo Bernardini
非常好的观点。我不确定,但看起来我正在编译为win32。 - Veelox
3
屏幕上有40万条线,我不知道这是什么地图?也许你只需要绘制可见的线而不是整张地图上的所有线?这样可以节约内存并加速应用程序。 - folibis
我正在使用我所获得的数据绘制欧洲所有主要高速公路。 - Veelox
1个回答

3

QPainter通过QPaintEngine执行其底层图形,该引擎有多种实现(如qpaintengine_mac.cppqpaintengine_x11.cppqpaintengine_preview.cpp)。

一些设备是栅格化的...它们可能会将每条线都绘制到图像缓冲区中,并在绘制完成后丢弃端点。在这种情况下,你可以画无数条线。

如果目标设备是OpenGL,或者打印机正在进行某种类似于PostScript的输出,则该特定绘图引擎的限制可能成为一个问题。你需要查看具体的引擎。

例如:如果追踪drawLine的X11实现,你会看到它通过drawPolygon()传递到strokePolygon_dev()...并最终调用XDrawLines

XDrawLines(dpy, hd, gc, pts, numberPoints, CoordModeOrigin);

那么你又有了另一个抽象层...所以问题就变成了XWindows显示参数是否保证为光栅。 (我猜它是。)
无论如何,答案是“如果是光栅,则无限制。可能取决于其他因素-但限制(如果有的话)很可能来自涂料引擎的底层设备,而不是Qt。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接