Skip to content

Release Captail 0.1.2 performance and stability update#4

Merged
FaulMit merged 3 commits into
mainfrom
agent/release-0.1.2-performance-stability
Jul 22, 2026
Merged

Release Captail 0.1.2 performance and stability update#4
FaulMit merged 3 commits into
mainfrom
agent/release-0.1.2-performance-stability

Conversation

@FaulMit

@FaulMit FaulMit commented Jul 22, 2026

Copy link
Copy Markdown
Owner

Summary

  • move libobs lifecycle work to a dedicated serialized worker so settings, audio changes, replay toggles, saves, recovery, and shutdown do not block the WPF UI
  • add transactional settings rollback, atomic configuration backups, graceful installer upgrades, and more reliable autostart migration
  • remove the unnecessary single-source OBS scene composition pass and use the selected game client size for Game Capture
  • harden native loading, OBS/runtime downloads, NuGet dependency locking, installer acquisition, and GitHub Actions
  • add capability, codec, fault-recovery, and high-FPS Game Capture diagnostics
  • prepare version 0.1.2 and document changes in English

Root cause

Captail previously performed thread-affine libobs startup and shutdown work from UI-triggered paths without one shared operation gate. Concurrent saves, setting changes, watchdog recovery, and application shutdown could contend, freeze the window, or leave partially applied state. Game Capture also passed its only source through an avoidable scene-composition stage.

Validation

  • Release build: 0 warnings, 0 errors
  • critical .NET analyzer rules: passed
  • GPU capability model: passed
  • hardware codec QA: AV1, HEVC, and H.264 passed
  • fault recovery QA: three consecutive pipeline restarts and replay save passed
  • 2560x1440 AV1 Game Capture at 240 FPS: 965 decoded frames, 965 unique frames, 0 adjacent duplicates, effective 240 unique FPS
  • stressed capture: 0/1440 steady-state render lag; 1/2468 total encoding lag (0.0%)
  • portable 0.1.2 package: checksum, version metadata, required OBS/native files, and UI launch passed
  • NuGet vulnerability audit: no known vulnerable direct or transitive packages
  • EN/RU localization parity: 197/197 keys
  • GitHub workflow YAML and pinned action revisions verified

The GitHub release workflow will independently build and validate both Portable ZIP and Setup EXE, including silent install and uninstall tests.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6f45d36d62

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +130 to 132
$pluginDataDestination = Join-Path $dataDestination "obs-plugins\$plugin"
Copy-Item -LiteralPath $pluginData -Destination $pluginDataDestination `
-Recurse -Force

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Create the plugin data parent before copying

When the first listed OBS plugin has a data directory, this copies it to data\obs-plugins\<plugin> even though only $dataDestination was created above; the intermediate data\obs-plugins parent is still missing, so Copy-Item fails before CI/release can finish acquiring the OBS runtime. Create the obs-plugins data directory first or copy into an existing parent directory.

Useful? React with 👍 / 👎.

Comment thread src/Captail/App.xaml.cs
Comment on lines +561 to +563
if (acquired)
_singleInstanceMutex.ReleaseMutex();
_shutdownExistingSucceeded = acquired;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Return the shutdown failure to the installer

In the existing-instance --shutdown-existing path, a timeout is stored here, but AcquireSingleInstance still returns false; the caller immediately takes the !AcquireSingleInstance branch and exits with plain Shutdown() before reaching the later nonzero exit-code logic. That makes the installer see success even when the running Captail instance never released the mutex, so updates can proceed while the old process is still holding files open.

Useful? React with 👍 / 👎.

@FaulMit
FaulMit merged commit 16e09a5 into main Jul 22, 2026
5 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant