この広告は、90日以上更新していないブログに表示しています。
iPad Safari image limit workaround | Adventures in Code
Pixiv のランキングをスライドショーで表示するSeiga Show を作っていて、なぜか 45位以降の画像が表示されないことがたまにあって調べていたのだが、どうやらiPad のSafari では1ページあたりの画像サイズの合計が 6.5MB を超えると、それ以降の画像が表示できないという問題があるようだ。
2011/05/29 追記iPad 2 では普通に表示できます。やはりメモリ容量の問題だったみたいです。
Pixivの画像が大体1枚 150k前後なので、150k * 45 = 6,750k となり、大体計算も合うのでほぼ間違いなし。
上記で紹介した記事では、HTML5 のCanvas の drawImage を使えば、この制限を回避できる、と書いてあり、サンプルページをiPad 実機で確認したところ、確かに 10MB までの画像が表示できていた。 が、iPhone 3G ではSafari ごと落ちてしまうことがほとんどで、表示できても 9MB あたりに制限があるようで、全ての画像は表示できなかった。
なので、結局、画像のキャッシュサイズをプログラムで制御し、古い画像(imageタグ) を DOM から破棄していくことで対応するしかなさそう。
もう少し解析した結果、Canvas 使う場合でも、明示的に image を解放してあげないと、GC の対象にならないようなので、最終的には以下のコードで上手く動作した。
var image = new Image();image.onload = function() { // load 後の処理 var c = document.getElementById('canvas'); var ctx = c.getContext('2d'); c.width = image.width; c.height = image.height; ctx.drawImage(image, 0, 0); image = null; // ← これ重要};image.src = imageSrc;この問題でもっとも頭が痛いのは、HTTP のステータスとしては 200、つまり正常として返ってくるので、プログラムからエラーを検知できない、という点で、ホントなんとかしてもらいたい。
結局、HTML5 だろうと、ネイティブなアプリと同様メモリ管理を意識しないといけないという当たり前のことなんだけど、PC上のSafari だと起こらない問題なので、忘れがちだし、この辺、「iPhoneアプリケーション開発ガイド ―HTML+CSS+JavaScript による開発手法」にも書いてないので要注意。

iPhoneアプリケーション開発ガイド ―HTML+CSS+JavaScript による開発手法
引用をストックしました
引用するにはまずログインしてください
引用をストックできませんでした。再度お試しください
限定公開記事のため引用できません。