空のノート - note of void.


Menu

Navi
Auther
Webclap
Search
Categories
Archives
Recent
Comments
Trackbacks
Advertise
RSS1.0 XML


Entries


2009-12-12

staticオブジェクトのデストラクタで他のstaticオブジェクトを使ってはいけない

個人的には盲点な問題で、当たり前と言えば当たり前ですが気付くのに少し時間が掛かりました。 Effective本にも書いてありませんでしたし、ネットでもあまり見かけない話題です。

以下のようなstaticオブジェクトa、および関数ローカルのstaticオブジェクトbがあるとします。

A a;

B &get_b() {
    static B b;
    return b;
}

オブジェクトaはstatic初期化タイミングで初期化され、オブジェクトbはget_b関数が呼び出された時点で初期化されます。 ここまでは問題ありません。 関数ローカルstaticオブジェクトの遅延初期化は、staticオブジェクトが他のstaticオブジェクトに依存するために使われる事はよくあります。

しかし、オブジェクトaが構築完了した後の任意のタイミングでget_bを呼び出しオブジェクトbを構築し、かつクラスAのデストラクタが関数get_bを呼び出している場合、未定義の動作になります。 構築される順番はa→bなので破棄される順番はb→aであり、aの破棄時には既にbは解体済みだからです。

回避する方法としては、クラスAのコンストラクタでget_bを呼び出しておくのが簡単でしょうか。 そうすればbの寿命がaの破棄後まで延長されるので不正なアクセスをせずに済む事になります。 しかしながら、こういう対策をするように*気をつけなければ*いけないことが増えるのは事実なので、望ましくは対策不要であるように設計しておくのが最上でしょう。


2009-10-18

Tugumi アニメ処理の作成が難航中

真に申し訳ない話ですが、戦闘アニメ処理の作成でまたしても遅れております。 と言うのもアニメやメッセージ定義のシチュエーションの解析や検索順が複雑過ぎて再体系化に時間が掛かっているからでありまして。 シチュエーションの指定構文の問題で、指定の仕方によって意味が曖昧になる場合が出てくるのも頭の痛いところです。

汎用
ビームライフル(ガンダム), ビームライフル  // 1. 武器名(ユニット名称)
ビームライフル(高出力), ビームライフル    // 2. 括弧付き武器名

例に挙げると上記のような場合です。 コメントが示すように意図する所が違っても、指定の形が同じようになることもある点が問題です。 書式が含む曖昧さのため、1の指定は「ビームライフル(ガンダム)」という武器を使用した時にも再生されますし、2の指定は「高出力」という名前のユニットが「ビームライフル」という武器を使用しても再生されます。 この指定を書いたときにはそういう意図は無かったでしょうが、その意図を書式に反映する事が出来ない以上、これを解釈する本体側でどちらかに決め付けて解析する訳にも行かず、「曖昧である」という判断を残したまま(アルゴリズムに組み込んだまま)扱わなければなりません。

書式の時点で区別出来るように武器名の非表示括弧を別の文字にしたり(ビームライフル{高出力})、限定条件の形式を明確にしたり(ビームライフル(@ガンダム))出来れば良かったのですが、いずれの指定も既に頻繁に使われているため、互換性を考えると仕様を変更する訳にも行きません。 結局は解釈側で何とかするしかない訳です。


2009-10-03

Tugumi 拡張マップデータ

マップデータの拡張案です。 従来のmapに対する前方互換(SRCで読み込むことが出来る)があります。 任意サイズ、任意数の画像をマップ上に重ね貼り可能です。 何か意見などあればどうぞ。

ファイルデータの構造

  • 拡張データの直前までは従来のマップデータと同じ。 SRCで正しいデータとして読み込まれる。 その場合拡張部分で指定した画像は表示されない。
  • 画像ファイル名は追加画像ファイル指定で使うマップ画像。 画像の大きさに制限はない。 画像種類はbmp, png, gif, jpgのいずれかを使用可能。
  • 最後に追加画像ファイルの配置。 指定インデックスの画像をピクセル座標(X,Y)に配置するように指定。 座標や画像サイズの関係で描画画像が重なり合う場合、後に指定した画像で上書きされる。 画像のアルファ値やカラーキーは有効。 白色部分も透過される。
  • SRCで読み込む場合は、拡張部分のデータは無視される。
  • "Sprite"の直前行にMELTで出力される上層レイヤデータを配置可能。 (MELTの出力するマップデータと互換)
  • 拡張データ部分は記述された順に奥から描画される。従来のマップチップ指定は最も奥。
  • 拡張データでは各マスの地形を変更しない。データ部分で指定された地形がそのまま使われる。

データ形式

"MapData"
バージョン
マップの幅,マップの高さ
地形ID0,BitmapID0
地形ID1,BitmapID1
...
"Sprite"
画像ファイル名0;画像ファイル名1;...
X座標,Y座標,画像index
...

2009-09-19

Tugumi 少々遅れます

別記事の通り、PCを新しく買い換えました。 その環境を整えるのにやや時間が掛かったので、申し訳ありませんがTugumiの次リリースはしばらく遅れます。 少々お待ち下さい。 次のバージョンでは戦闘アニメを実行できるようにする予定です。

PC買い替え

少し前からメインで使用しているPCがついに壊れました。 起動してしばらく使っていると何もしなくてもハングアップして電源も切れなくなってしまうため、これはもう寿命的に駄目かという事になったので、新しいPCを購入する事に。

新しいと言っても予算が無いので今回は中古品で手を打ちます。 最近の中古PCはOS付で1万円以下がごろごろしているというすごい状況。 CPU性能は最低レベル付近でも今まで使っていた物を上回るのでそれほど気にする必要もありませんでした。 ただ用途の都合故メモリはとにかく多いほうが良いため余っているメモリも使いたかったのですが、中古品の多くはスリムタワーのため最大メモリ容量が1-2GB(2スロット)を超える物が少なく、その辺条件に合う物を探すのに少し難儀しました。

最終的に落ち着いたスペックは以下のような物です。

CPUCeleron D 2.6GHz
MemoryDDR-SDRAM 1.76GB (1GBx1, 256MBx3)
HDDC:40GB, E:250GB
GraphicsOnboard
OSWindows XP Home Edition

締めて6300円。 これだけの性能のマシンがこれほど安く済むとは良い時代になったものです。