正直日記



2006/08/31

_ バレない処理落ち
60が30になったら普通にバレるけど、60が一瞬だけ59になるのを体感出来る
人はあまりいないわな。しかし点滅している物体があると話は別で、視覚的
にバレバレなのである。なので、点滅は表示系の方でやってしまうのはどう
かと思った次第。

しかしWinX68000の55FPS表示で点滅が気にならないのはどういうことなのか
どういうカラクリなのか俺にはわからんのだよ。

SaTa. >
こんな風になっているのではないかと妄想

123456789012345678901234567890123456789012345678901234567890
(1)101010101010101010101010101010101010101010101010101010101010 60fps
(2)101110101010101010101010101010101010101010101010101010101010 一瞬59fps(4フレーム目が切れた)
(3)101101010101010101010101010101010101010101010101010101010101 一瞬59fps改良版
(4)101010101010010101010101101010101010010101010101101010101010 55fps→60fps変換

0=消灯
1=点灯
(1)普通の60fpsの点滅。

(2)点滅を垂直同期のフレームカウントの奇数(1)・偶数(0)で設定。
処理落ちが発生してもそのまま。
処理落ちしたフレームは前のフレームと同じ状態。
点灯もしくは消灯時間が3フレーム(=0.05秒)あるから目立つとか。
リズムが大きく狂うので違和感がある。

(3)スキップされたフレームに対して点滅を反転させて続行している。
垂直同期とは別の処理用フレームカウントを使用している。

(4)フレームが均等にスキップされているため気付きにくい。
たとえばアニメが24fpsと30fpsで違和感を持つだろうか。
リズムが一定であれば気付きにくいと思う。
 (2006/09/01 09:51:32)
>
均等に振り分けるのがコツなのかな。

WinX68000だと点滅は気にならないですが、スクロールのガタつきは
かなり気になる感じ。スクロールの方に目が行くから点滅はあまり
気にならないのかも。
 (2006/09/04 00:24:37)
>
http://www.liarsoft.org/data/TD_55fps.avi
試しに手製のソフトを、10フレームに一度動作停止することで55fpsになるように改造してみた。
あれースクロールもそんなに気にならないなあ。
 (2006/09/04 02:57:42)
SaTa. >
エミュの場合、
実機が60fpsでエミュで同じ60fpsでも
表示期間に描画タイミングがずれたら
がたつきますよね。
たぶんそれが見えたのではないでしょうか。
似たようなのに表示期間にスクロールレジスタを操作するとか。
 (2006/09/06 08:53:35)
>
ああ、タイミングがズレてるのはあるかもしれないですね。
けろぴーと高速版でもなんか挙動が違うような。(けろぴーだと
あまりガクガクしないように見える。高速版はblit+flipでもガクガク)

感覚的な話で終わらせずに、本当は録画して検証するべきなんでしょうけど。
 (2006/09/07 18:51:20)
bmwqsh > 96  (2009/02/20 05:33:06)

2006/08/28

_ 弱り目に祟り目
下腹部がキリキリ痛みだし、また(食事中の人がふいに見るといけないので
バッサリカット)などの症状が現れ、こりゃマズイと、慌てて調べてみたら
十二指腸潰瘍のようだ。

胃・十二指腸潰瘍 - goo ヘルスケア
ピロリ菌以外の成因として重要なのは、薬剤、とくに非ステロイド性消炎鎮痛薬 (NSAIDs、エヌセッド)です。
風邪を引いてから三日ほど、ブルフェンを限界ギリギリまで投入してきたの で、思い当たる節がありすぎる。一難去ってまた一難だ。身体がやべえ状態 だってのに、オラなんだかすっげえワクワクしてきたぞ!(来週に続け)

> 医者行きましょうよ・・・  (2006/08/28 05:24:20)
> 嘘をついて気を引こう必死なんだぜ!  (2006/08/28 14:51:54)
> 俺はもうだまされないぞ!とりあえず(カレーを食べてる人がいるといけないので中略)の症状は無くなったので医者はいいみたいです(´ー`)つか本当に潰瘍だったのかも怪しくなってきた。  (2006/08/30 00:50:52)

2006/08/27

_ 逆に考えるんだ
実世界で振動しているものを、仮想世界(シューティング)に取り入れるんだ。
お爺ちゃんとか。
_ パチンコビッグ
いやなんでもない

2006/08/26

_ 縦画面対応のPCシューがもっと増えればいいと思う
Dragon SHMUPS CompoのDragon Dancerが、ゲーム部分はつまらないんだけど
縦画面をサポートしていたり、BGMはFM音源をサンプリングしたMODだったり、
起動時にRAM/ROMチェックが入ったり、と凄く間違った方向に力が入っている
ので素晴らしくダメだと思った。いいぞもっとやれ。

 
 

デバイス初期化 → RAM/ROMチェック → コピーライト表示 → クロスハッチ
→ タイトルの流れ
_ 発つ鳥あとを濁さず
薬を飲み丸一日寝ていたにもかかわらず熱が40度から一向に引かず、一瞬、
死を予感したよ。しかしそこで、HDDを整理しなきゃ……と思い至った俺は
本当にダメすぎる。今は38度9分まで下がりました。

2006/08/20

_ Tiny C Compiler
http://fabrice.bellard.free.fr/tcc/

ARMv4に対応してるんだそうだ。configure中のbuild_cross="no"を"yes"に
書き換えればarm-tccがビルド出来るので、あとは適当に使うだけ。コンパ
イルめっちゃ速い。コードはそれなり。

リンカとかが無いっつーか(あるみたいだけど、なんか、よー分からん)
なのでリンカはarm-elf-gcc使わなくちゃいけないみたい。んで、crt0.Sや
ldscriptも無いので、結局devkitARMが必要っぽいですよ。

2006/08/16

_ __builtin_expect
粉骨砕身の覚悟でがんばります - __builtin_expect について

中身がループ脱出だけじゃあまり効果が出ないのではないかしら。あとは、
THUMBだから効果が薄いとか……ARMだと、条件フィールドをガシガシ使って
くれるようになる(といいなあ。ジャンプ以外に使っている所をあまり見た
ことが無いのだけど)。

試しに自分の使っているミキサーの、最も内側の部分に適用してみました。
ミキシング中に音声サンプルの再生箇所が終端まで来たら、指定のループポ
イントまで戻すという処理を行っています。

  samp = (snd_dat[pos] * vol);
  do {
    *mxr++ += samp;
    cnt += step;
    if (cnt > TICK_COUNT) {
      pos += cnt / TICK_COUNT;
      cnt &= (TICK_COUNT - 1);
#if BUILTIN_EXPECT
      if (__builtin_expect(pos > size, 0)) {
#else
      if (pos > size) {
#endif
        do {
          pos -= size;
          pos += loop;
        } while (pos > size);
      }
      samp = (snd_dat[pos] * vol);
    }
  } while (--length);
  return;
こんなソースがあって、gcc -marm -Sで吐かせると……
non-expectexpect
 1: .L2:
 2:   ldrb  r3, [r0], #1
 3:   add  r6, r6, r4
 4:   add  r3, r3, r2
 5:   cmp  r6, #65536
 6:   strb  r3, [r0, #-1]
 7:   bls  .L4
 8:   add  sl, sl, r6, lsr #16
 9:   mov  r2, r6, asl #16
10:   cmp  sl, ip
11:   mov  r6, r2, lsr #16
12:   bls  .L6
13: .L16:
14:   rsb  r3, ip, sl
15:   add  sl, r3, lr
16:   cmp  sl, ip
17:   bhi  .L16
18: .L6:
19:   ldrsb  r3, [sl, r9]
20:   mul  r2, r8, r3
21:   and  r2, r2, #255
22: .L4:
23:   subs  r1, r1, #1
24:   bne  .L2
25:   add  sp, sp, #4
26:   ldmfd  sp!, {r4-r9, sl, pc}
 1: .L2:
 2:   ldrb  r3, [r0], #1
 3:   add  r6, r6, r4
 4:   add  r3, r3, r2
 5:   cmp  r6, #65536
 6:   strb  r3, [r0, #-1]
 7:   bls  .L4
 8:   add  sl, sl, r6, lsr #16
 9:   mov  r2, r6, asl #16
10:   cmp  sl, ip
11:   mov  r6, r2, lsr #16
12:   bhi  .L10
13: .L6:
14:   ldrsb  r3, [sl, r9]
15:   mul  r2, r8, r3
16:   and  r2, r2, #255
17: .L4:
18:   subs  r1, r1, #1
19:   bne  .L2
20:   add  sp, sp, #4
21:   ldmfd  sp!, {r4-r9, sl, pc}
22: .L10:
23:   rsb  r3, ip, sl
24:   add  sl, r3, lr
25:   cmp  sl, ip
26:   bls  .L6
27:   rsb  r3, ip, sl
28:   add  sl, r3, lr
29:   cmp  sl, ip
30:   bhi  .L10
31:   b  .L6
確率の低い方を下の方に持ってきてくれています。あと確率に従って何気に ループ展開してる気がする。8和音合成@20KHzだと non-expect版のCPU負荷 が20.9%なのに対してexpect版が19.6%と、ちょっと大分かなり少し速くなる みたい。 で、例によって条件フィールドはあまり使ってくれてないわけですが、一つ 思ったのは、thumbだと条件分岐は相対で256バイト内までしか飛べないので、 ややこしい処理が長くなるとどうしても無条件分岐が必要になり、旨みが無 くなるんじゃないかしら。 それにしても、これは多分、物凄く素直に効いた例だろうなあ。自分のヘボ さを再確認したかもしれん。

tekezo >
コメントありがとうございます。

当初の目論見では「__builtin_expect を使っても使わなくても
あんまりかわらないけど、まあ適切に使っておいたほうが
ちょっぴり速いですね」くらいだろうなぁと思っていたのですが、
実際には広域的な最適化が解除されて
ガクッと速度が低下する結果になったのがセツナイところです。
確かに局所的には最適なコードを吐いてくれているんですけれども
なんで、局所的な最適化で止めておいてくれないのかと。

使い方に気をつければ便利な機能だとは思うのですが、
一度非道い目にあうと、使うことを躊躇してしまいますねぇ……。
 (2006/08/17 01:06:12)
> むしろ残りの条件分岐全てを likely 指定することで難読化してしまうソリューション(目的を見失ってます)。  (2006/08/17 03:17:55)

2006/08/15

_ 4x4 フォント
更新履歴兼雑記 - 5x5フォント

別に対抗心を燃やすわけじゃないですが(めっちゃ燃えてるやん)、以前**DSP
を作る際に用意した4x4フォントを置いておきます。

 

4x4.zip (ttf/bdf/fontx2/bmp同梱)
秀丸で使うとXGAで110行表示できます!
つーか読めません。ライセンスは OCPL00000 で。


追記:Note - 2x4フォント
SubPixelで更に半分になった!これは凄い。

ふと、画素子の配列が横並びじゃなかったら、2x4以上に小さいフォントが
可能になるんだろうなとか妄想してみる。

2006/08/11

_ いや
別に東方クローンでもいいんだ。ウザったい会話シーンも、撃破後に破片と
硝煙をガッツリ出してさえくれれば、許容しよう。それでいい。いや、それ
がいい。
_ 横スクロールしようぜ
統計を取ったわけではないけど、同人・フリーのPC縦シューは横スクロール
をしないものが圧倒的に多く俺はそれが非常に残念だと思う。

横スクロールしない縦シューは窮屈だ。まあ、カメラワークでそれを克服し
ているものもある、けど。バガンとか斑鳩とか。逆に横画面の縦シューで横
スクロールすると、無駄に広すぎて困ってしまったりもする……蒼穹紅蓮隊
とか蒼穹紅蓮隊とか。

しかし横スクロールは空間の広がりを感じさせる他に、鬱陶しい敵を画面外
に追い出して弾封じといった戦略性を否応無しに作ってしまったりする効果
があるので、そこらへんの調整が厄介だなあと思ったり、思わなかったり、
思わせぶりだったり、えーと、なんだ、オチを考えるのが面倒になったので
この話は終わりだ。

とにかく、同人縦シューを作ってる人は一度でいいから横スクロールの有無
を検討してくれ!単なる東方クローンから脱却するチャンスだよ!つーか東方クローンばっかじゃ飽きるでしょ!かといってTOAやSEIBUク

それはさておき、超連射68K@GBA(物凄い矛盾オーラを感じる)の横
スクロール方式を検討する。ポイントとしては弾封じの有無とか、スクロー
ル基準を自機と背景のどちらにするかとか、あるいは(中略)などがあり、
まあなんだ、検討するとかいいつつ、オプションで選べるように両方実装し
てたりするんだけどな。今日は暑いなア。

2006/08/07

_ おもちゃをテルミンに

Sound FX Keychains

誰でも一度は触れたことがあると思う、ボタンを押すとマシンガンや手榴弾
を投擲したような効果音が鳴るおもちゃ。それを改造して(受光素子をハン
ダ付けするだけ?)光で音程を変化させるテルミンもどきを作れるらしい。


Echo Keyller opto-Theremin mod
(リンク先で改造後の音が聴ける)

俺もこの手のおもちゃは持っているけど、あるがままにしか使っていなかっ
たので、目から鱗が落ちる思いだ。
_ 卑怯者の部屋
浴室にいる蚊は頭がいいと思う。たぶん顕微鏡で見たら前頭葉が発達してる
に違いない。小さい頃、爺さんにねだって買ってもらった顕微鏡は二・三回
使っただけで押入れの肥やしになってしまった。ねだられた爺さんは、子供
のうちから生物に関心を抱くとは感心だと、そう思って買ってくれたに違い
ない。ごめんなさい。20年経って孫は立派なゲーム脳に育ちました。いや、
そんなことはどうでもいい。奴らは人間が最も無防備な状態になる場所に、
こうして存在しているのだ。気配を悟られぬよう背後から忍び寄り、ズブリ
と一刺し、生娘の生き血をすするというのだ。そんな奴らに対し我々人類が
出来ることはただ浴槽や風呂桶に10円玉を沈めることのみである。孵化した
後じゃ意味が無いじゃないかとか言ってはいけない。飲めば貧血に効くよ。

2006/08/01

_ ああ、いや
別にCのタスクシステムでもリストを複数用意すればいいだけの話であって、
STLがヤバいっつー話とは繋がらんよ。ヤバすぎて脳がスパークしてた。

std::vector<std::list<CActor*>> ActorContainer;
でリスト配列があっという間に作れてしまう事実に強い衝撃を受けた…ただ
それだけの話ですよ。ザンギュラあたまに文明が開花したのよ。
_ STLコンテナがヤバすぎる
優先順位つきスプライト管理クラスとかID付きキャラクタ管理クラスとか、
ハッシュ管理コリジョンクラスとかが一瞬で作れてしまうのね。
これはヤバいわ。富豪マンセーだわ。



プールからメモリを確保するようにすれば、GBA で使ってもいいかもなあ。
キャラクタも union で最大サイズを測ってプール作っちゃえば楽勝だな。

Cのタスクシステムなんか使ってる場合じゃないかもしれん。これはヤバい。
これまでは こんな感じのタスクシステム を使っていて、一本の線形リスト
にタスクを全てぶっこんで、優先度でキャラクタの種類を表し、当たり判定
なんかは例えば

TASKWORK *shot_task = TaskSearch(PRI_SHOT);
TASKWORK *enemy_task = TaskSearch(PRI_ENEMY);
TASKWORK *enemy_task_first = enemy_task;

// ショットループ
while (shot_task->priority == PRI_SHOT) {
  MYSHOT *swork = (MYSHOT*)&shot_task->work[0];
  if (swork->status == ALIVE) {
    // 敵ループ
    while (enemy_task->priority == PRI_ENEMY) {
      ENEMY *ework = (ENEMY*)&enemy_task->work[0];
      if (ework->status != DEAD) {
        if ( CheckHit( &swork, &ework ) )
        {
          // ショット死ぬ
          swork->status = DEAD;
          // 敵エネルギー減らす
          if (ework->status == ALIVE) ework->energy--;
          // 敵死ぬ
          if (ework->energy <= 0) ework->status = DEAD;
          // 敵ループ抜ける
          break;
        }
      }
      enemy_task = enemy_task->next;
    }
    enemy_task = enemy_task_first;
  }
  shot_task = shot_task->next;
}
こうやって書いてたんだけど、もうちょい簡単に、しかも安全に書けるよう になるわな。マズいなあヤバいなあ。
_ そうか、もう月末なんだな(・ω・)
ムフー(;´ω`)

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12