gnote on QEMUを速くしよう

  • 結果を見るとキー入力→再描画に結び付いていないように見える。ここをもう少し掘り下げてコードを見てみる。
    • 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
  • canvas.cppのpaintをもうすこし細かく見てみる
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 に行われているように見える(カーソルの点滅のため?)