Como Funciona
O segredo para a eficiência do WebAP reside na sua modularidade e abordagem matemática. O plugin não tenta "adivinhar" a causa dos atrasos ou reduzir cegamente a resolução da tela.
Todo o sistema opera como um pipeline rigorosamente ajustado consistindo em três camadas principais: Tracker, Indexer e Scalers.
Pipeline de Decisão
A arquitetura do plugin separa estritamente a coleta de dados, a tomada de decisão e a execução.
1. Tracker (Observador)
Em cada frame, o Tracker recolhe dados brutos sobre o tempo do frame e o tempo puro do CPU. Calcula uma Média Móvel Exponencial (Exponential Moving Average) para suavizar picos aleatórios causados pelo Garbage Collector (GC) ou pelo carregamento de assets.
O Tracker não toma decisões; apenas responde a duas perguntas:
- "Estamos a acompanhar o Target Min FPS?"
- "Qual subsistema específico está atualmente atrasado (Gargalo/Bottleneck)?"
2. Indexer (Cérebro)
O Indexer recebe os dados do Tracker e decide como prosseguir. Ele é o árbitro do sistema.
Se os FPS caírem, o Indexer:
- Verifica se o sistema está em Cooldown.
- Avalia o Anti Yo-Yo Penalty System (ver Penalidade Anti Yo-Yo para detalhes).
- Calcula o custo de todos os Scalers disponíveis.
- Emite um comando para o Scaler que produzirá o máximo de desempenho com o mínimo dano visual.
3. Scalers (Executores)
Os Scalers recebem comandos do Indexer e realizam o trabalho pesado. Eles interagem com a API da Unity e aplicam as configurações necessárias (reduzir resolução, ocultar camadas, desativar anti-aliasing).
Gargalos (Bottlenecks): Encontrando Limitações Sem Termômetros
Como o WebAP entende exatamente o que está a falhar ao lidar com a carga sem acesso aos sensores do dispositivo? Analisamos as proporções de timing dentro da própria engine.
- CPU Bottleneck: O Tracker divide o tempo puro da thread principal do processador pelo tempo total do frame. Se este rácio exceder 85%, a conclusão é óbvia. O frame está limitado pela lógica ou cálculos físicos. Diminuir a resolução da tela ou desativar sombras é inútil.
- GPU Bottleneck: Se os FPS globais estiverem abaixo do normal, mas a porção da CPU for inferior a 85%, indica que o processador está ocioso. A placa de vídeo está a falhar em renderizar o frame a tempo (gargalo de Fillrate, shaders complexos ou Overdraw).
- Target Frame Rate: Se o tempo médio de espera do VSync for maior que zero, significa que tanto o processador quanto a placa de vídeo estão terminando a renderização mais rapidamente do que a taxa de atualização do monitor. O sistema opera com Performance Headroom, e o Indexer pode aumentar suavemente a qualidade gráfica.
Zero-GC: Performance Primeiro
Um plugin desenhado para salvar um jogo do lag não tem o direito de ter lag ele próprio. O núcleo do WebAP foi concebido tendo em mente uma rigorosa economia de memória (Zero-GC) ao longo do Hot Path.
- Buffers Circulares O(1): Em vez de
List<float>e loops pesados noUpdate, o Tracker utiliza arrays de tamanho fixo (Ring Buffers). O cálculo médio de FPS é executado em tempo constante. - Zero Alocações no
Update: O núcleo não contém chamadas denew, boxing ou lambdas. Simplesmente não há nada para o Garbage Collector (GC) limpar. - Cache de Delegados: Mesmo para tarefas complexas (interceptando cliques no
WebScaledPhysics2DRaycaster), abandonamos a lenta reflexão (MethodInfo.Invoke) em favor de delegados rápidos compilados.
Invisibilidade
Graças a estas otimizações, o overhead para todo o pipeline do WebAP é mínimo. O seu processador não vai sequer notar que está a ser monitorizado.
