1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
| private gl: WebGLRenderingContext | WebGL2RenderingContext; private currentQualityLevel: number = 2; private qualitySettings: QualitySettings[]; interface QualitySettings { level: number; name: string; renderScale: number; textureQuality: number; shaderComplexity: 'simple' | 'medium' | 'complex'; postProcessing: boolean; shadowQuality: 'none' | 'low' | 'medium' | 'high'; maxLights: number; anisotropicFiltering: number; msaa: boolean; } interface PerformanceMetrics { frameTime: number; gpuTime: number; memoryUsage: number; thermalState: 'normal' | 'fair' | 'serious' | 'critical'; batteryLevel: number; } constructor(gl: WebGLRenderingContext | WebGL2RenderingContext) { this.gl = gl; this.performanceMonitor = new PerformanceMonitor(); this.initializeQualitySettings(); this.startAdaptiveMonitoring(); } private initializeQualitySettings(): void { this.qualitySettings = [ level: 0, name: '性能优先', renderScale: 0.5, textureQuality: 0.25, shaderComplexity: 'simple', postProcessing: false, shadowQuality: 'none', maxLights: 1, anisotropicFiltering: 1, msaa: false }, level: 1, name: '平衡模式', renderScale: 0.75, textureQuality: 0.5, shaderComplexity: 'medium', postProcessing: false, shadowQuality: 'low', maxLights: 2, anisotropicFiltering: 2, msaa: false }, { level: 2, name: '质量优先', renderScale: 1.0, textureQuality: 1.0, shaderComplexity: 'complex', postProcessing: true, shadowQuality: 'medium', maxLights: 4, anisotropicFiltering: 4, msaa: true } ]; } private startAdaptiveMonitoring(): void { setInterval(() => { this.updateQualityBasedOnPerformance(); }, 2000); } private updateQualityBasedOnPerformance(): void { const metrics = this.performanceMonitor.getCurrentMetrics(); const newQualityLevel = this.calculateOptimalQuality(metrics); if (newQualityLevel !== this.currentQualityLevel) { console.log(`📊 自适应质量调整: ${this.currentQualityLevel} -> ${newQualityLevel}`); this.setQualityLevel(newQualityLevel); } } private calculateOptimalQuality(metrics: PerformanceMetrics): number { let targetQuality = this.currentQualityLevel; targetQuality = Math.max(0, targetQuality - 1); } else if (metrics.frameTime < 13 && targetQuality < 2) { } if (metrics.memoryUsage > 0.8) { targetQuality = Math.max(0, targetQuality - 1); } targetQuality = 0; if (metrics.batteryLevel < 0.2) { targetQuality = Math.max(0, targetQuality - 1); } return targetQuality; } public setQualityLevel(level: number): void { if (level < 0 || level >= this.qualitySettings.length) { console.warn(`无效的质量等�? ${level}`); return; } this.currentQualityLevel = level; const settings = this.qualitySettings[level]; console.log(`🎮 应用质量设置: ${settings.name}`); this.applyRenderSettings(settings); this.applyShaderSettings(settings); this.applyTextureSettings(settings); } private applyRenderSettings(settings: QualitySettings): void { const canvas = this.gl.canvas as HTMLCanvasElement; const displayWidth = canvas.clientWidth; const displayHeight = canvas.clientHeight; const renderWidth = Math.floor(displayWidth * settings.renderScale); const renderHeight = Math.floor(displayHeight * settings.renderScale); if (canvas.width !== renderWidth || canvas.height !== renderHeight) { canvas.width = renderWidth; canvas.height = renderHeight; this.gl.viewport(0, 0, renderWidth, renderHeight); } if (settings.msaa && this.gl instanceof WebGL2RenderingContext) { this.gl.enable(this.gl.SAMPLE_COVERAGE); } else { this.gl.disable(this.gl.SAMPLE_COVERAGE); } console.log(`📐 渲染设置: ${renderWidth}x${renderHeight}, MSAA: ${settings.msaa}`); } public generateQualityReport(): string { const currentSettings = this.qualitySettings[this.currentQualityLevel]; const metrics = this.performanceMonitor.getCurrentMetrics(); let report = '📱 移动端质量报告\n'; report += '=' * 30 + '\n'; report += `当前质量等级: ${currentSettings.name} (${this.currentQualityLevel})\n`; report += `渲染分辨�? ${(currentSettings.renderScale * 100).toFixed(0)}%\n`; report += `纹理质量: ${(currentSettings.textureQuality * 100).toFixed(0)}%\n`; report += `着色器复杂�? ${currentSettings.shaderComplexity}\n`; report += `后处�? ${currentSettings.postProcessing ? '开�? : '关闭'}\n`; report += `阴影质量: ${currentSettings.shadowQuality}\n`; report += `最大光源数: ${currentSettings.maxLights}\n\n`; report += '📊 性能指标:\n'; report += `帧时�? ${metrics.frameTime.toFixed(2)}ms\n`; report += `GPU时间: ${metrics.gpuTime.toFixed(2)}ms\n`; report += `内存使用: ${(metrics.memoryUsage * 100).toFixed(1)}%\n`; report += `热状�? ${metrics.thermalState}\n`; report += `电池电量: ${(metrics.batteryLevel * 100).toFixed(0)}%\n`; return report; } }
|