mieki256's diary



2006/12/22(金) [n年前の日記]

#1 [iappli] 複数のgifをzipでまとめて圧縮してみたけど逆に容量が増えた

DoJa 3.0 からは、JarInflater なる、jar圧縮データ(実のところ中身はzipらしいが)を解凍・伸長できる機能が用意されたらしいので、それを使えばスクラッチパッド上に収めるファイルの容量に関して改善が図れるだろうかと取らぬ狸の金玉は風もないのに皮算用。

が。試しに 7zip や jar で圧縮してみたら、逆に容量が増えた。gifの段階で既に圧縮されてるから、さもありなん、か…。

jar についてメモ。 :

圧縮。
jar cvf jarファイル 圧縮ファイル
jar cvf img.jar *.gif

一覧表示。
jar tf jarファイル
jar tf img.jar

上下左右反転描画を使ってるのだけど。 :

505シリーズでの速度が気になる。

_iアプリベンチ 1.0
_iアプリベンチ2.0

拡大縮小は明らかに大変な事態を招くけど、反転に関しては…酷くても4倍程度の時間なのか。とりあえず今回は、常時使ってる場合の面積は小さいし。面積が大きいものを反転するときは、初期化処理の時しか描画していないから、まあ、大丈夫かな…。

描画速度に関しては F505が一人で足を引っ張ってるのだな。

スクラッチパッドからの読み込み速度も気になる。自分が動作チェックに使ってるN506iSに比べて、D505iは、約5倍の時間がかかるのか。…「Now loading」の表示を逐一しておいたほうがいいんだろうか。

_DoJa-3.0 各機種オプションAPI・拡張API実装状況 PDF :

D505iの非サポートぶりが突出してる。spriteとか一つもサポートしてないし。特定機種が全体の足を引っ張る、みたいな…。

3DグラフィックスのオプションAPIドキュメントを眺めてたけど、sin()、cos()、atan() とかあるのだな。コレを使えれば自前で用意する必要はなかったのだろうか。でもコレ、全機種で使えるか判らない…。オプションAPIサポート状況pdfを眺めると、「高レベル3Dグラフィックス描画機能」は全機種サポートされてるっぽいけど。「低レベル3Dグラフィックス描画機能」はD505ixしかサポートしてない。「高レベル3Dグラフィックス描画機能」ってどれのことなんだろう。com.nttdocomo.opt.ui.j3d のことかな。それとも、com.nttdocomo.opt.ui.j3d2 のことだろうか。

_D505i用 3D iアプリ作成関連ツール :

_三菱電機の携帯電話(D505i/D504i)向け3Dポリゴン描画コア"Z3D"の詳細が明らかに

D504i/D505i関連のページには、j3d2 がどうとか書いてあるな。ということは、j3d のほうが全機種持ってる機能、ということになるのだろうか。

_505iシリーズで動くポリゴンゲームを作る :

この中で使ってるのは j3d っぽい。それなら全機種で使えるのか。

_iアプリゲームプログラミング 〜504i・FOMA対応〜 低レベル3Dグラフィックス :

なるほど、D50xi、つまり三菱製の機種だけ該当機能を持ってるのか。

_高レベル3Dグラフィックス マスコットカプセル メモ :

なるほど…。マスコットカプセルって何だろうと思ってたけど、3D関係の機能だったのね…。

#2 [game] _2D自動車シミュレーター

なんだか面白い。方向指示器とか出さなきゃいけないあたりとか。

ていうか。コレの3D版とかあったらいいんじゃないかという気もしたり。もちろん、事故発生イベントを用意しておいて。

_3D避けゲー アスタースペース :

flashでもこのぐらい動かすことができるのか…。

_iアプリ - ストップウォッチ :

_iアプリ - タイマー

DLさせてもらったり。N506iS で動きました。

コレ、計算結果を24コマ/秒単位で表示できたら、アニメーターさんが使えるんじゃないかという気もしたり。…もっともその手の業界内で、DoCoMoの携帯使う人は居ないのかもしれんけど。

#3 [prog][iappli] _内分点と画像の拡大・縮小

_線形補間法
_拡大縮小アルゴリズム(バイキュービックとLanczos)
_縮小アルゴリズム(1)
_縮小アルゴリズム(3)- 平均画素法
_縮小アルゴリズム(8)― Lanczos
_画像補間方式

メモ。

iアプリで、小さい画像を読み込んでBGキャッシュに拡大する処理を書いてたのだけど。Nearest Neighbor ではガクガクしてなんだか悲しいなと。ということで Bilinear を試してみたり。…遅い。1ドットずつ計算してるから仕方ないのだろうか。

あ。単に拡大縮小の結果が得たいだけなら、drawScaledImage() を使えばいいのか。なんてこった。

でもまあ、一応該当部分をメモしておこう…。あまり意味は無いけど…。
    Graphics lg = cacheImage[cn].getGraphics();

    switch (cn) {
        case 0 :
            // タイルパターン
            for (int y = 0; y < getHeight(); y += img[IMG_OPTIONBG].getHeight()) {
                for (int x = 0; x < getWidth(); x += img[IMG_OPTIONBG].getWidth()) {
                    lg.drawImage(img[IMG_OPTIONBG], x, y);
                }
            }
            break;
        case 1 :
            // 拡大・Nearest Neighbor
        {
            // 元画像
            int ign = IMG_BG_B;
            int w = img[ign].getWidth();
            int h = img[ign].getHeight();

            // 倍率
            int ratio = getWidth() / img[ign].getWidth();

            Image imgSrc = Image.createImage(img[ign].getWidth(), img[ign].getHeight());
            Graphics gSrc = imgSrc.getGraphics();
            gSrc.drawImage(img[ign], 0, 0);

            int dx = 0;
            int dy = 0;
            for (int y = 0; y < h; y++) {
                for (int x = 0; x < w; x++) {
                    int pixel = gSrc.getPixel(x, y);
                    lg.setColor(pixel);
                    lg.fillRect(dx, dy, ratio, ratio);
                    dx += ratio;
                }
                dy += ratio;
                dx = 0;
            }
            gSrc = null;
            imgSrc.dispose();
            imgSrc = null;
        }
            break;
        case 2 :
            // 拡大・Bilinear
        {
            // 元画像
            int ign = IMG_BG_B;

            // src Image 縦横幅取得
            int w = img[ign].getWidth();
            int h = img[ign].getHeight();

            // dst Image 縦横幅取得
            int dstW = cacheImage[cn].getWidth();
            int dstH = cacheImage[cn].getHeight();

            // src Image を、新規作成した Image に描画
            // こうしないと Graphics が取得できない = ピクセル値が読めない。
            // もっと良い手はないだろうか…
            Image imgSrc = Image.createImage(w, h);
            Graphics gSrc = imgSrc.getGraphics();
            gSrc.drawImage(img[ign], 0, 0);

            // 元画像分の r,g,b を入れるためのワークを確保
            int[] rgb = new int[w * h];
            int[] r = new int[w * h];
            int[] g = new int[w * h];
            int[] b = new int[w * h];

            // 元画像の RGB値(0x00RRGGBB) を配列に全取得
            gSrc.getRGBPixels(0, 0, w, h, rgb, 0);

            // r,g,b にばらす
            // int imax = rgb.length;
            for (int i = 0; i < rgb.length; i++) {
                int p = rgb[i];
                r[i] = (p >> 16) & 0x0ff;
                g[i] = (p >> 8) & 0x0ff;
                b[i] = p & 0x0ff;
            }

            // 固定小数点計算用
            final int FLV = 0x0100;

            // 元画像の読み込み座標を初期化
            int xs = 0;
            int ys = 0;

            // 元画像の読み込み座標の増分を設定
            int xs_add = w * FLV / dstW;
            int ys_add = h * FLV / dstH;

            // 書き込み用ワークを確保
            int[] dstrgb = new int[dstW * dstH];
            int dstidx = 0;

            // 書き込み先の、縦・横dot数分のループ

            for (int y = 0; y < dstH; y++) {
                int y0 = ys >> 8;
                int n = ys & 0x0ff;
                int dn = FLV - n;
                
                int ib = w * y0;
                boolean yEndFg = false;
                if ( y0 + 1 - h >= 0) yEndFg = true;

                for (int x = 0; x < dstW; x++) {

                    // 読み込み座標の整数部を取得
                    int x0 = xs >> 8;

                    // 読み込み座標の小数部を取得
                    int m = xs & 0x0ff;
                    int dm = FLV - m;

                    // 配列インデックス値を取得
                    int i0 = ib + x0;
                    int i1 = i0 + 1;
                    int i2 = i0 + w;
                    int i3 = i2 + 1;

                    // 画面端の場合はおかしくなる。インデックス値を微調整
                    if (x0 + 1 - w >= 0) {
                        i1 = i0;
                        i3 = i2;
                    }
                    if (yEndFg) {
                        i2 = i0;
                        i3 = i1;
                    }

                    // 線形補間
                    int rr = (((r[i0] * dm + r[i1] * m) * dn) + ((r[i2] * dm + r[i3] * m) * n)) >> 16;
                    int gg = (((g[i0] * dm + g[i1] * m) * dn) + ((g[i2] * dm + g[i3] * m) * n)) >> 16;
                    int bb = (((b[i0] * dm + b[i1] * m) * dn) + ((b[i2] * dm + b[i3] * m) * n)) >> 16;

                    // 結果を保存
                    dstrgb[dstidx++] = ((rr << 16) | (gg << 8) | bb);

                    xs += xs_add;
                }

                xs = 0;
                ys += ys_add;
            }

            // 描画
            lg.setRGBPixels(0, 0, dstW, dstH, dstrgb, 0);

            dstrgb = null;
            b = null;
            g = null;
            r = null;
            rgb = null;

            gSrc = null;
            imgSrc.dispose();
            imgSrc = null;
        }
            break;
        default :
            break;
    }
とにかく遅い。もっと速く処理できるように書けないだろうか。…速くしたからといって何がどうなるわけでもないけれど。

以上、1 日分です。

過去ログ表示

Prev - 2006/12 - Next
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project