QT フレームワーク、特にpaintEvent
of の使用に問題がありQWidget
ます。QWidget
セットアップがあり、それをオーバーライドしpaintEvent
ています。51 x 19 の一連の四角形 (グリッド システム) をレンダリングする必要があり、969 個の四角形が描画されます。これは for ループで行われます。次に、これらのグリッドのそれぞれに画像を描画する必要もあります。QWidget
が に追加され、表示QMainWindow
されます。
これはうまく機能しますが、開いているウィンドウごとに 47% の CPU を使用しています! そして、ユーザーがこのように複数のウィンドウを開くことができるようにしたいと考えています。一度に 3 ~ 4 個のウィンドウを開くと、CPU が 150% 近くになります。
なぜこれが起こるのですか?内容はこちらpaintEvent
。JNI 呼び出しは CPU 使用率を引き起こしません。コメント アウトしても CPU 使用率は低下しませんが、(画像を描画する) p.fillRect
and をコメント アウトすると、CPU 使用率Renderer::renderString
は約 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);
}