Nimculus は、NimNUI を UI 基盤とする GPU ネイティブコードエディタです。初期開発の主対象は Apple Silicon 搭載 macOS です。
- macOS on Apple Silicon
- Nim 2.x
- Nimble
- Cocoa / Metal / QuartzCore
nimble build
nimble test
nimble benchmarkM12以降のrelease candidateでは、個別のGUI手順ではなく次の一括E2Eゲートを使う。
unit/integration test、native Cocoa/Metal contract、cold start、soak、パッケージ化した
DMGのmount後起動を一つのログで検証する。既定のsoakはCI向け20秒であり、release
acceptanceではNIMCULUS_E2E_SOAK_SECONDS=28800を指定する。
nimble macosE2EGitHub Actionsでは、8時間受け入れを次のように起動する。self-hosted runnerのジョブ上限は 9時間で、build・package・cleanupの余白を確保する。長時間実行ではログを抑制しすぎないよう、 soakのheartbeatを60秒間隔で記録する。
gh workflow run "macOS Release Candidate E2E" --ref main \
-f soak_seconds=28800 -f soak_interval_seconds=60 -f cold_start_runs=3macOSの実アプリ起動から初回ready/idle到達までを測る場合は、専用の一時
.app bundle、ビルドキャッシュ、HOMEを使う次の計測を実行する。raw
executableをNIMCULUS_BINARYで指定した場合も、LaunchServicesのbundle
ライフサイクルを再現する一時.appへ包んで起動する。GUIセッションが利用
できるApple Silicon macOSで実行すること。
bash scripts/benchmark_cold_start.sh既存の実行ファイルを使う場合は NIMCULUS_BINARY=/path/to/Nimculus(raw
実行ファイルは一時.appへ自動的に包む)、
反復回数は NIMCULUS_COLD_START_RUNS=10、1回あたりのtimeoutは
NIMCULUS_COLD_START_TIMEOUT_SECONDS=30 で指定できる。
Developer ID notarizationは、Appleのkeychain profile(APPLE_NOTARY_PROFILE)
またはApp Store Connect API key(APPLE_NOTARY_KEY、
APPLE_NOTARY_KEY_ID、APPLE_NOTARY_ISSUER_ID)を優先して利用できる。
従来のAPPLE_ID、APPLE_TEAM_ID、APPLE_APP_SPECIFIC_PASSWORDも利用可能だが、
資格情報をリポジトリへ保存してはならない。
GitHub ActionsでDeveloper ID配布を行う場合は、macos-release.ymlを手動実行する。
証明書、証明書パスワード、署名ID、App Store Connect API keyはActions secretsへ登録し、
workflowがrunner一時keychainへ導入してstrictなstapler/Gatekeeper検証後にartifactを公開する。
Zedのreliability heartbeatを参考に、アプリのidle境界でresident memory、 live allocation、frame/inputを定期記録するsoak計測は次で実行する。既定は 8時間で、GUIセッションが利用できるmacOSまたはWindowsで実行する。
bash scripts/benchmark_soak.sh短い動作確認では NIMCULUS_SOAK_SECONDS=60、記録間隔は
NIMCULUS_SOAK_INTERVAL_SECONDS=10、実行ファイルは
NIMCULUS_BINARY=/path/to/Nimculus で指定できる。
各サンプルの先頭値から最終値までの増加も検証する。既定の上限はresident
memoryが128MiB、live allocation blocksが50,000で、必要に応じて
NIMCULUS_SOAK_MAX_RESIDENT_GROWTH_BYTES と
NIMCULUS_SOAK_MAX_LIVE_BLOCK_GROWTH で調整できる。
M1 の最小縦切りは macOS ウィンドウ、CAMetalLayer、Metal の clear / rectangle 描画、Retina 対応、基本入力イベントログです。