渲染优化 lock unlock
昨天参加了公司组织的nvdia的培训,讲了一些关于D3D的优化和可能的瓶颈所在,具体的条目就不说了,这里说一些关于资源的Lock和Unlock,以及我在GL下的测试。
老师讲到向Draw*这类函数是将其指令放入指令队列,带填满后或者强制刷新时交给显卡去画,也就是说它并不是即时的,而像对资源的Lock和Unlock确是即时的操作,而且cpu和gpu是并行计算的,当lock的资源正是当前gpu正在使用的资源会导致lock堵塞直到gpu使用完后才返回,也就是说不当的使用lock会造成cpu等待gpu的情形。当然D3D的lock函数有一个标记用来告诉lock是否立即返回,使用这个标记后lock会立即返回,并且拿到资源地址,此时cpu如果向该地址写入新的数据,但gpu也正在使用之,则将出现不可预知的效果。比如lock下一个文理并填入新的数据,此时gpu正使用该纹理进行渲染,则使用该纹理渲染出来东西的纹理将是乱的。
我用OpenGL并且一直使用这么一种方式来管理顶点Buffer和索引Buffer(见下面的描述),但从没考虑过上面的提到的lock造成的堵塞,当然我用的是OpenGL,但我想Lock这个机制应该是驱动或者显卡那一级的事情,D3D和GL都应该存Lock的问题。
我这里所谓的管理顶点Buffer和索引Buffer的方式是这样的。考虑这么一种情况,当场景中那些粒子也好,动画也好,比较多的时候,我们要每个都给他们在显卡上单独分配顶点缓冲和索引缓冲,毕竟他们的数据是不同的,而且每贞都有变化,即便是使用同一个动画的角色,在同一时刻也不一定在播放同一贞,这带来一个问题,当场景中此类对象很多时将占用很多的显村,且很难控制量,毕竟在引擎这个层面无法知道游戏中到底需要摆放多少个角色,显卡到底有多少空间可供分配等等。我采用的方式是在引擎启动之初就再显卡上分配一个65535个顶点缓冲和65535个索引缓冲,所有需要动态更新顶点Buffer和索引Buffer都填入该缓冲内,并在填充完毕后调用渲染方法。伪代码如下
for (int indexMesh = 0; indexMesh < 100; indexMesh++)
{
vertex *pv = lock(); // 从共享Buffer中获得
{
for (int indexVertex = 0; indexVertex < 1024; indexVertex++)
{
pv[indexVertex] = position;
// ...
}
}
unlock(pv);
Render();
}
如果按照之前提到的Lock会被阻塞和数据交叉的问题,那么这么做将会出现效率下降,更严重的是会出现数据混乱的问题,或者画的是最后一次填充的数据。
但是在实际使用和测试中发现这并没有任何问题,首先说一下效率,lock和unlock只消耗0.025毫秒(当然这个和我提交的数据量关系),渲染几乎没有消耗(一共渲染10万左右个面,显卡是nv8600gt)。而数据也没有出现任何混乱。我没有A卡,没办法进行相关测试。
莫非Lock,unLock这个真的是D3D9才有的问题?
渲染优化 lock unlock相关推荐
- dx9 lock unlock效率太低_synchronized的缺陷,Lock的诞生
一.前言 二.synchronized局限性 + Lock锁机制的引入 2.1 synchronized局限性 第一,使用synchronized,其他线程只能等待直到持有锁的线程执行完释放锁(syn ...
- Lock/Unlock Account - Active Directory
根据IsAccountLocked属性来判断Account是否Lock/Unlock,因为LDAP provider不支持IsAccountLocked属性,这里采用WinNT Provider:(注 ...
- 为什么await()后会执行lock.unlock,await()时不就释放锁了吗
为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...
- 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...
- 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )
文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...
- 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )
文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...
- (三)渲染优化 (与浏览器为友,共进退)
渲染优化 浏览器渲染原理和关键渲染路径 浏览器的渲染流程 1.浏览器构建对象模型(两棵树) 2.浏览器构建渲染树 回流与重绘, 如何避免布局抖动 Layout(布局)与Paint(绘制) 影响回流的操 ...
- 图片渲染延迟_2D Canvas 的渲染优化
简介 HTML 上的图形渲染主要有两种方案 SVG 和 Canvas,前者更易于使用,而后者潜力更大,本文主要关注如何使用 Canvas 绘制出更多的图形,提供更加流畅的交互.本文的内容有: 渲染机制 ...
- 针对大数据量的渲染优化库:react-virtual的基本使用
针对大数据量的渲染优化库:react-virtual的基本使用 针对大数据量的渲染优化库:react-virtual(List)的基本使用 react-virtual库的安装及引用 安装 使用 针对大 ...
最新文章
- vim+cscope+ctags打造属于自己的IDE
- Android---组件篇---Handler的使用(1)[转]
- Oracle 12C 新特性之级联truncate
- linux ftp解压命令 cannot fid or open,Linux环境搭建及常用shell命令集锦
- Hibernate一对一映射示例注释
- shell 循环删除进程
- delphi中griddata控件写入float数值_年中巨献!明道云发布多项重磅功能
- Juniper srx系列防火墙端口限速
- 从技术角度看人人网,互联网营销
- hadoop2.6---常用命令
- java度分秒转换度
- 计算机网络(四)—— 网络层(1、2):网络层概述、网络层提供的两种服务
- 删除文件夹需要管理员权限的解决方法
- 中职计算机应用专业核心素养的,基于职业发展的中职学生核心素养的研究与培养...
- 虚拟机Linux忘记root用户密码的修复方法
- 5G,上天了!卫星和基站擦出了火花?
- 海康2017校招C++开发岗位笔试题
- android 解锁过程,Android-解锁与刷机(以一加为例)
- 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...
- 关于IPv6(超详细讲解)