カード操作ダイアログの読み出しが遅くなるカード画像がある

Issue #556 resolved
暗黒 騎士 created an issue

確認したのは「白銀の灯」の「氷水晶」というカードで、 これが荷物袋やカード置き場の現在表示中のページに複数あるほど、ダイアログの展開が明らかに重くなっていきます。(XEditorで[イメージ無し]にした状態で配布すると再現しないのでおそらく画像の処理系?)

10枚すべて「氷水晶」で1~2秒の遅延があり、 ダイアログを開くタイミングで表示していない(別のカードを上に移動させて2ページ目以降にしたりカード置き場に送る等)と改善します。

CardWirthPy 2.0 Beta 4
Build: 2017-08-20 00:33:41

Comments (11)

  1. k4nagatsuki repo owner

    これはwxPythonがメモリ上のイメージを読み出す時に異常に重いという問題に引っかかっているためと思われます。

    それがどれくらい重いかというと、メモリ上のデータからwx.Imageを生成するよりも、二重にファイルから読む方がなお10倍も速いほどです。

    同じ問題は1.1にもあるはずですが、実際には宿に直接カードを配るとファイル上にイメージが書き出されるためこの問題には引っかかりません。そのせいで再現しないという事はないでしょうか。

    とりあえずpull request #1981でキャッシングを試みます。

  2. 暗黒 騎士 reporter

    うーん、経緯としては

    1. Liteの宿にいるセーブで荷物袋がまだ3ページしかないのに異様に重くなり直前にプレイしたシナリオのカードを疑う
    2. Reboot2.0β・宿にいるセーブでデバッガで「氷水晶」を配ってみる→再現
    3. 1.1で同じ事をする→再現せず
    4. 2.0βでコカの葉やフルカラーBMPのカードで1ページ目を全て埋めて比較→明らかに「氷水晶」の時だけ重い

    という流れだったので、全パターンでファイル上にイメージが書き出された状態ということになるのではないでしょうか…?

    当該シナリオはPNGをWBでBMP格納しているようですので、自分は透過関係の変更を疑っていましたが、長月さんの方で再現できないのであれば環境的な問題かもしれません。

    pull request #1981を取り込ませて頂いたところ、初回読み込みは同様に重いですが、二回以降は高速化しました。キャッシングは効いているようです。

  3. k4nagatsuki repo owner

    wx側のイメージの読み込みで1.1と2.0の間にあった事というと、wxPythonのバージョンアップでしょうか。

    特定のイメージだけというのはよく分かりませんし、私の環境では再現しません。何が起きているかよく分からないです。

  4. 暗黒 騎士 reporter

    手元に残ってたもので比較してみましたが、どうも正月あたりの変更で変わっている感じです。

    しかし当時のコミットを見ると拡大関係ぐらいしかないですね…。

    20161107版 初回以降高速
    20161203版 初回以降高速
    20161217版 初回以降高速
    20170103版(α1) 2秒遅延(最新版と同じ)
    20170305版 2秒遅延
    20170716版 2秒遅延
    
  5. k4nagatsuki repo owner

    どのcommitを境に現象が起こるようになったか調べられないでしょうか?

  6. 暗黒 騎士 reporter

    多分特定できました。

    7ec9f64のif self._wxbmp and self._upwin == self._upwinmemo() and not self.is_modifiedfile():のようですね。

  7. k4nagatsuki repo owner

    キャッシュを使うかどうかの判断部分self._upwinmemo()self.is_modifiedfile()、あるいはキャッシュのコピーcw.util.copy_wxbmp()で異常な時間がかかっているという事でしょうか?

    試しにどれかを削除すると劇的に速くなったりするでしょうか? それによって問題箇所をより具体的に特定できるかもしれません。

  8. 暗黒 騎士 reporter

    えっと、何か勘違いしていたらすいません。 そのコミットは元々あったIF文にnot self.is_modifiedfile()を付け足していますよね。

    なのでそのand条件が追加されたことで「氷水晶」が条件漏れを起こしてキャッシュが毎回更新されるようになったという感じではないでしょうか?

    and not self.is_modifiedfile()を削ると1.1および20161217版以前と同じ挙動(キャッシュが使われている?)になります。

  9. k4nagatsuki repo owner

    pull request #1982

    どうもwx側のファイルで更新日時を入れる処理が正しく動いていないようです。宿で起きる現象であれば、格納イメージは関係ありませんでした。

    勘違いしていたかもしれませんが、1.1でも初回は重いという事でよいでしょうか?

  10. 暗黒 騎士 reporter

    改善を確認しました。

    1.1でも初回は重いという事でよいでしょうか?

    多分そうですね。1.1でも初回はコカの葉より重いようです。 なんというか実行ファイルでの起動とソースでの起動、それとしばらく動かした後だと新しく読むファイルでも先ほどより高速だったり微妙に速度が違うので曖昧になっています。pull request #1981では実行ファイルがなく、ソース実行での比較になったので1.1より遅く感じられ、不正確な報告をしてしまったかもしれません。

    2.0正式版前に解決できて良かったです。対処ありがとうございました。

  11. Log in to comment