2015/08/27(木) [n年前の日記]
#1 [dxruby] DXRubyのImage.load_tilesの不具合
DXRuby の Image.load_tiles を使っていたのだけど、もしかすると不具合に遭遇したかもと思えてきたので一応メモ。
ちなみに、Image.load_tiles というのは、タイル状に並んだ画像を一枚読み込んで、ソレを指定個数で分割して画像として持てる、みたいな機能。というかメソッド。
症状としては、Image.load_tiles で大きな画像を読み込むと不正終了してしまう、みたいな感じ。例えば、394x406ドットのpng画像を32枚、横一列に並べて、12608 x 406ドットの画像を作って読み込ませてみたら不正終了してしまったわけで。
もしかして4096とか8192とかの制限があるのかなと思えてきたので、4096ドットや8192ドットを超えた時は横一列に並べるのをやめて縦方向も使って並べた画像にしてみたり。つまり、横にめちゃくちゃ長い画像じゃなくて、できるだけ正方形に近い画像を読み込ませて分割させてみたらどうなるかと。…これだと不正終了しない。
と思ったけど、そういった感じの画像を、おおよそ90ファイル前後読ませてみたら、また不正終了。
ちなみに、画像をバラバラにして、Image.load で1枚1枚読み込ませたら不正終了しなかった。 *1
件のメソッドには画像サイズ等に関して何か制限か仕様があるんじゃないかとドキュメントを眺めてみたけど、それらしい記述は見つからず。まあ、こんなに巨大な画像を大量に読み込むことは想定してない、そんな予感も…。
ちなみに、Image.load_tiles というのは、タイル状に並んだ画像を一枚読み込んで、ソレを指定個数で分割して画像として持てる、みたいな機能。というかメソッド。
症状としては、Image.load_tiles で大きな画像を読み込むと不正終了してしまう、みたいな感じ。例えば、394x406ドットのpng画像を32枚、横一列に並べて、12608 x 406ドットの画像を作って読み込ませてみたら不正終了してしまったわけで。
もしかして4096とか8192とかの制限があるのかなと思えてきたので、4096ドットや8192ドットを超えた時は横一列に並べるのをやめて縦方向も使って並べた画像にしてみたり。つまり、横にめちゃくちゃ長い画像じゃなくて、できるだけ正方形に近い画像を読み込ませて分割させてみたらどうなるかと。…これだと不正終了しない。
と思ったけど、そういった感じの画像を、おおよそ90ファイル前後読ませてみたら、また不正終了。
ちなみに、画像をバラバラにして、Image.load で1枚1枚読み込ませたら不正終了しなかった。 *1
件のメソッドには画像サイズ等に関して何か制限か仕様があるんじゃないかとドキュメントを眺めてみたけど、それらしい記述は見つからず。まあ、こんなに巨大な画像を大量に読み込むことは想定してない、そんな予感も…。
*1: というか今までそういうやり方で処理していたのだけど。
この記事へのツッコミ
[ ツッコミを読む(3) | ツッコむ ]
以上です。
http://d.hatena.ne.jp/t_tutiya/touch/20131108/1383871461
参考になればー。
load_tilesはメインメモリで画像分割してるものと思い込んでましたが
一旦VRAMに渡してそこで画像分割してる、からVRAM容量を超えると落ちるのかしらん…。
となると、ビデオカードがどの程度のメモリを持ってるか・扱えるかで、
load_tilesで強制終了したりしなかったりする場合もありそうですね…
何にしても画像サイズを小さくしないとマズイなあ…
https://osdn.jp/projects/dxruby/scm/svn/commits/402
確か、DirectXの画像データ作成限界とかだったかと思います。