2012年4月30日月曜日

その5 高速フォント表示


その5 高速フォント表示

ホーム < ゲームつくろー! < DirectX技術編 < 高速フォント表示


その5 高速フォント表示

この章のサンプルプログラムはこちら


 Direct3Dはフォントの扱いが苦手です。一応画面に簡単に文字を出すためのID3DXFontインターフェイスがありますが、背後でWindows APIを用いてフォント形状を取得しているので、描画が異常なほど遅いのです。あまりに遅くて、特にノベルス系のように画面にフォント文字が沢山出て来るゲームではまともに使えません。

 ID3DXFontを介して描画するのがなぜ遅いのか?それは、1フレームごとにフォントを一から作成して描画しているためです。フォントの情報を得て、それを点の情報に変換して画面に打つ。これでは、どれだけ頑張ったって速度は出ません。ところで、DirectXは「絵」の描画については異常な程高速です(それがDirectX最大の売りですよね)。ということは、フォントを毎回「打つ」のではなく、フォントの絵を「描画」すれば、高速なフォント描画があっさりと実現できるわけです。

2012年4月28日土曜日

2008年05月 | プログラマ2.0日報 | あすなろBLOG


2008.05.29

今まで何回も取り上げてきた「マイクロフォーマット」ネタですが、Allsopp本の翻訳が

マイクロフォーマット Webページをより便利にする最新マークアップテクニック

というタイトル(仮題)で毎日コミュニケーションズから出版されるようです。情報元は「Web標準Blog」で、監修の木達一仁氏が関わっている会社です。

ちなみにセミナーも Allsopp 氏来日に合わせてあるようですが、これは満員御礼だそうです....

やはり関心ある人多いでしょうね...本は「買うべし」です(ただしエントリ時点で毎日コミュニケーションズの近刊予告には入っていないようです)

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.05.29 12:33

2008.05.28

前回のエントリ...に限らず、私って平気で「コーラー側」という言い方をしてたのですが、"コーラー側" でググると、あまりコレ引っかからないのですね....

要するに

コーラー(caller) =(関数・メソッドの)呼び出し側
コーリー(callee) =(関数・メソッドの)呼ばれた側

のことを言います。あれぇ、私はプログラマの日常口語だと思ってたのですが、知らない人が多いみたいなのですね(まあ、「コーラー側」と使うと、「馬から落馬」みたいな冗語っぽいニュアンスがないではないですが)。

とはいえ、caller/callee は(明確な)技術用語で使われている箇所っていうのはあります。皆さんおなじみの JavaScript ですけども(まあ、他のスクリプト言語でも同様な実装があるのでは?)、関数の中で「隠し持っている(実際には関数呼び出し時にセットされる)」arguments というオブジェクトがあります。これは「その関数の呼び出し環境(スタックフレームみたいに考えて良さそうです)」を示し、名前の通り「その関数に渡された引数」を配列として持つのが本来の役割です。しかし、この arguments オブジェクトには、caller と callee という2つの重要なプロパティがあります。

JavaScript の arguments オブジェクトの

callee プロパティ: 現在実行中の関数オブジェクトを示します。
caller プロパティ: この関数を今呼んでいる「呼び元の関数の arguments オブジェクト」を示します。

というように、このargumentsはうまく使うとかなり面白いことができます。arguments オブジェクトはJavaScript 関数の汎用カリー化関数とかで「任意数の引数を再適用する」ところで使ってたおぼえもあります...たとえばですね、JavaScript では「無名の関数」を function() {} などで作ることができますが、この「無名の関数」内で、再帰呼び出しをしたい場合

.....あれ、名前がないから再帰で呼べない...

となりますけども、実はこれ、callee プロパティを呼べばいいのです。

function show(n,m) {
  alert( function(x) {
    if( x > m )  return x * arguments.callee(x-1);
    return 1;
  }(n) );
}

n!/m! を再帰的に計算するルーチンならば、こんなところでしょうか。show() の内部で再帰計算をする無名関数を作って、それを引数 n で起動した結果を alert() しています。m の束縛はいわゆるクロージャです。あるいは、caller を使うと、スタックトレースが取れます.....しかし、この caller は JavaScript 1.5 では deprecated の扱いのようですが(がまだIE/FireFox共に動きますね!よかった...) 

まあ、この caller/callee というプロパティは「スタックフレームへの参照」ですから、どんなスクリプト言語でも、「言語設計者が実装しようと思えば装備できる」プロパティです(逆に言うとかなり初期からこれを持つ発想のあった JavaScript の設計は評価すべきでしょう。参照方法はともかく、アイデアいいです)。同じようなプロパティが他の言語にもある可能性は高いですね....

そう考えてみたら、プログラマ用語として「コーラー・コーリー」を使う...というのはけして珍しいこと、とまでは言えないのでは?と思います。個人的には時代遅れになってなくって良かった(苦笑)....

 

 

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.05.28 12:12

2008.05.27

書き出した時点で、お昼休憩中です。皆さんお昼ご飯はいかがでしたか?お昼ご飯代はおいくらでしたか....という話では、残念ながらないです(ちなみに私は大概会社の近くの自宅に帰ってお昼ご飯です。今日は昨日の残りモノで、鳥ごぼうご飯と、アスパラのおひたし、大福豆、大根おろし+金山寺味噌というメニューでした)。

お昼ごはんはタダではいけません! というのは、有名なSFネタのジョークです。「ノーフリーランチ定理」と呼ばれる面白い定理があります。それは、

数学的にありうべき全ての問題の集合について、どの探索アルゴリズムも同じ平均性能を示す

と主張します。結構意外じゃないですか?

プログラマ、というと「このアルゴリズムは性能がいい/悪い」というのを肌で知ってる...というのが望ましいですけども、しかし、それは「日常に現れる一般的な問題」の場合に「性能がいい・悪い」という議論をしているだけなのです。プログラマだったら、「いいアルゴリズム」がデータによって「ウラをかかれ」た経験があるんでは..と思います。たとえば、速いアルゴリズムの代表であるクィックソートは、すでに整列したデータを与えた時に、O(n2 ) にまで性能が劣化します。勿論「ホントにいいアルゴリズム」の場合は「最頻のケース」と同様に、「最悪のケース」に対する備えを心がけるべきなのですが....

このノーフリーランチ定理を言い換えると、

あらゆる問題で性能の良い汎用最適化戦略は理論上不可能であり、ある戦略が他の戦略より性能がよいのは、現に解こうとしている特定の問題に対して特殊化(専門化)されている場合のみである

ということになります。「よくある場合に性能がいい」と「ウラをかかれると性能が悪い」とは同じことの両面に過ぎないことをこの定理は示すのです。汎用的であればあるだけ、「最良の場合の性能」は悪化してしまいます....汎用性と特殊性のせめぎあい、というプログラマがいつも頭を悩ます問題というのは、回避不可能な本質的な問題なのです。

これはもっと広く考えて、問題とその解決法、という視点で考えるのも面白いでしょう。問題を「汎用的に解決する」のは非常に難しいわけです。

人生、宇宙、すべての答え

という極めつけの「汎用的な問い」への答えを要求された銀河最高のコンピュータ「ディープ・ソート」は、

42

という極めて「汎用的な答え」を返します(詳しくは「銀河ヒッチハイクガイド」を...)。「42」は答えに違いないのでしょうが、それは人間にとって「利用可能な答え」ではありえないのです....「汎用的」なのがいつもいつも正しいわけではないのです。

 

投稿者 : 杉浦 こずえ | 投稿日時 : 2008.05.27 13:48

2012年4月27日金曜日

オブジェクト指向とは何か


まずはストレートに「オブジェクトとは何か」という問いを発してみましょう。 これは難問です。そして人によって解釈の違う概念でもあり、「これで正解」 というものがないのも実状です。しかし敢えてこの問いに一つの答えを出して みたいと思います。

「オブジェクト」とは日本語で言えば「もの」です。しかし「もの」というだ けではそれこそ何でもオブジェクトになってしまいます。「何でもオブジェク トだ」という見方も一つあるのですが、ここではそれに「アイデンティティー」 という考え方を導入したいと思います。 「アイデンティティー」は日本語では「自己同一性」と訳されますが、「それ がそれであること」です。人間で言えば「自分が他の人とは区別された自分自 身であること」です。そしてアイデンティティーを備えた「もの」こそが「オ ブジェクト」なのです。

例えば薬局に錠剤の入った薬瓶が並んでいる所を想像して下さい。それぞれの 薬瓶には名前の書かれたラベルが貼ってあり、錠剤がたくさん入っています。 これらの薬瓶は取り換えの効かないものです。頭痛薬の入った瓶と胃腸薬の入っ た瓶は混同してはいけないものですし、同じ薬の入った瓶でも中身の多いもの と少ないものではまた違います。こういう、それぞれの瓶が他の瓶と取り換え が効かない固有の特徴を持っているという状態が「アイデンティティー」を持 つということです。それに対してその中身はどうでしょう?瓶の中には同じ 薬の錠剤がたくさん入っていますが、どの錠剤も他の錠剤とまったく同じで取 り換えが効きます。これがアイデンティティーのない状態です。

アイデンティティーのあるなしを見分けるには、「個体が識別できるかどうか」 を考えるとよいでしょう。アルバイト店員が薬剤師に「薬瓶を持ってきて」と 頼まれたとしましょう。アルバイト店員が「どの薬瓶ですか?」と聞くと、薬 剤師は例えば「一番上の棚の右から3番目のところにある『アスピリン』と書 いてある瓶を持ってきて」というように答えるでしょう。薬剤師は指定した場 所にある特定の薬瓶を持ってきてほしいのです。

2012年4月25日水曜日

*IRA200E AUXILIARY STORAGE SHORTAGEの対処法


は、テストプログラムを作成して、Auxiliary Storage(LocalPageデータセット)を溢れさせてみました。その時の状況をSYSLOGに表示されたメッセージを元に解説します。

まず、Auxiliary Storage Shortageとは、使用率が70%を超えた状態の事を指します。Auxiliary Storageの使用率が70%を超えると、MVSシステムMVSはIRA200Eを出力し、LOGON,MOUNT,STARTコマンドが全て失敗させ、新しいアドレススペースを作成しません。稼動中のタスクも、Swapout中のJOBはSwapinする事が出来ません。一部のJOBは強制的にSwapoutされます。さらにGetmainを要求するJOBのほとんどは停止してしまいます。

2012年4月24日火曜日

減色アルゴリズム

¥n" ); for ( i = 0; i < 256; i++ ) { r = ( i & 0xC0 ) >> 6; // rは0から3 r = r * 255 / 3; g = ( i & 0x38 ) >> 3; // gは0から7 g = g * 255 / 7; b = ( i & 0x07 ); // bは0から7 b = b * 255 / 7; // HTMLのタグを出力 printf( "" ); printf( "¥n" ); } printf( "
", r, g, b ); if ( r + g + b > 384 ) printf( "" ); else printf( "" ); printf( "0x%02X%02X%02X", r, g, b ); printf( "

2012年4月22日日曜日

メモ書き 資格取得記録〜オラクルマスターシルバー〜


2006/01/24

■オラクルマスターシルバー SQL/Oracle入門


オラクルマスターシルバー SQL

初めてのベンダー試験。
たぶん大丈夫だろう、と思って試験当日。
何気に難しくないか?SQLが複雑なんですけど・・・。
結果。
14/20
あぶねぇ、ぎりぎりだ。受験料15,000円が吹っ飛ぶところだった。2004/07/10

オラクルマスターシルバー Oracle入門

SQL試験で危機感を感じ、念入りに勉強した。
前回の結果で不安を残しながら受験。
・・・え?こんなんでいいのか?
20分ちょっとで退場。
20/20
・・・こっちはそれほど難しくないみたい。2004/08/21

2012年4月21日土曜日

Microsoft Accessのクラスモジュールの使い方(記述方法)について教えて下さい。 - Yahoo!知恵袋


hatena1989さん

とりあえずおかしな点を指摘すると、

> 標準モジュール(Uniting)

> Function Uniting(BookNumberb As Integer, BookName As String, Author As String)

モジュール名と関数名に同じ名前は使えません。
モジュール名を Uniting 以外に変更しましょう。

> フォーム
> Public Sub 登録_Click()
>
> Dim BookName As String
> Dim Author As String
> Dim BookNumber As Integer
> Dim BookInfo As String

この BookInfo は 登録_Click内で使用してないので不要です。削除しましょう。

> 標準モジュール(Uniting)
> Option Compare Database
> Option Explicit
> Public BookInfo As String