# 非機能要件定義書

## 概要

本ドキュメントは、Avalonia UIフレームワークの非機能要件を定義するものである。Avaloniaは.NETベースのクロスプラットフォームUIフレームワークであり、Windows、macOS、Linux、iOS、Android、WebAssemblyなど多様なプラットフォームで動作するデスクトップおよびモバイルアプリケーションの開発を可能にする。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| レイアウト測定パス | 16ms以内（1フレーム） | 60fpsを維持するための目標値。LayoutManager.MaxPasses=10回以内に収束 |
| レイアウト配置パス | 16ms以内（1フレーム） | UIスレッドでの配置処理 |
| コンポジターレンダリング | 16ms以内（1フレーム） | レンダースレッドでの描画処理 |
| アニメーションフレーム | 16ms間隔 | MediaContext._animationsTimerで設定 |
| Dispatcherタイムアウト | 設定可能（-1msでタイムアウトなし） | Dispatcher.Invoke()のtimeoutパラメータで制御 |
| 入力飢餓タイムアウト | 1秒（デフォルト） | DispatcherOptions.InputStarvationTimeoutで設定。入力イベントの優先度を上げるまでの待機時間 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| フレームレート | 60fps | 標準的なUI更新頻度 |
| タイマー最大間隔 | Int32.MaxValue ms | DispatcherTimer.Intervalの最大値 |
| 同時視覚要素数 | 制限なし | メモリ容量に依存。Diagnostic.Meters.TotalVisualCountで監視可能 |
| イベントハンドラ数 | 制限なし | Diagnostic.Meters.TotalEventHandleCountで監視可能 |

### メモリ管理

| 項目 | 実装方式 | 備考 |
| --- | --- | --- |
| オブジェクトプーリング | ArrayPool&lt;T&gt; | PooledListクラスでメモリ再利用を実現 |
| ビットマップキャッシュ | BitmapCache | 視覚要素のビットマップ表面キャッシュをサポート |
| フォントキャッシュ | ConcurrentDictionary | FontCollectionBase._glyphTypefaceCacheで管理 |
| リソース解放 | IDisposableパターン | 適切なリソース解放を保証 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| 稼働率 | クライアントサイドアプリケーション | サーバーサイド稼働率は適用外 |
| 計画停止時間 | N/A | クライアントアプリケーションのため該当なし |
| 障害復旧時間（RTO） | N/A | クライアントアプリケーションのため該当なし |
| 目標復旧時点（RPO） | N/A | クライアントアプリケーションのため該当なし |

### プラットフォームサポート

| プラットフォーム | サポートバージョン | 備考 |
| --- | --- | --- |
| Windows | Windows 2025+ | Azure Pipelines: windows-2025 |
| macOS | macOS 15+ | Azure Pipelines: macos-15、Xcode 26.0 |
| Linux | Ubuntu 24.04+ | Azure Pipelines: ubuntu-24.04 |
| iOS | サポート | dotnet workload: ios |
| Android | サポート | dotnet workload: android |
| WebAssembly | サポート | dotnet workload: wasm-tools |
| Tizen | サポート | InternalsVisibleToに定義 |

### .NETランタイム要件

| 項目 | バージョン | 備考 |
| --- | --- | --- |
| .NET SDK | 10.0 | global.jsonで指定 |
| .NET Runtime | 8.0以上 | レガシーサポート |
| TargetFrameworks | 複数バージョンサポート | AvsCurrentTargetFramework, AvsLegacyTargetFrameworks |

## セキュリティ要件

### アクセス制御

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| サンドボックスサポート | SecurityScopedStream | Apple Platform向けNSUri.startAccessingSecurityScopedResource対応 |
| アセンブリ署名 | PublicKey | InternalsVisibleToで公開鍵ベースのアクセス制御 |

### ライセンス

| 項目 | 内容 | 備考 |
| --- | --- | --- |
| ライセンス形式 | MIT License | オープンソース、商用利用可 |
| 著作権者 | AvaloniaUI OU | |

### コード品質

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| Null安全性 | Nullable有効 | NullableEnable.propsで設定 |
| トリミング | 有効 | TrimmingEnable.propsで設定 |
| 静的解析 | DevAnalyzers | DevAnalyzers.propsで設定 |

## 拡張性要件

### モジュール構成

| モジュール | 用途 | 備考 |
| --- | --- | --- |
| Avalonia.Base | コアライブラリ | 基本機能 |
| Avalonia.Controls | UIコントロール | ボタン、テキストボックス等 |
| Avalonia.Markup.Xaml | XAMLパーサー | マークアップサポート |
| Avalonia.Themes.Fluent | Fluentテーマ | モダンUI |
| Avalonia.Themes.Simple | シンプルテーマ | 軽量UI |
| Avalonia.OpenGL | OpenGLサポート | ハードウェアアクセラレーション |
| Avalonia.Vulkan | Vulkanサポート | 高性能グラフィックス |
| Avalonia.Metal | Metalサポート | Apple向け高性能グラフィックス |
| Avalonia.Skia | Skiaレンダリング | クロスプラットフォーム描画 |

### プラグインアーキテクチャ

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| サービスロケーター | AvaloniaLocator | 依存性注入パターン |
| プラットフォーム抽象化 | IFontManagerImpl等 | インターフェースベースの実装 |
| カスタムレンダラー | 対応 | Compositor/MediaContextで拡張可能 |

## 保守性要件

### コード品質基準

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| ソースジェネレーター | 有効 | SourceGenerators.propsで設定 |
| コンパイラ生成ファイル出力 | 有効 | EmitCompilerGeneratedFiles=true |
| デバッグビュー | DebuggerDisplay/DebuggerTypeProxy | コレクションの可視化サポート |
| 内部API公開 | InternalsVisibleTo | テスト・関連モジュール向け |

### テスト

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| 単体テスト | XUnit/NUnit | Avalonia.Headless.XUnit/NUnit |
| ベンチマーク | Avalonia.Benchmarks | パフォーマンス測定 |
| リークテスト | Avalonia.LeakTests | メモリリーク検出 |
| レンダリングテスト | Avalonia.Skia.RenderTests | 描画結果検証 |

## 運用・監視要件

### ロギング

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| ログシンク | ILogSink | カスタマイズ可能なログ出力先 |
| ログレベル | 6段階 | Verbose, Debug, Information, Warning, Error, Fatal |
| ログエリア | LogArea | 機能領域別ログ分類 |
| パラメータ化ログ | ParametrizedLogger | 構造化ログサポート |

### メトリクス

| メトリクス名 | 説明 | 単位 |
| --- | --- | --- |
| avalonia.comp.render.time | コンポジターレンダリング時間 | ms |
| avalonia.comp.update.time | コンポジター更新時間 | ms |
| avalonia.ui.measure.time | レイアウト測定時間 | ms |
| avalonia.ui.arrange.time | レイアウト配置時間 | ms |
| avalonia.ui.render.time | レンダリング記録時間 | ms |
| avalonia.ui.input.time | 入力処理時間 | ms |
| avalonia.ui.event.handler.count | イベントハンドラ数 | handler |
| avalonia.ui.visual.count | 視覚要素数 | visual |
| avalonia.ui.dispatcher.timer.count | ディスパッチャータイマー数 | timer |

### CI/CD

| 項目 | 実装 | 備考 |
| --- | --- | --- |
| ビルドシステム | Azure Pipelines | azure-pipelines.yml |
| ビルドツール | Nuke | nukebuildディレクトリ |
| マルチプラットフォームビルド | Linux/macOS/Windows | 3環境並列ビルド |
| パッケージ配布 | NuGet | nuget.org経由 |
| テスト結果出力 | VSTest形式 | trxファイル |

## 備考

### スレッディングモデル

- UIスレッド: Dispatcher.UIThreadで管理
- レンダースレッド: Compositorで管理
- スレッドアクセス検証: Dispatcher.VerifyAccess()で保証
- 非同期処理: async/awaitパターン、DispatcherOperation対応

### 優先度システム

DispatcherPriorityによる処理優先度制御:
- Send: 最高優先度（同期実行）
- Input: 入力イベント処理
- Render: 描画処理
- Background: バックグラウンド処理
- Inactive: 非アクティブ（タイマー待機用）

### キャッシュ戦略

- BitmapCache: 視覚要素のビットマップキャッシュ
  - RenderAtScale: 解像度倍率
  - SnapsToDevicePixels: ピクセルスナップ
  - EnableClearType: ClearTypeテキスト対応
- FontCollectionBase._glyphTypefaceCache: フォントグリフキャッシュ
- ArrayPool&lt;T&gt;.Shared: 共有配列プール

### 入力飢餓防止機構

MediaContextにおいて、レンダリング処理が継続的に行われる場合でも入力処理が滞らないよう、InputStarvationTimeout（デフォルト1秒）を超えた場合は入力イベントの優先度を上げる仕組みが実装されている。
