バグ: JPDCイメージを背景セルとして直接配置した時にマスク指定が機能しない

Issue #787 new
k4nagatsuki repo owner created an issue

Comments (12)

  1. 暗黒 騎士

    再現中に気づいたのですが、画面拡大/等倍切替を行うと表示中のJPDCが更新されるようです。これは仕様になりますか? 1.50のフルスクリーン機能では変化しないようでした。

    再現シナリオ:https://bitbucket.org/akkw/cardwirthpy-reboot/downloads/Classic_test.zip

    EFB関連>検証エリアに移動

    ※エリア切替前のMAPOFWIRTHで表示されていた左セルのJPDCが、画面拡大を行うと現在エリアのピンク背景に変化します。

  2. k4nagatsuki reporter

    pull request #2459

    画面スケールの変更やスキンの切替がある場合はJPDCイメージを再撮影しないといけないのですが、その際にはJPDCが読み込まれる直前の画面再構築のタイミングで背景を再描画していなければなりません。

    その処理はだいぶ前に入れたのですが、いつの間にか(最初から?)背景変更では機能していなかったようです。

  3. 暗黒 騎士
    CardWirthPy 3.3 (64-bit)
    Build: 2019-04-20 14:57:13
    

    にて依然として再現するようです。

  4. k4nagatsuki reporter

    pull request #2463

    ありがとうございます。確認不足でした。

    対処しましたが、完全ではありません。これを完全にするのは恐ろしく大変です。背景上書き前に表示されていた画面を別に記憶する仕組みを用意する必要があります。

  5. k4nagatsuki reporter

    いや、この修正はまずいですね。今回のケースはともかくJPDCイメージの手前にセルがあって画面再構築をした時に壊れます。元に戻します。

    ちょっと打つ手が無いです。

  6. k4nagatsuki reporter

    ちなみに1.50では画面再構築やセーブ&ロード、中断して再開などで個別の問題が発生します。原因はCWPyで発生するものと全て同じで、JPDCの仕様上の不具合です。

  7. k4nagatsuki reporter

    考えてみましたが、このJPDCの撮影範囲に当のJPDCの撮影結果が含まれるもの、つまり再帰的JPDCの問題には、現実的な解決策がなさそうです。

    • 画面再構築を行うと、JPDCの再帰が一段進みます。これは理論上無限に繰り返すことが可能です。
    • 無限再帰を避ける方法は、画面自体を画像として比較し、変化がなくなったところで再帰を止める事ですが、そのために必要な記憶量は、ケース次第で非現実的なレベルになります。

    つまり理屈の上では対処方法がありません。JPDCの仕様上、おそらくこういう対応不能ケースは存在しているだろうと思っていましたが、とうとうぶち当たってしまいました。

    これにJPDC撮影によるファイルの更新やPCのイメージ変更、カード配置の変化など、画面の変化を伴う全ての要素が絡んでくるので、問題の複雑さは際限が無くなります。つまり裏技じみた方法で擬似的に対応しようとする事すら困難です。その方法も思いつきません。

    解決策は、再帰を検出した時に、JPDCの撮影を根本からやめる事だけです。が、それは既存のシナリオが動かなくなる可能性を伴う選択肢なので採れません。

    残念ながら八方塞がりと言うしかありません。

  8. 暗黒 騎士

    画面スケールの変更では再撮影するのではなく、固定されたテキストセルのようにJPDCのキャッシュを更新せず、単純にそのままそのキャッシュを画像としてスケーリングするという手法は取れないのでしょうか?

  9. k4nagatsuki reporter

    実ファイルへの保存が必要になる他、スキン変更や撮影によるファイル更新のような画面要素の変更にうまく対応できません。

    不完全ながら一つの手段ではあります。現実に再帰問題で困るというシナリオがあった場合は、多分その手を使う事になるでしょう。

  10. k4nagatsuki reporter

    肝心な事を書き忘れていました。

    その手を使う場合、本当に問題の再帰が起きる場合に限定しなければ、問題の無いJPDC撮影結果にスキンやスケールの変更が反映される仕様が犠牲になってしまいます。

    背景処理の構造上、問題のある再帰の検出は結構面倒なはずです。シナリオで問題が出ない限りやりたくない理由はその辺りにあります。

  11. 暗黒 騎士

    あー…書き込みが必要になるのはパフォーマンス上問題ですね。検討して頂きありがとうございます。

  12. Log in to comment