- 結果を見るとキー入力→再描画に結び付いていないように見える。ここをもう少し掘り下げてコードを見てみる。
- gnoteのタイマーイベント処理で repaint()が呼ばれている。window.GetCanvas()->repaintAt(ToCanvasY(cursol.wy, cursol.top));
- これが怪しいのでタイマーイベントをコメントアウトしてみる
- あまり変わらなかったので元に戻す
- もう少し細かくログをとってみた
0x3ef348020 : ProcessKeyPressedEvent controller.cpp:199 0x5f5c1
0x3ef3a7b3f : Insert document.cpp:129 0x5fb1f
0x3ef4144f0 : ProcessKeyPressedEvent controller.cpp:311 0x6c9b1
0x3ef46a748 : GoRight controller.cpp:344 0x56258
0x3ef4d85b3 : ProcessKeyPressedEvent controller.cpp:314 0x6de6b
0x3ef52db85 : repaint awt/Component.cpp:84 0x555d2
0x3ef56e629 : repaint awt/Component.cpp:86 0x40aa4
0x3ef5b0055 : repaint awt/Component.cpp:88 0x41a2c
0x3ef5f066c : paint canvas.cpp:57 0x40617
0x3f258aca3 : paint canvas.cpp:75 0x2f9a637
0x3f25c8afd : repaint awt/Component.cpp:90 0x3de5a
0x3f2609769 : update awt/Component.cpp:102 0x40c6c
0x3f8898f51 : update awt/Component.cpp:105 0x628f7e8
0x3f88ef04b : update awt/Window.cpp:246 0x560fa
0x3ff424237 : update awt/Window.cpp:250 0x6b351ec
0x3ff4982c1 : WindowHandler window.cpp:406 0x7408a
0x400fc13d5 : WindowHandler window.cpp:413 0x1b29114
0x40108eaea : update awt/Window.cpp:253 0xcd715
0x401149b1a : update awt/Component.cpp:107 0xbb030
0x48a2c60ee : paint canvas.cpp:57 0x4115c
0x48a2fe030 : paint canvas.cpp:59 0x37f42
0x48d7be752 : paint canvas.cpp:61 0x34c0722
0x48d813d93 : paint canvas.cpp:63 0x55641
0x48d8764e8 : paint canvas.cpp:65 0x62755
0x48d8e5b2a : paint canvas.cpp:67 0x6f642
0x48d91d37c : paint canvas.cpp:70 0x37852
0x48daa30a2 : paint canvas.cpp:72 0x185d26
0x48dadba84 : paint canvas.cpp:78 0x389e2
0x48db65d2d : paint canvas.cpp:80 0x8a2a9
0x48dbdaf08 : paint canvas.cpp:82 0x751db
0x48dc13365 : paint canvas.cpp:84 0x3845d
0x48dc6f606 : paint canvas.cpp:86 0x5c2a1
0x48dca8059 : paint canvas.cpp:89 0x38a53
-
- 59-61行目で2桁ちがう g->fillRect(0, 0, getWidth(), getHeight());
- 安易にコメントアウトしてみる
- 見た目は悪くなるし体感的に速くない
- 次の遅い場所 Component.cppの102-105 c->getGraphics()->drawImage(this->_buffer, getX(), getY());
- getX=0, getY=20のdrawImageに時間かかりすぎ疑惑
- c->getGraphics()->drawImage(this->_buffer, getX(), getY());
void Graphics::drawImage(Image* image, int x, int y)
{
for (int i = 0; i < image->getHeight(); i++) {
for (int j = 0; j < image->getWidth(); j++) {
drawPixel(j + x, i + y, image->getPixel(j, i));
}
}
}
- ここのdrawPixelは、共有メモリにマップされたVRAMにつながっているかな?
- 取りあえず getHeight(), getWidth()は毎回呼ばれるのがもったいないのと。getPixelはinlineにしよう
- いまのところ怪しいのは
- 一文字しか変更がないのに再描画はコンポーネント全体に及んでいること(どこかで適切にカットすべき)
- 再描画が periodical に行われているように見える(カーソルの点滅のため?)