# 非機能要件定義書

## 概要

本ドキュメントは、Dear ImGui（バージョン1.92.7 WIP）の非機能要件を定義するものである。Dear ImGuiはC++で実装された即時モードGUIライブラリであり、ゲームエンジン、リアルタイム3Dアプリケーション、組み込みアプリケーション向けに設計されている。本ライブラリはヘッダーオンリーに近い軽量設計であり、外部依存関係を最小限に抑えている。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| フレーム描画 | 60FPS（16.67ms）以内 | デフォルトのDeltaTime = 1.0f/60.0f、即時モードGUIとして毎フレームUI構築を行う |
| アイドルフレーム | malloc/free呼び出しなし | 典型的なアイドルフレームではメモリ割り当てを回避する設計 |
| テキスト入力応答 | キーリピート開始 0.275秒、リピート間隔 0.050秒 | io.KeyRepeatDelay、io.KeyRepeatRateで設定可能 |
| ダブルクリック検出 | 0.30秒以内 | io.MouseDoubleClickTimeで設定可能 |
| ホバー遅延（短） | HoverDelayShortで設定 | ツールチップ表示等の遅延設定 |
| ホバー遅延（通常） | HoverDelayNormalで設定 | 通常のホバー検出遅延 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 描画コマンド | バッチ最適化による最小化 | 頂点バッファと描画コマンドリストを出力、GPU状態変更を最小化 |
| 頂点インデックス | 16ビット（デフォルト）/ 32ビット（オプション） | ImDrawIdxで設定可能、64K頂点を超えるメッシュには32ビットを使用 |
| テクスチャアトラス | 動的サイズ調整 | フォントアトラスは必要に応じて自動的にサイズ調整 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | ライブラリとして100%（ホストアプリケーション依存） | スタンドアロンライブラリのため、ホストアプリケーションの稼働に依存 |
| エラー回復 | ConfigErrorRecoveryで有効化可能 | プログラミングエラーや例外処理後の回復をサポート |
| 状態復元 | ErrorRecoveryStoreState/ErrorRecoveryTryToRecoverStateで実装 | スタックサイズを記録し、エラー後に復元可能 |
| 設定永続化 | .iniファイルによる自動保存 | IniSavingRate = 5.0秒（最小保存間隔）、io.IniFilenameで無効化可能 |

## セキュリティ要件

### 入力検証
- **アサーション**: IM_ASSERT()マクロによる入力検証を実施
- **パラノイドモード**: IMGUI_DEBUG_PARANOIDを定義することで追加の検証を有効化可能
- **バッファオーバーフロー対策**: ImVector<>はサイズチェックを実施（インデックスアクセス時にアサート）

### メモリ安全性
- **カスタムアロケータ**: ImGui::SetAllocatorFunctions()でメモリ割り当て関数をカスタマイズ可能
- **DLLバウンダリ**: DLL境界を越える場合はSetCurrentContext() + SetAllocatorFunctions()の呼び出しが必要
- **メモリコンパクト**: ConfigMemoryCompactTimer = 60.0秒（未使用のウィンドウ/テーブルメモリバッファを解放）

### クリップボード
- **プラットフォーム統合**: 各プラットフォームバックエンドでクリップボード機能を実装
- **無効化オプション**: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONSで無効化可能

## 拡張性要件

### マルチプラットフォーム対応
- **対応プラットフォーム**: Windows、macOS、Linux、iOS、Android、コンソール（PS4/PS5、Switch、Xbox）
- **グラフィックスAPI**: DirectX9/10/11/12、OpenGL/ES、Vulkan、Metal、WebGPU、SDL_GPU
- **バックエンド分離**: Platform Backend + Renderer Backendの組み合わせによる柔軟な構成

### カスタマイズポイント
- **imconfig.h**: コンパイル時設定のカスタマイズ
- **ImGuiIO構造体**: ランタイム設定（クリップボードコールバック、各種機能有効化）
- **ImGuiStyle構造体**: UIスタイル（色、サイズ、パディング等）のカスタマイズ
- **フォントアトラス**: カスタムフォント、FreeType統合、SVGフォントサポート

### API設計
- **名前空間**: ImGui::名前空間を使用、ユーザーコードから拡張可能
- **バージョンチェック**: IMGUI_CHECKVERSION()マクロでデータ構造の互換性を検証
- **廃止警告**: IMGUI_DISABLE_OBSOLETE_FUNCTIONSで古いAPIの使用を検出

## 保守性要件

### コード品質
- **シングルパス設計**: 即時モードGUIとして毎フレーム1回のみUIコードを呼び出し
- **最小依存関係**: 標準Cライブラリ（float.h、stdarg.h、stddef.h、string.h）のみに依存
- **ビルドシステム不要**: ソースファイルを直接プロジェクトに追加可能

### デバッグ機能
- **Metrics/Debuggerウィンドウ**: ShowMetricsWindow()で内部状態を可視化
- **Debug Log**: ShowDebugLogWindow()でイベントログを表示
- **ID Stack Tool**: ShowIDStackToolWindow()でID競合をデバッグ
- **Item Picker**: ウィジェットをマウスでピックしてデバッグ可能
- **ID競合検出**: ConfigDebugHighlightIdConflictsで重複IDを強調表示

### テスト支援
- **Test Engine統合**: IMGUI_ENABLE_TEST_ENGINEで自動テストエンジンを有効化
- **Begin/Endチェック**: ConfigDebugBeginReturnValueOnce/Loopでウィンドウ呼び出しの整合性をテスト

## 運用・監視要件

### ログ機能
- **デバッグログ**: IMGUI_DEBUG_LOG()マクロでログ出力（TTYおよびDebug Log Window）
- **ログファイル**: io.LogFilename = "imgui_log.txt"（デフォルト）
- **カテゴリ別ログ**: Error、ActiveId、Focus、Popup、Nav、Selection、Clipper、IO、Font、InputRouting

### 設定管理
- **INIファイル**: ウィンドウ位置、サイズ、テーブル設定等を永続化
- **手動制御**: LoadIniSettingsXXX() / SaveIniSettingsXXX()で手動保存/読み込み
- **デバッグコメント**: ConfigDebugIniSettingsで.iniファイルにコメントを追加

### リソース管理
| リソース | 管理方法 | 備考 |
| --- | --- | --- |
| メモリ | ImGui::MemAlloc()/MemFree() | カスタムアロケータ対応 |
| フォントアトラス | ImFontAtlas | コンテキスト間で共有可能 |
| テクスチャ | ImTextureDataで管理 | バックエンドがアップロード/削除を実施 |
| コンテキスト | CreateContext()/DestroyContext() | 複数コンテキストをサポート |

### 性能最適化オプション
- **SSE最適化**: IMGUI_ENABLE_SSEで有効（x86/x64で自動検出）
- **SSE4.2 CRC**: IMGUI_ENABLE_SSE4_2_CRCでCRC32高速化
- **アンチエイリアス無効化**: style.AntiAliasedLines/AntiAliasedFillでCPU/GPU負荷を軽減
- **曲線テッセレーション**: style.CurveTessellationTolで品質/性能のトレードオフを調整
- **円テッセレーション**: style.CircleTessellationMaxErrorで品質/性能のトレードオフを調整

## 備考

### 設計原則
Dear ImGuiは以下の設計原則に基づいている：
1. **使いやすさ**: コード駆動およびデータ駆動のツール作成を容易に
2. **ハック容易性**: カスタマイズと改善が容易
3. **最小セットアップ**: 外部依存関係を最小化
4. **状態最小化**: ユーザー側での状態保持を最小化
5. **ポータビリティ**: コンソール、スマートフォン等で動作
6. **効率性**: ランタイムおよびメモリ消費を最適化

### 制限事項
- 国際化（RTL、双方向テキスト、テキスト整形）は未サポート
- アクセシビリティ機能は未サポート
- 一般エンドユーザー向けではなく、開発者・コンテンツクリエイター向け

### バージョン情報
- ライブラリバージョン: 1.92.7 WIP
- バージョン番号: 19262
