将桌面级vr通过vulkan和 ue4移植到移动平台
TRANSCRIPT
平台的差距
3840 x 2160? (1920 x 1080)
60 fps
Adreno 530
Multi-view?
Mobile Forward Renderer
Vulkan?
2160 x 1200
90 fps
GTX 970
Instanced Stereo
Deferred Renderer
DX11
关于Vulkan• Vulkan是用来替代OpenGL和OpenGL ES的下一代图形API
• 由Khronos领头,整个行业共同参与打造
• 开放,跨平台,支持PC、主机和移动设备
• 提供更底层轻度的,更高效的接口
• 考虑了现代图形硬件而设计
• 以SPIR-V格式作为shader预编译的中间格式
ES2/3.2 vs VulkanOpenGL:如果compile出错,在运行时会crash做绘制调用的时候会有hitch,驱动只在第一次绘制时才真的编译
Vulkan:可离线编译shader
在开发时可编译成SPIR-V二进制数据
所有shader的验证都在离线时完成
所有上层的shader优化都在离线时完成
ES2/3.2 vs VulkanOpenGL:
Set vertex and pixel shaders
Shader uniform parameters
Bound textures
Set blending states
Set depth states
Set rasterizer states
Etc…
Vulkan:
把这些属性和状态都封装在一个对象中
切换不同的状态相当高效!
ES2/3.2 vs VulkanVulkan有显式的RenderPass
vkBeginRenderPass(...)vkEndRenderPass(...)
每个render pass可以指定哪些数据需要load到tile memory里,哪些数据需要存回framebuffer
准备工作硬件:Galaxy S7(latest rom), Nexus 6P(Android N)?
SDK:Vulkan, ndk
UE4: 4.13
当前数据:
800+ drawcall
120w+ triangles
准备工作简单定位瓶颈:
1. stat unit – gpu
降低渲染分辨率:MobileContentScaleFactor = 1.0 (1080p) / 0.8 (720p)
快速用工具减面做测试
用mip setting降低贴图尺寸,降低gpu带宽占用
2. stat dumpave –ms=1 || stat startfile/stop file
发现game线程时间过长,profile确定render thread没开
3. RenderThread瓶颈
合并和简化场景mesh