variable rate shading
conditional render
设置可见性等, 不需要重新build command buffer
indirect draw
glMultiDraw* - 直接支持多次绘制
glMultiDrawIndirect - 间接多次绘制
multithreading
多线程录制
实例化渲染
lod
texture array
小对象剔除
投影到屏幕上的对象太小就不绘制
texture gather
一次能采样4个像素, 减少采样函数调用
texture shadow 版本
由于返回的是浮点数,能减少采样的调用
在GLSL中,使用 #pragma unroll 指令来建议编译器展开循环
循环展开不是性能优化的万能解
需要根据具体场景和硬件特性评估
建议进行实际性能测试
考虑代码可维护性和可读性
现代GPU编译器已经相当智能,可能自动进行优化
texture altas
使用建议:
适用场景:
大量小纹理(如UI元素、图标)
需要批量渲染的2D游戏
粒子系统
不适用场景:
大型独立纹理
需要频繁更新的纹理
分辨率差异很大的纹理
最佳实践:
合理分组相关纹理
预留适当padding
考虑mipmap需求
监控内存和性能指标
总结:
Texture Atlas能带来显著的性能优势,主要体现在:
减少状态切换和draw calls
提高内存访问效率
更好的缓存利用
减少内存碎片
但需要合理使用并注意相关限制和实现细节。
合并draw call
内存池和cache 命中率
纹理压缩
/ 使用压缩纹理格式
VkFormat compressedFormat = VK_FORMAT_BC7_SRGB_BLOCK;
createTexture(compressedFormat, width, height);