Archive for the ‘ 開発ログブログ ’ Category

XNAで使える最低のテクスチャサイズ

2D開発してる私には重要なことなのですが、時間がたつと忘れてしまう&検索してもなかなか引っかからないのでメモしておきます。

PC: 2048×2048[px]
XBOX 360: 8192×8192[px]

form 「MSDNフォーラム:Texture2Dに使用するXNB内抱のパフォーマンスについて

チップの登録機構

どうも、お久しぶりです。テストがあったり、私が所属してる情報工学科に革命がおこったりで色々ごたごたしてまして落ちつて作業できる時間が少なくて、更新できてなかったです。どんな革命が起きたかはここで語ることじゃないので、控えておきますが。

さてタイトルのことですがこれはかなり悩みに悩みました。
この前書いたとおりこのプロジェクトはプラグインに対応させるつもりです。ですのでできるだけ外から追加できる拡張性をもったコードを書かなければならず、 しかもこのチップの部分はこのプログラムの中核の部分なので手は抜きたくありませんでした。

デザインパターンをあたってみて、「あ、これ使えるじゃん!!ふむふむ、え~っとこうやって、これがこうで… で、肝心なここは……使えねぇ!!!!!」的なことの連発でした。

どうにかならないか困り果ててとつぶやいたら@haxeさんから回答がいただけました。

kassyi
@kassyi
@haxe
クラスを条件によって作り分けたいんです。例え話にすると調査員という仕事があり、Aは0歳から9歳までの朝食の食べる量を調査する、Bは14~50歳までの歩数を調査する。AとBが調査員というクラスを継承しているとすると、どうすればインスタンスを作り分けられるかって話です。
link
kassyi @kassyi @haxe 普通に考えれば
if(age >= 0 && age <= 9)
retrun new A();
else if(age >=14 && age<= 50)
retrun new B();
となると思うのですが、これだとプラグインなどで調査員を追加するのが難しくて。。
link
kassyi @haxe @kassyi 今WebRequestクラス見てるので、お勧めするのはその方法かなぁ。 http://msdn.microsoft.com/ja-jp/library/system.net.webrequest.aspx link
haxe @haxe @kassyi ちなみに標準機能はどこかで初期化するとして、利用者が派生クラスを追加する際に、app.configから登録できるようにしておくとさらに吉。 http://msdn.microsoft.com/ja-jp/library/42z9z1b9.aspx link

このやり取りのおかげ様でやっとこさ整合性のとれたコードを書くことができました。書いたコードをざっとまとめるとこんな感じです。

すべてのチップはこのCihpクラスを継承して表現されます。また継承されたクラスのコンストラクタはprotectedにして直接はインスタンスが作れないようにします。で、どこからインスタンスが作れるかというとChipクラスのCreate()です。そのCreate()の中で何をやってるかというと、登録された派生クラスのクリエイター対して「このIDのチップ扱える?」って順繰りに訪ねて行って扱えるなら「インスタンスを頂戴ね」ということでクリエイターにインスタンスを作らしています。

…ってなことで、なんとかえっちらおっちら拡張性のあるチップ登録機構を作ることができました。いやーまさかWebRequestクラスをまねできるとは思いませんでした…。.Netライブラリは当然プログラマーのプロの人が書いているので吸収できるところは吸収するようにしようと思いました。@haxeさんに、感謝。

XSSって怖ぇ~~

とあるサイトでXSSができてしまうことを偶然発見しました。

ところが普段私が使ってるChromeだとブロックしてくれるらしく、スクリプトの実行まではされませんでした。そこで他のブラウザではどうなってるのだろうと思って調べてみました。

調査結果

ブラウザ ぜい弱性の種類 調査結果
Chrome 4.0.249.78 URL OK
From OK
IE8 URL OK
From NG
FF3.6 URL NG
From NG
Safari URL NG
From NG

…Chorme最高!どっちの場合もちゃんとブロックしてくれました。FormのほうはURLの場合に比べて遭遇する可能性は少ないと思いますけど、たとえばFormに値を自動入力して、自動でポストしちゃうスクリプトをブックマーレットとして作ってTwitterのおかげで大活躍なURL短縮サービスかなんかで一見わからないようにしておけばURLと変わらなくなります。

まぁそもそもこういうぜい弱性を作っちゃう開発者が悪いのですが、安全なことにこしたことはありません。

ってことで、Chromeお勧めだよ!!爆速だよ!便利だよ!軽いよ!!(笑)

今後の方針。

一応進んではいるのですが亀のようなスピードです。。
今後の方針が見えなくなるといけないのでメモ代わりに更新します。

  • DLLプラグインによる機能拡張
    • メニューの追加
    • 画像フォーマット丸ごとの取り換え
      • 特殊な動作(境界線自動生成とか)をするチップを後から追加可能に
      • パレッドも何とかしてDLLに描画を任せたり、描画する順番を指定できるようにする。
    • DLL化することを考えて、BaseChipを組み上げる
  • 常にC#の特性を生かしたコードを書くように努力する(オブジェクト指向)
  • 単体でアニメするチップの追加
    • 某ツールではイベントとして表現するがイベントだと不要な更新処理も入るため重くなる。それが回避できるようになる。

DLLプラグインを導入しようと思ったのは大人の事情ってやつです。(まだ私は未成年ですが(笑)
今のまま公開すると某所から苦情がきてもおかしくないので… 。公開するものは後ろめたいものを完全に消した物にします。

境界線自動生成チップを標準搭載しなくなるので、機能としてはそこらへんに転がってるものと変わりなくなりますが

  1. .Netで書かれてる
  2. オープンソース
  3. ライセンスが緩め
  4. 機能拡張が半端なく強力

というものは少ないと思うので妥協することにしました。

と言いつつも、かなりハードルが高い気が(汗;
いままでDLLの動的ロードなんてやったことないし、プラグインが使えるようなアプリを作ったこともない。。
でもUndo、Redoと同じようにググってみたらサンプルがあるのでなんとかなりそうです。

まぁ何事もやってみなきゃ分からないので今日も前に進むことにします。

これはカオスすぎる…!

前回作の依存関係

これが電話線だったら、絶対転ぶ!!

VS2010Bata2を導入してみたので、最上級エディションにしか載ってないと思われる「アーキテクチャ->依存関係グラフの作成」をやってみました。対象はオールリライトする前のプロジェクトです!

…。ぽかーん… これはひどい!作った自分が言うのもなんだけど、依存しすぎだろこれは。

今書いているプロジェクトはこんなことにならないように心がけつつ作っていくことにします。

続きを読む