Hi.Webapi/Services/RenderingService.cs
2025-07-16 13:41:43 +08:00

85 lines
2.5 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Hi.Disp;
using Hi.Geom;
using Hi.Native;
using System.Collections.Concurrent;
namespace Hi.Webapi.Services
{
/// <summary>
/// 管理 DispEngine 實例和渲染操作的服務
/// </summary>
public class RenderingService : IDisposable
{
private readonly ConcurrentDictionary<string, DispEngine> _engines = new();
private readonly ILogger<RenderingService> _logger;
public RenderingService(ILogger<RenderingService> logger)
{
_logger = logger;
}
/// <summary>
/// 創建或獲取一個 DispEngine 實例
/// </summary>
public DispEngine GetOrCreateEngine(string sessionId)
{
return _engines.GetOrAdd(sessionId, id =>
{
_logger.LogInformation($"創建新的 DispEngineSessionId: {id}");
var engine = new DispEngine();
engine.BackgroundColor = new Vec3d(0.1, 0.1, 0.5);
engine.BackgroundOpacity = 0.1;
return engine;
});
}
/// <summary>
/// 移除指定的 DispEngine
/// </summary>
public bool RemoveEngine(string sessionId)
{
if (_engines.TryRemove(sessionId, out var engine))
{
_logger.LogInformation($"移除 DispEngineSessionId: {sessionId}");
try
{
// 停止渲染
engine.IsVisible = false;
// 釋放資源
engine.Dispose();
}
catch (Exception ex)
{
_logger.LogError(ex, $"清理 DispEngine 時發生錯誤SessionId: {sessionId}");
}
return true;
}
return false;
}
/// <summary>
/// 獲取當前活動的引擎數量
/// </summary>
public int GetActiveEngineCount() => _engines.Count;
public void Dispose()
{
foreach (var kvp in _engines)
{
try
{
kvp.Value.IsVisible = false;
kvp.Value.Dispose();
}
catch (Exception ex)
{
_logger.LogError(ex, $"Dispose 時清理引擎錯誤SessionId: {kvp.Key}");
}
}
_engines.Clear();
}
}
}