- 添加对有线连接的支持,特别是 Pico 4 的有线连接 - 改进 ALVR 服务器检测和连接逻辑 - 优化 VR 帧获取和处理流程 - 增加备用帧获取功能(主摄像机视图) - 修复 VR 眼部纹理相关问题 - 优化 VR 任务管理,确保正确渲染和提交帧
316 lines
11 KiB
Python
316 lines
11 KiB
Python
#!/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 |