我在使用 QT 框架时遇到了问题,尤其是paintEvent
使用QWidget
. 我有一个QWidget
设置,并且正在覆盖paintEvent
它。我需要渲染一堆 51 x 19 的矩形(网格系统),导致绘制 969 个矩形。这是在 for 循环中完成的。然后我还需要在每个网格上绘制一个图像。被QWidget
添加到 aQMainWindow
中,如图所示。
这很好用,但是每个打开的窗口都占用了 47% 的 CPU!而且我想让用户像这样打开多个窗口,就像一次打开 3-4 个窗口,这使 CPU 接近 150%。
为什么会这样?这里是paintEvent
内容。JNI 调用不会导致 CPU 使用率,将它们注释掉并不会降低它,但注释掉p.fillRect
and Renderer::renderString
(绘制图像)会将 CPU 降低到大约 5%。
// Background
QPainter p(this);
p.fillRect(0, 0, this->width(), this->height(), QBrush(QColor(0, 0, 0)));
// Lines
for (int y = 0; y < Global::terminalHeight; y++) {
// Line and color method ID
jmethodID lineid = Manager::jenv->GetMethodID(this->javaClass, "getLine", "(I)Ljava/lang/String;");
error();
jmethodID colorid = Manager::jenv->GetMethodID(this->javaClass, "getColorLine", "(I)Ljava/lang/String;");
error();
// Values
jstring jl = (jstring) Manager::jenv->CallObjectMethod(this->javaObject, lineid, jint(y));
error();
jstring cjl = (jstring) Manager::jenv->CallObjectMethod(this->javaObject, colorid, jint(y));
error();
// Convert to C values
const char *l = Manager::jenv->GetStringUTFChars(jl, 0);
const char *cl = Manager::jenv->GetStringUTFChars(cjl, 0);
QString line = QString(l);
QString color = QString(cl);
// Render line
for (int x = 0; x < Global::terminalWidth; x++) {
QColor bg = Renderer::colorForHex(color.mid(x + color.length() / 2, 1));
// Cell location on widget
int cellx = x * Global::cellWidth + Global::xoffset;
int celly = y * Global::cellHeight + Global::yoffset;
// Background
p.fillRect(cellx, celly, Global::cellWidth, Global::cellHeight, QBrush(bg));
// String
// Renders the image to the grid
Renderer::renderString(p, tc, text, cellx, celly);
}
// Release
Manager::jenv->ReleaseStringUTFChars(jl, l);
Manager::jenv->ReleaseStringUTFChars(cjl, cl);
}