http://blog.163.com/ding_liang1989/blog/static/168788329201362005946890/

本文所针对的OGRE版本为1.65,因为本人目前公司项目使用这个版本。

本文所讲述的内容是不改变任何渲染流程,直接从最底层Direct3D API 调用上去抠OGRE的性能。

1、Shader参数的分类。这一点在后续版本中做了,但是在1.65版本中是没有的。通常来说,同一个Shader的参数可以分为以下几种:全局常量(值被手动改变或者切Shader的时候传),物件常量(一个DrawCall传一次),Light常量(一个光源传一次),这种分类能最大化利用目前网游开发需要的Shader,OGRE后续版本中加上的分类还多了一个Pass常量(用同一个Shader画一个物件多次,每画一次传一次),用于多Pass光照。传Shader参数的API是很耗时的,而且像光照之类的Shader,需求的参数又非常多,在OGRE1.65中,每个批次都要传将全部的参数传一次,这是非常耗时的,所以要将这部分代码从后续版本中移植过来。
1.5、新版本的做法其实严格来说也有一定缺陷,在切换Shader时,会传所有的GPU参数,更具体的说,切换了VS,却要去更新全部的PS参数,这显然是不合理的,这部分需要自己改进。
2、频繁的Shader切换。OGRE在调用SetXXXShader API时是没有cache机制的,也就是说,无论当前要设置的Shader和上一次设置的Shader是否相同,都会在每个批次设置一次,而SetXXXShader又是非常耗时的,且会导致所有GPU参数的传递。解决方法是根据名字判断一下,和上一次的不一样才Set。
3、SetRenderState之前会调用GetRenderState来做cache,这样比缓存一个值要慢。
4、过于简单的材质排序。OGRE的材质排序只考虑了pass的顺序和前两张贴图,对于渲染状态是一点都不顾及。一个32位的hash,pass占了4位,也就是说最多支持11个Pass,如果光照处理采用的是单Pass光照,对于物件的渲染最多2个Pass就够了,绝大多数都只需要一个Pass。所以Pass我给了1位,空出3位来可以随便根据项目具体情况找几个开销最大的状态来考虑进去,本人的做法是先把hash位数提高到64位,考虑Pass-Shader-Texture-State。
5、频繁的VertexDeclartion切换。同屏画几百个批次,顶点声明就那么几种,而OGRE的做法是每次渲染都调用SetVertexDeclartion API,而这个API是很耗时的,所以需要cache一下。
6、频繁的顶点/索引Buffer切换。如果同一个Mesh连续画一百个批次,OGRE会SetStreamSource/SetIndice一百次,如果顶点分流,还会成倍增长,而这两个API都是很耗时的,所以同样需要cache一下。
7、虽然cache了Texture,但Texture相关的StageState和SamplerState都没有cache,使得按纹理排序获得的收益降低,需要cache一下,与RenderState一样,自己cache,去掉调用API的Get函数。
以上这些是本人最近两天做优化的总结,大部分都是由于没有cache而造成的不必要的DX API调用。

OGRE针对图形API调用的效率优化相关推荐

  1. 加速 VR 渲染地狱难度进阶篇:降低图形 API 调用次数

    准备好,中文互联网终于有人开始严肃地讨论 VR 技术了.纯干货文章,直奔主题. VR 渲染的难点是什么? 左眼和右眼看到的场景是不同的,因此同样的 API 需要调用两次.以 Oculus DK2 为例 ...

  2. 针对虚幻3引擎渲染底层的效率优化

    http://blog.163.com/ding_liang1989/blog/static/168788329201310215359777/ 本人新公司的项目用的是虚幻3引擎,终于有幸观摩一下国外 ...

  3. python 笔记 PySimpleGUI 图形界面6- 高级API调用-进度表控件、调试输出

    整理 PySimpleGUI 官方网站 原文google翻译过来的 https://pysimplegui.readthedocs.io/en/latest/ 高级API调用 进度表控件 我们的代码中 ...

  4. 有生之年转ta系列4pc手机图形api介绍

    本文内容来自 [技术美术百人计划]图形 1.4 PC手机图形API介绍 观后记录 美术岗位代码或者算法一类的问题可能不太懂 本文仅用来记录学习,如果有不对的请指出谢谢 图形部分 第一章 4纹理基础 前 ...

  5. [引擎开发] 现代图形API - dx12篇

    本文将从性能优化的角度去阐述像dx12这样的现代图形API的一些设计理念. 当我们深入优化渲染管线的时候,我们会发现存在的几个瓶颈主要是这样的: ① 线程存在不合理的等待 ② CPU向GPU编码传输数 ...

  6. .NET Framework 中新托管 Direct3D 图形 API 的简介

    .NET Framework 中新托管 Direct3D 图形 API 的简介 发布日期: 12/6/2004 | 更新日期: 12/6/2004 Yahya H. Mirza 和 Henry da ...

  7. 腾讯云EMR基于YARN针对云原生容器化的优化与实践

    导语 | 传统HADOOP生态系统使用YARN管理/调度计算资源,该系统⼀般具有明显的资源使⽤周期.实时计算集群资源消耗主要在⽩天,而数据报表型业务则安排在离线计算集群中.离在线业务分开部署的首要问题 ...

  8. Unity3d代码及效率优化总结

    1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU. 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unli ...

  9. [图形]图形API的两种模式

    图形API可以分为retained-mode APIs(保存模式API)和immediate-mode APIs(中间模式API). Direct2D是immediate-mode API,而Wind ...

最新文章

  1. 总结八个好用的Python爬虫技巧
  2. Eclipse和MyEclipse自动提示设置
  3. JSP脚本实现登录验证功能
  4. 浅谈CruiseControl的部署
  5. [SecureCRT]通过SFTP方式上传本地文件到服务器
  6. ViP解读:视觉MLP结构新作
  7. tf.placeholder()
  8. Struts2中的全局结果集
  9. htaccess 实现网址缩短
  10. SpringBoot使用RestTemplate 摘要认证
  11. indesign图片规定在左下角_InDesign如何为目录模板设置母版
  12. wpf DoEvents 用法原理存在的坑推荐方法
  13. docker卸载mysql_Docker卸载镜像
  14. mc服务器fabric安装位置,也许这是史上最详细的Fabric安装教程,助你在1.14/1.15安装mod...
  15. 必备装机软件,软件推荐
  16. php 正方,php 模拟登陆正方教务系统
  17. maven LTDM 部署前台Tomcat 各种折腾---自己总结经验
  18. 【STM32】关于Clion+STM32cubeMX环境搭建过程中所遇到的一些问题·其一
  19. Opencv+ZBar识别条形码、二维码
  20. ansible部署LAMP架构

热门文章

  1. 数组小案例(求数组最大最小值、反转数组中元素、指定元素第一次出现的索引)
  2. python多线程详解_Python多线程详解
  3. 主板电源开关接口图解_组装电脑时主板跳线如何接?DIY装机主板接线教程
  4. webpack打包压缩混淆_细说webpack系列 3. webpack-cli 零配置打包
  5. python哲学内容是_Python哲学(import this)
  6. python实现接口自动化的视频_python实现头条项目接口自动化测试实战
  7. mpython 直接访问_python -mSimpleHTTPServer 开启一个简单的http服务器,可传输文件
  8. mysql asp.net core_基于 ASP.NET Core 2.0 WebAPI 后台框架搭建(2) - EF Core (MySQL) CodeFirst 数据库迁移与依赖注入...
  9. JS有哪些数据类型?
  10. Idea导入web工程,并运行