Version 5 (modified by mosa, 5 years ago)

--

GSD

概要

ゲーム画面上に任意の画像を表示させるライブラリです
オマケとしてフレームレートを制限する機能が付いています

Source

Download

  • Binary
    svn export http://svn.coderepos.org/share/lang/c/GSD/trunk GSD
    

使い方

gsd.dllの初期化・終了

gsd.dllの以下の関数を呼び出すことで初期化・終了処理ができます

int _cdecl SetHook(void *reserve, DWORD *maxTextureSize);
void _cdecl FreeHook();

SetHook()の戻り値は、成功した場合 0を返し、失敗した場合は 0以外の値を返します
maxTextureSizeにはテクスチャの最大サイズが格納されます
sTexInfo::texSizeはこれ以下の値でなければなりません

gsd.dllでの画像表示方法

テクスチャデータ、及び設定用データには共有メモリによってアクセスすることができます
各共有メモリへアクセスする場合は必ずミューテックスで排他処理してください
排他処理後に各共有メモリのサイズ、設定等に矛盾がないようにしてください
(sSettings::pixelsDataSizeと実際のテクスチャ用共有メモリのサイズが食い違っている、等)

共有メモリ名・ミューテックス名は以下の通りです

gsd_pixelsX
テクスチャ用共有メモリ
XにはsSettings::pixelsRevisionの値が入ります。gsd_pixels1gsd_pixels2、・・・
テクスチャのカラーフォーマットはアルファ付32bit色(ARGB)です サイズ:sSettings::pixelsDataSize
gsd_settings
設定用共有メモリ
サイズ:sSettings構造体のサイズ
gsd_mutex
ミューテックス

設定用共有メモリの内容は以下の通りです

// 8バイトアライメント

struct sTexInfo
{
    BOOL active;    // 表示するか否か (TRUE、FALSE)
    DWORD texSize;  // テクスチャのサイズ、2のべき乗でなければならない (ピクセル単位) 0ならテクスチャ削除
    DWORD offset;   // テクスチャ用共有メモリの先頭からのオフセット (バイト単位)
    DWORD revision; // テクスチャを作成、更新した場合は必ずインクリメントする
    int x, y;       // テクスチャの位置 (alignの値によって基準位置が変わる)
    DWORD color;    // 基本色 (通常は白 0xffffffff)
    DWORD align;    // テクスチャの配置 (DT_LEFT、DT_CENTER、DT_RIGHT、DT_TOP、DT_VCENTER、DT_BOTTOM)
    DWORD reserve1, reserve2, reserve3, reserve4;
};

struct sSettings
{
    DWORD pixelsDataSize; // テクスチャ用共有メモリのサイズ (バイト単位)
    DWORD pixelsRevision; // テクスチャ用共有メモリを作成、再作成した場合はインクリメントする
    sTexInfo texInfo[32]; // テクスチャの設定情報
    DWORD lastUpdate;     // 最後にゲーム画面が更新された時間 (UNIX時間)
    double fpsLimit;      // FPS制限の値 0.0で無効
    __int64 orgTime;      // FPS制限の基準時間 (QueryPerformanceCounterの値)
    BOOL showFPS;         // FPS表示の有無 (TRUE、FALSE)
    DWORD fpsAlign;       // FPS表示の配置 (DT_XXX)
    BOOL updateOnActive;  // アクティブ時のみ更新 (TRUE、FALSE)
    DWORD reserve1, reserve2, reserve3, reserve4;
};

ToDo

  • Direct3D10のゲームに対応する
  • DirectDraw、Direct3D7以前のゲームに対応する
  • 64bitのゲームに対応する
  • 似たようなコードが散在しているので一箇所にまとめたい
  • 共有メモリを直接弄らなくていいようにAPIを追加する
  • 高速化

既知の問題点

  • extAddRefextReleaseが適当なので何とかしたい
  • OpenGLでのテクスチャ消失の検知が適当なので何とかしたい
  • 一部のDirect3D8ゲーム(UT2003等)で CaptureStateBlock を呼び出すと例外が発生する
  • 一部のOpenGLゲーム(いずもる3D地図等)で頂点色が効かない
  • Steamコミュニティーを使用するゲームで終了時にリソースを開放しようとすると例外が発生する

改良歓迎

上で挙げたToDoや問題点も、自分の力だけで解決できるか怪しいです
「俺が直してやんよ」という方は、是非CodeReposのComitterになり開発に参加してください

Author

License

LGPLに準じます