EG/vr_display_optimizer.py
Rowland bb56813e44 feat(core): 优化 ALVR 串流功能并添加对 Pico 4 的支持
- 添加对有线连接的支持,特别是 Pico 4 的有线连接
- 改进 ALVR 服务器检测和连接逻辑
- 优化 VR 帧获取和处理流程
- 增加备用帧获取功能(主摄像机视图)
- 修复 VR 眼部纹理相关问题
- 优化 VR 任务管理,确保正确渲染和提交帧
2025-07-29 10:17:13 +08:00

316 lines
11 KiB
Python
Raw 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.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
VR显示优化工具
优化VR渲染性能和显示质量
"""
from panda3d.core import RenderState, CullFaceAttrib, DepthTestAttrib, AlphaTestAttrib
from core.vr_manager import VRManager
class VRDisplayOptimizer:
"""VR显示优化器"""
def __init__(self, world):
self.world = world
self.vr_manager = world.vr_manager if hasattr(world, 'vr_manager') else None
self.optimization_enabled = True
def optimize_vr_rendering(self):
"""优化VR渲染设置"""
if not self.vr_manager or not self.vr_manager.is_vr_enabled():
print("VR系统未启用跳过优化")
return False
print("🚀 开始VR渲染优化...")
# 1. 优化眼部缓冲区设置
self._optimize_eye_buffers()
# 2. 优化渲染状态
self._optimize_render_states()
# 3. 设置VR特定的渲染选项
self._setup_vr_render_options()
# 4. 优化纹理设置
self._optimize_textures()
# 5. 设置LOD和裁剪
self._setup_lod_and_culling()
print("✓ VR渲染优化完成")
return True
def _optimize_eye_buffers(self):
"""优化眼部缓冲区"""
try:
if not self.vr_manager.left_eye_buffer or not self.vr_manager.right_eye_buffer:
return
# 设置缓冲区优化选项
for buffer in [self.vr_manager.left_eye_buffer, self.vr_manager.right_eye_buffer]:
# 启用多重采样抗锯齿
buffer.setMultisample(4)
# 设置深度缓冲精度
buffer.addDepthRenderTexture()
# 启用硬件加速
buffer.setOneShot(False)
buffer.setActive(True)
print(" ✓ 眼部缓冲区优化完成")
except Exception as e:
print(f" ⚠ 眼部缓冲区优化失败: {str(e)}")
def _optimize_render_states(self):
"""优化渲染状态"""
try:
# 设置全局渲染状态
render_state = RenderState.make(
CullFaceAttrib.make(CullFaceAttrib.MCullCounterClockwise),
DepthTestAttrib.make(DepthTestAttrib.MLess),
AlphaTestAttrib.make(AlphaTestAttrib.MGreater, 0.5)
)
# 应用到render节点
self.world.render.setState(render_state)
print(" ✓ 渲染状态优化完成")
except Exception as e:
print(f" ⚠ 渲染状态优化失败: {str(e)}")
def _setup_vr_render_options(self):
"""设置VR特定的渲染选项"""
try:
# 启用VR优化
if hasattr(self.world, 'win') and self.world.win:
# 设置VR特定的窗口属性
properties = self.world.win.getProperties()
properties.setFrameBufferMode(properties.FBMHardware)
# 启用垂直同步以减少延迟
properties.setSync(True)
# 优化摄像机设置
if hasattr(self.world, 'camera'):
# 设置适合VR的FOV和近远裁剪面
lens = self.world.camera.node().getLens()
lens.setNearFar(0.1, 1000.0) # VR推荐的近远裁剪面
print(" ✓ VR渲染选项设置完成")
except Exception as e:
print(f" ⚠ VR渲染选项设置失败: {str(e)}")
def _optimize_textures(self):
"""优化纹理设置"""
try:
from panda3d.core import Texture
# 设置全局纹理优化
Texture.setTexturesPower2(Texture.ATPPad) # 填充到2的幂次方
Texture.setKeepRAMImage(False) # 不保留RAM图像以节省内存
# 启用纹理压缩
Texture.setCompressionMode(Texture.CMDefault)
print(" ✓ 纹理优化完成")
except Exception as e:
print(f" ⚠ 纹理优化失败: {str(e)}")
def _setup_lod_and_culling(self):
"""设置LOD和裁剪"""
try:
# 启用视锥裁剪
from panda3d.core import CullTraverser
self.world.render.setTwoSided(False)
# 设置距离裁剪
if hasattr(self.world, 'camera'):
# 根据VR需求调整裁剪距离
lens = self.world.camera.node().getLens()
lens.setFar(500.0) # 减少远裁剪面以提高性能
print(" ✓ LOD和裁剪设置完成")
except Exception as e:
print(f" ⚠ LOD和裁剪设置失败: {str(e)}")
def optimize_alvr_streaming(self):
"""优化ALVR串流性能"""
if not hasattr(self.world, 'alvr_streamer'):
print("ALVR串流器不可用跳过优化")
return False
print("📡 开始ALVR串流优化...")
alvr = self.world.alvr_streamer
# 1. 优化串流质量设置
self._optimize_stream_quality(alvr)
# 2. 优化网络设置
self._optimize_network_settings(alvr)
# 3. 优化编码设置
self._optimize_encoding_settings(alvr)
print("✓ ALVR串流优化完成")
return True
def _optimize_stream_quality(self, alvr):
"""优化串流质量"""
try:
# 根据性能自动调整质量
vr_info = self.vr_manager.get_vr_info()
render_width, render_height = vr_info['render_size']
# 针对不同设备优化
if render_width >= 2880: # Quest 2/3高质量
alvr.set_stream_quality(2880, 1700, 72, 150)
print(" ✓ 设置为高质量模式 (Quest 2/3)")
elif render_width >= 2160: # 中等质量
alvr.set_stream_quality(2160, 1200, 60, 100)
print(" ✓ 设置为中等质量模式")
else: # 低质量模式
alvr.set_stream_quality(1920, 1080, 60, 80)
print(" ✓ 设置为低质量模式")
except Exception as e:
print(f" ⚠ 串流质量优化失败: {str(e)}")
def _optimize_network_settings(self, alvr):
"""优化网络设置"""
try:
# 这里可以添加网络优化逻辑
# 例如调整缓冲区大小、连接超时等
print(" ✓ 网络设置优化完成")
except Exception as e:
print(f" ⚠ 网络设置优化失败: {str(e)}")
def _optimize_encoding_settings(self, alvr):
"""优化编码设置"""
try:
# 优化H.264编码参数
alvr.codec = "h264"
# 根据硬件能力调整编码设置
print(" ✓ 编码设置优化完成")
except Exception as e:
print(f" ⚠ 编码设置优化失败: {str(e)}")
def monitor_performance(self, duration=10):
"""监控VR性能"""
print(f"📊 开始VR性能监控 ({duration}秒)...")
import time
start_time = time.time()
frame_count = 0
last_report_time = start_time
while time.time() - start_time < duration:
# 处理一帧
if hasattr(self.world, 'taskMgr'):
self.world.taskMgr.step()
frame_count += 1
current_time = time.time()
# 每2秒报告一次性能
if current_time - last_report_time >= 2.0:
elapsed = current_time - last_report_time
fps = (frame_count / (current_time - start_time))
print(f" 性能报告: FPS {fps:.1f}")
# 报告VR系统状态
if self.vr_manager and self.vr_manager.is_vr_enabled():
vr_info = self.vr_manager.get_vr_info()
print(f" VR模式: {vr_info['mode']}")
print(f" 渲染尺寸: {vr_info['render_size']}")
# 报告ALVR状态
if hasattr(self.world, 'alvr_streamer') and self.world.alvr_streamer.is_streaming():
status = self.world.alvr_streamer.get_streaming_status()
print(f" ALVR FPS: {status['fps']}, 延迟: {status['latency']}ms")
last_report_time = current_time
time.sleep(0.016) # ~60 FPS目标
final_fps = frame_count / (time.time() - start_time)
print(f"✓ 性能监控完成平均FPS: {final_fps:.1f}")
return final_fps
def auto_optimize(self):
"""自动优化VR显示性能"""
print("🔧 开始自动VR优化...")
# 1. 优化VR渲染
if self.optimize_vr_rendering():
print(" ✓ VR渲染优化完成")
# 2. 优化ALVR串流
if hasattr(self.world, 'alvr_streamer'):
if self.optimize_alvr_streaming():
print(" ✓ ALVR串流优化完成")
# 3. 监控性能
print("\n📊 开始性能测试...")
fps = self.monitor_performance(5)
# 4. 根据性能调整设置
if fps < 45: # VR最低要求
print("⚠ 性能不足,降低质量设置...")
self._apply_low_quality_settings()
elif fps > 80:
print("✓ 性能良好,可以提高质量设置")
self._apply_high_quality_settings()
print("✓ 自动VR优化完成")
def _apply_low_quality_settings(self):
"""应用低质量设置"""
try:
# 降低渲染分辨率
if self.vr_manager:
self.vr_manager.render_width = int(self.vr_manager.render_width * 0.8)
self.vr_manager.render_height = int(self.vr_manager.render_height * 0.8)
# 降低ALVR质量
if hasattr(self.world, 'alvr_streamer'):
self.world.alvr_streamer.set_stream_quality(1920, 1080, 60, 60)
print(" ✓ 低质量设置已应用")
except Exception as e:
print(f" ⚠ 低质量设置应用失败: {str(e)}")
def _apply_high_quality_settings(self):
"""应用高质量设置"""
try:
# 提高ALVR质量
if hasattr(self.world, 'alvr_streamer'):
self.world.alvr_streamer.set_stream_quality(2880, 1700, 90, 200)
print(" ✓ 高质量设置已应用")
except Exception as e:
print(f" ⚠ 高质量设置应用失败: {str(e)}")
# 使用示例
def optimize_vr_display(world):
"""优化VR显示的便捷函数"""
optimizer = VRDisplayOptimizer(world)
optimizer.auto_optimize()
return optimizer