OpenVR : log la décision d'état au niveau INFO
Single ligne par transition de state (RuntimeMissing → HmdAbsent → Ready). Si jamais ça re-crash dans cette zone, on aura la dernière trace avant le silence de Serilog ; ex. « OpenVR state: HmdAbsent (vrserver.exe pas lancé) ». Pas de spam : on log uniquement à la transition (un check tourne toutes les 5 s, sans dédup ce serait 700 messages/heure). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -27,6 +27,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
|
|||||||
|
|
||||||
private bool _resolverEnsured;
|
private bool _resolverEnsured;
|
||||||
private bool _initAttempted;
|
private bool _initAttempted;
|
||||||
|
private VrRuntimeState _lastLoggedState = (VrRuntimeState)(-99); // sentinelle « jamais loggé »
|
||||||
private uint _initToken;
|
private uint _initToken;
|
||||||
private IntPtr _vrSystemVTable = IntPtr.Zero;
|
private IntPtr _vrSystemVTable = IntPtr.Zero;
|
||||||
|
|
||||||
@@ -50,6 +51,7 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
|
|||||||
lock (_lock)
|
lock (_lock)
|
||||||
{
|
{
|
||||||
var state = EnsureReady();
|
var state = EnsureReady();
|
||||||
|
LogStateTransition(state);
|
||||||
var label = ResolveLabel(deviceAlias);
|
var label = ResolveLabel(deviceAlias);
|
||||||
if (state != VrRuntimeState.Ready)
|
if (state != VrRuntimeState.Ready)
|
||||||
{
|
{
|
||||||
@@ -317,6 +319,28 @@ public sealed class OpenVrService : IOpenVrService, IDisposable
|
|||||||
catch { return null; }
|
catch { return null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Log au niveau INFO la première occurrence d'un état + chaque transition.
|
||||||
|
/// Évite de spammer (un check s'exécute toutes les 5 s, on aurait 700 messages
|
||||||
|
/// par heure si on loggait à chaque tick) tout en laissant une trace claire
|
||||||
|
/// dans le journal au cas où ça re-crasherait — la dernière ligne avant le
|
||||||
|
/// silence de Serilog dirait par exemple « OpenVR state: HmdAbsent ».
|
||||||
|
/// </summary>
|
||||||
|
private void LogStateTransition(VrRuntimeState newState)
|
||||||
|
{
|
||||||
|
if (newState == _lastLoggedState) return;
|
||||||
|
_lastLoggedState = newState;
|
||||||
|
var detail = newState switch
|
||||||
|
{
|
||||||
|
VrRuntimeState.RuntimeMissing => "openvr_api.dll introuvable (SteamVR pas installé)",
|
||||||
|
VrRuntimeState.HmdAbsent => "vrserver.exe pas lancé ou aucun HMD branché",
|
||||||
|
VrRuntimeState.InitFailed => "VR_InitInternal2 a échoué",
|
||||||
|
VrRuntimeState.Ready => "OK, vtable IVRSystem_022 bindée",
|
||||||
|
_ => "?",
|
||||||
|
};
|
||||||
|
_logger.LogInformation("OpenVR state: {State} ({Detail})", newState, detail);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// vrserver.exe est le process central de SteamVR ; sa présence garantit qu'on
|
/// vrserver.exe est le process central de SteamVR ; sa présence garantit qu'on
|
||||||
/// peut init OpenVR sans déclencher de chargement de drivers risqué. Cache de
|
/// peut init OpenVR sans déclencher de chargement de drivers risqué. Cache de
|
||||||
|
|||||||
Reference in New Issue
Block a user