[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2239] Re: Mandelbrot



  こんばんは、川合です。


MITSUNARI shigeo さんは 2001/09/30 19:56:51 の「[OSASK 2237] Re:
Mandelbrot」で書きました:

>返事が送れて申し訳ありません。風邪(嘔吐+下痢)でくだばってました。

  え?送れて申し訳ない???・・・って、これは「遅れて」のタイプ
ミスですか。すみません、ちょっとびっくりしただけです。

  お体を大切になさってください。ご無理はなさらないでください。お
早い回復をお祈りいたします。

>>拡大画面でやると、少しずれているような気がします。・
>>・・って僕の思い違いのせいかもしれません(笑)。
>はい。ずれてます。私も気にしてましたが仕様にしてました(^^;
>けど今回直しました。

  おお、仕様だったんですか(笑)。しかも、直ったんですか。それは
ありがたいです(笑)。

>>  タイミングによっては、起動直後に一部しか表示されない状態が続くので
>>動作がおかしいのかなと疑いました。
>この現象に遭遇したことはないのでよく分かりません。

  僕もこれは分かりません。小柳さんの文の調子からすると、おかしい
のかと疑っただけで、結局は正常だったように読み取れますが・・・。
どうなんでしょう?                                  >小柳さん

>今のコードは毎回全画面を更新しているからだと思います。

  ご存知なのかどうかは分かりませんが、128〜134行目を以下と入れ替
えて、

void putCur(int cx, int cy, struct LIB_GRAPHBOX *gbox)
{
    cx += WX / 2;
    cy += WY / 2;

    /* 0x0F は下位4bit(16色)のみ反転 */
    lib_drawline0(0x00c0 /* xor */, gbox, 0x0f, 0, cy, WX - 1, cy);
    lib_drawline0(0x00c0 /* xor */, gbox, 0x0f, cx, 0, cx, WY - 1);
    return;
}

さらに、233行を

    putCur( cx, cy, sys->graphbox);

と変更し、268〜277行目を以下と差し替えれば、

            if( touch == 2 ){ /* マンデルブロー再描画 */
                x0 += cx / ( prev_zoom * WX/2 );
                y0 += cy / ( prev_zoom * WY/2 );
                putMandel( x0, y0, zoom, buf );
                cx = cy = pcx = pcy = 0; /* 中央にカーソルを持ってくる */
                putCur( pcx, pcy, sys->graphbox);
                SYS_graphFlush( &sys );
            } else {
                putCur( pcx, pcy, sys->graphbox); /* 前回のカーソルを消す */
                putCur( cx, cy, sys->graphbox); /* 新しい位置のカーソル */
            }

カーソル移動の際のフラッシュがなくなるので、多分高速になります。
先ほど公開したloadfac0でカーソル移動の際の負荷を測定すれば、速く
なったかどうかが測定できるはずです。

>互換機でもzを押しっぱなしにするとキーを離しても動作しつづけるので
>おそらくカーソルキーの移動でも動きつづけるのはTOWNS(のVRAM)が遅いからかと。
>本当はキーを離したときすぐにキーバッファをフラッシュすればよいと思いますが、
>今はそれを調べる気力がないです。

  キーバッファという概念は特になく、あるのはシグナルボックスだけ
です。シグナルボックスはフラッシュできませんが、空読みすることは
できます。

    while (getsignal());

mandelの場合、キー以外のシグナルを扱っていないので、これで目的を
達することができるでしょう。

  また違う解決方法もあります。たとえば、zのリピートを拾わないよ
うに設定することです。これは、

static int keyTable[] = {
    KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_Z, KEY_X, KEY_Q
};

の部分を変更するだけでできます。KEY_Zの部分を

    KEY_Z | 0x00701000

に書き換えるだけです。なお、この変更をすると、大文字でも小文字で
も入力できるようになってしまいますが、きっとこっちのほうがお気に
召すでしょう。この謎の16進数の意味については、introcのkeytstc0.c
を参照してください。

>#あ、そういやP4マシンでもOSASKが動くことを確認しました。まあ当たり前ですけど。

  ご報告ありがとうございます。

---

  mandelもこれで"q"を押しても落ちなくなりましたし、バイナリーサ
イズに申し分ないですし、川合秀実推奨を付けてもよさそうな雰囲気に
なってきました。

  難を挙げるとすればカーソル移動が遅いので、Shiftを押しながら押
した時は16ドットくらいずつ動くようにしてもらえると便利ではないか
と思います(もっといいのはマウスが使えるようになることなんですが
、それはOSASK側にまだマウス機能がないので・・・すみません(笑)
)。

  十分に体力が回復なさった時に、ご配慮していただけるとうれしいで
す。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/