import { useState, useEffect } from 'react'; import { Activity, Cpu, Layers, Package, Wifi, WifiOff, Maximize2 } from 'lucide-react'; import { ProfilerService, ProfilerData } from '../services/ProfilerService'; import { SettingsService } from '../services/SettingsService'; import { Core } from '@esengine/ecs-framework'; import { MessageHub } from '@esengine/editor-core'; import '../styles/ProfilerDockPanel.css'; export function ProfilerDockPanel() { const [profilerData, setProfilerData] = useState(null); const [isConnected, setIsConnected] = useState(false); const [isServerRunning, setIsServerRunning] = useState(false); const [port, setPort] = useState('8080'); useEffect(() => { const settings = SettingsService.getInstance(); setPort(settings.get('profiler.port', '8080')); const handleSettingsChange = ((event: CustomEvent) => { const newPort = event.detail['profiler.port']; if (newPort) { setPort(newPort); } }) as EventListener; window.addEventListener('settings:changed', handleSettingsChange); return () => { window.removeEventListener('settings:changed', handleSettingsChange); }; }, []); useEffect(() => { const profilerService = (window as any).__PROFILER_SERVICE__ as ProfilerService | undefined; if (!profilerService) { console.warn('[ProfilerDockPanel] ProfilerService not available - plugin may be disabled'); setIsServerRunning(false); setIsConnected(false); return; } // 订阅数据更新 const unsubscribe = profilerService.subscribe((data: ProfilerData) => { setProfilerData(data); }); // 定期检查连接状态 const checkStatus = () => { setIsConnected(profilerService.isConnected()); setIsServerRunning(profilerService.isServerActive()); }; checkStatus(); const interval = setInterval(checkStatus, 1000); return () => { unsubscribe(); clearInterval(interval); }; }, []); const fps = profilerData?.fps || 0; const totalFrameTime = profilerData?.totalFrameTime || 0; const systems = (profilerData?.systems || []).slice(0, 5); // Only show top 5 systems in dock panel const entityCount = profilerData?.entityCount || 0; const componentCount = profilerData?.componentCount || 0; const targetFrameTime = 16.67; const handleOpenDetails = () => { const messageHub = Core.services.resolve(MessageHub); if (messageHub) { messageHub.publish('ui:openWindow', { windowId: 'profiler' }); } }; return (

Performance Monitor

{isConnected && ( )}
{isConnected ? ( <> Connected ) : isServerRunning ? ( <> Waiting... ) : ( <> Server Off )}
{!isServerRunning ? (

Profiler server not running

Open Profiler window and connect to start monitoring

) : !isConnected ? (

Waiting for game connection...

Connect to: ws://localhost:{port}

) : (
FPS
{fps}
Frame Time
targetFrameTime ? 'warning' : ''}`}> {totalFrameTime.toFixed(1)}ms
Entities
{entityCount}
Components
{componentCount}
{systems.length > 0 && (

Top Systems

{systems.map((system) => (
{system.name} {system.executionTime.toFixed(2)}ms
targetFrameTime ? 'var(--color-danger)' : system.executionTime > targetFrameTime * 0.5 ? 'var(--color-warning)' : 'var(--color-success)' }} />
{system.percentage.toFixed(1)}% {system.entityCount > 0 && ( {system.entityCount} entities )}
))}
)}
)}
); }