日別アーカイブ: 2021年4月14日

MultiWallpaper 3.1を公開しました

ver.3.1 2021/04/14 解像度が非常に大きい時にメモリ不足になる不具合を修正。(64ビット環境の場合は64ビットで動作するようにしました。32ビット環境の場合は不具合修正されていません)

 というわけで、64ビット化しました。
先日対応したはずのHiDPI環境で壁紙適用すると例外になるというご報告をいただいて調べていましたが、どうもC#(.NET Framework)のBitmapクラスの作成でエラーが発生している様子。
どうやら最大メモリサイズが32ビットだと1GB、64ビットだと2GBとなっているようなので、そこが引っかかっていたようです。
とりあえず64ビットで動作させるという暫定的な対策をしてバージョンアップしました。
参考:【C#】Bitmapクラスの最大サイズは?

 暫定的にといったのは、上限が2倍になっただけでしかないためです。
また、動作するとしても2GBのメモリを消費するのは何とかしたいです。
今のMultiWallpaperの動作としては、すべてのモニタを合わせた分の大きい画像を作成して、貼り付けたい画像を拡大縮小して貼り付けて、必要な部分だけ切り出しています。
MultiWallpaperを公開した2006年当時は4K等のHiDPIモニタなんてほぼ存在していなくて、そのような動作でも何GBもメモリを使うことはなかったのですが…
画像処理の知識があるわけではないので、思いつく対策としてはモニタごとに画像を作成して、貼り付けたい画像を拡大縮小することです。
できなくはなさそうですが、1枚の画像を全モニタに広げるときの位置の計算が面倒臭そうです…

 かっこ内の文章についてですが、C#でAnyCPUでビルドすれば64ビット環境では64ビットで動作し32ビット環境では32ビットで動作する(はず)なので、64ビット環境では上記の対策が効きますが、32ビット環境では今回の対策は効いていないですということです。