2008-11-30

Expression Designで編集したベクタ画像をWordで使用したかった

Expression Designはベクタで編集できるのですが、肝心のベクタでエクスポートできる形式がXAMLかPDFしかありません。今回はWordで使うことを目的としているのでWindows Meta Fileで欲しいわけです。

イラストレータがあればクリップボードにコピーしてイラレストレータ上に貼り付け、さらにイラレ上でクリップボードにコピーすればWindows Meta File形式でコピーしてくれるので若干面倒なものの解決なのですが、今回の作業環境にはそんなもの入っていないので却下です。

ということでXAMLをどうにかする方向になるわけですが、XamlToysを使えばXAMLからEMFに変換できるので実験してみたところ、確かに目的は達成できるのですがライブエフェクトが無効な模様。いやドロップシャドウしか試してないのですけど。うーん微妙。気づいたのがクリップボード形式を変換するコードを書いた後だけに脱力感が。

で、残るはクリップボードフォーマット。AI形式も吐いているのでこれを弄ることができれば…ということで力尽き。もうラスタ画像でいいかなー。

2008-11-29

さらさら

一晩かけてやっているはずの処理が必要なファイルが足りなくて始まってすらいなくてがっかりな一日。そしてお金がないとか言ってる割に今日も外食。むぅ。このペースだと予定金額は厳しいかも。ギラドーガ欲しいけど無理かなー。

2008-11-26

トップ絵更新

今回はオリジナルです。コンセプトはなびいてる髪。理想には程遠いですが前よりはましになったかな。結果として服装が適当になりましたけど時間が…!いやーしかし版権キャラは楽でいいですね。いろいろ考えなくていいですし。久々にオリジナルを描いて実感。

関係ないですけどいつも右向きだったので気分を変えて左向きにしてみましたがデザインが…画像の配置を換えるというやる気のない対処を。

2008-11-24

さらさら

いきなりあたるとか。気がつけば11月も終わりですよ。しかしまだトップ絵を更新していません。さてどうしたものか。もう棒立ちでもいいかなーとか思い始めているわけですがどうでしょうか。

2008-11-22

さらさら

一撃ですか。リンク更新しました。

さて、最近CUDAの話しかしてない気がしますが、CUDA2.1βが公開されたようです。今落としているので気がついたことがありましたら追記します。

追記。リリースノートとマニュアルを流し読みした程度。環境を壊せないので動作確認などは行っていません。

  • Physx用として指定することでVistaでディスプレイに接続されていないGPUのサポート?
  • 相変わらずVistaでカーネルとメモリ転送のオーバーラップはできない
  • VC9のサポートが追加されVC7のサポートが打ち切り
  • PTXをJITコンパイル?するDriver APIが追加、Runtimeは不明
  • Direct3D 10連携関数がRuntime/Driver APIに追加
  • 32bit Linuxのみにデバッガが提供される

2008-11-18

CUDA# #4

CUDA#更新。

更新率高いですがどうせ最初だけです。残るはArrayと2D,3Dメモリ。
…連携関数?ありましたねそんなのOpenGL連携はともかくDirectX連携はどうしよう。いまどきManaged DirectXなんてないでしょうし。

それよりも割りと面倒なタスクが上から降ってきたのでどうしようかと思案中。

2008-11-17

CUDA@コアレスにグローバルメモリにアクセスする

CUDAのパフォーマンスガイド見てるとグローバルメモリはコアレスにアクセスしろとしつこく書かれています。で、コアレスにアクセスとはスレッドNからBaseAddress+N*sizeof(T)のようにアクセスすればいいのだろうと思っていたのですが、違いました。

何が違うかといいますと、このsizeof(T)は任意のサイズではなく4, 8, 16バイトのいずれかである必要があります。float3はsizeof(float3)=12なのでコアレスではありません。これ、図で描かれているのですが最近まで気づきませんでした。つまるところこのような単位でメモリを配置しておくとスレッド起動時に一度のメモリアクセスでまとめて読み込めるから速いというわけですね。

じゃあパラメータが多い場合どうするかといいますと、


for(int i=0; i<len; i++)
    result[i * memSize + idx] = ~;

このようにひとつのメモリにブロックをつくり使用します。memSizeが十分に大きい場合、これはコアレスにアクセスすることができます。別に変数を分けてもいいのですが、これは茨の道です。上記のようにforで連続してアクセスしたい場合ポインタを配列にマップする、

T* t[] = { t0 + idx, t1 + idx, ... };

このようなアプローチが考えられますが、これはうまく動いてはくれないようです。いくつか試してみましたが意図した結果は得られませんでした。採用したのはマクロで展開するというものですが、私のケースでは逆に遅くなってしまう理由で先のとおりひとつのメモリブロックにおくことで落ち着きました。また、引数のサイズの問題もあります。CUDAの引数は256バイトという制限がありますが、64bitではポインタが8バイトになりメモリを激しく圧迫します。(Driver APIのdevptrは32bitなのになんで64bitなんだろう?)

なおコアレスにアクセスできているかはパフォーマンスモニタでチェックすることで確認できます。gltが読み込み、gstが書き込みです。アルゴリズムの事情でコアレスにアクセスできない場合はコンスタントメモリ、テクスチャを代替手段として使いますが、話が大きくそれるのでこれはまた機会があれば。

最後にCompute Capability 1.2以上では事情が異なるようですが、環境がないのでわかりません。

2008-11-16

さらさら

セール最終日なので冷やかしに行ったら閉店時間でもないのに店じまいってどーよ。いやきっと商品がなくなったのでしょう。ええきっと。

さて11月も折り返し、トップ絵は描いていますが未だポーズが決まりません。なんというかあれもこれも描きたい状態でだめだー。

さて気がつけばXNA3.0が公開されているわけです。常々ゲーム作りたいけど時間がないとかチャットで言ってるわけですが、今から作るならManaged DirectXよりXNAなのでしょうか。別に3Dがグリグリ動かなくても2Dが早く描画できればいいのですが。つまることろスプライトだけしか使わないわけですから、2k切り捨てて移行(=新しく勉強)するのもありかなと思ったり。そういった意味ではWindows 7のDirect2Dは期待でしょうか。ただ動作するのがVista以降になっていますのがなんとも。

2008-11-13

VistaにおけるCUDAの制限

  • Kernelとmemcpyのオーバーラップが使用不能、CU_DEVICE_ATTRIBUTE_GPU_OVERLAPが常に0
  • ディスプレイが接続されていないマルチGPUが不可、よって常にタイムアウト時間が存在

うーん、エンコが劇遅なのでフィルタをCUDAで書こうとか思ってましたが制限が厳しい印象。VistaとXPのドライバモデルの違いが原因だと思いますが、XPのメインストリームサポートはもう少しで終わるわけですし、何とかして欲しいところ。

2008-11-12

6万リロード

です。正確には昨日でしたが、ぐだぐだとしゃべっていたら日付が変わっていました。例によって特に何もありません。ええ、ありません。

CUDA# #3

CUDA#更新。

CuEvent, CuStream他追加です。ただ非同期系はまだ考察の余地ありかなと思っております。.NETにあわせてBegin*にしてみましたけどEnd*がないんですよね。ていうかLaunchが非同期なのにBeginLaunchはないなと。メモリに関してはまた今度。ていうか2次元3次元もありますしどうしたものか。

コンテキストがディアクティブの状態でもDispose()の処理できるようにしました。ただファイナライザからの呼び出しの場合は無理です。ファイナライザではインスタンスに触れれませんしどう対処しましょうか。むむむ。

2008-11-10

散財

  • まぶらほ~またまたメイドの巻~

積読です。果たして読むのはいつの日になるのでしょーか!?

話は変わってけに山達とゲーセン行って来たんですよ。クレーンゲームで豚が流れてたんですね。節約中ですし、私はこういうのはやらない主義なのですが、皆で「し○さんだ!し○さんだ!」と騒いで挑戦した結果
し○さんの授乳
雪崩が起こって全部でこの3倍くらい取れました。使ったのは3人合計で1kくらいでしょうか。この写真をみてし○さんを想像しない人が果たして居るでしょうか?いえ居ません。(反語)

2008-11-06

CUDA# #2

CUDA#ですが、cutilの定義を追加しようと持ったのですが気が乗らなかったのでラッパライブラリの構築を始めました。自分の使ってる範囲は大体実装。

ただ名前が微妙。Cuプレフィックスはいらない気がしますし、CuContext.Contextとかおかしいと思う。ということで名前に関しては変わる可能性ありです。

cudaGetSymbolAddress()相当がない気がするのですが、ConstantMemoryはどうやって使うのでしょう?

2008-11-04

CUDA# #1

今日時間があったのでCUDA#というのを作ってみました。名前のとおりC#からCUDAを呼び出します。何番煎じでしょうか。

まぁ肝心なラッパライブラリはまだ乗せていないので、ライブラリというよりサンプルといった感じです。このラッパ層について書きたいことがあるのですが、時間もないのでこの辺で。

2008-11-02

非表示ウィンドウのスクリーンショットを取りたかった

DWMサムネイルAPIで取れるのは現在表示されているウィンドウで、非表示のウィンドウに対しては取れません。

このメモリのアドレスがわかればReadProcessMemory()でとってこれるのではないかと思い調べてみるも分かりません。Vista周りの情報がなさすぎです。ただDependency Walkerでdwmapi.dllを見るとReadProcessMemory()は使ってないぽいのですよね。どうやってとってきてるんでしょう?

gdi32.dllがエクスポートしているDwmGetSurfaceData()といういかにもな名前の関数がありますが、ドキュメントがなく使い方が不明。引数はSDKにNtGdiDwmGetSurfaceData()ってのがありわかるのですが、HSPRITEとか謎なものが指定されていてやっぱり不明。ちなみにdwmapi.dllはこの関数を使っていません。

一方Direct3Dを利用して読み込む方法は見つけました。dwmapi.dllの隠し関数を呼び出しDirect3D9ExのSharedHandleを取ってきてTexture作成という流れのようです。Vista環境にVisual Studioインストールしていないので未確認ですが。ただWindows7からDWMがD3D10ベースになるらしく使えない予感。

とここまで書いてProcess Explorerで見ると非表示になった時点で該当メモリが削除されていました。最初に見ておけよ、と。このことから非表示状態のウィンドウイメージは保存されていません。非表示のウィンドウまでイメージを持っているとメモリの圧迫がひどいことになりそうなので削除されるのも分からなくはないですが…

まぁDWMサムネイルでは加工ができないので、依然ウィンドウイメージはほしいのですが、非表示では取れないというのがわかっただけでも儲け物ですか。

さらさら

月が変わって11月です。近所のとある店が移転するとかで今日から閉店セールなのですがすっかり忘れてました。もうだめだー。
まぁ大したものはないでしょうし、今月から貯蓄する(予定)から無駄使いはできないのですが。