昨天参加了公司组织的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相关推荐

  1. dx9 lock unlock效率太低_synchronized的缺陷,Lock的诞生

    一.前言 二.synchronized局限性 + Lock锁机制的引入 2.1 synchronized局限性 第一,使用synchronized,其他线程只能等待直到持有锁的线程执行完释放锁(syn ...

  2. Lock/Unlock Account - Active Directory

    根据IsAccountLocked属性来判断Account是否Lock/Unlock,因为LDAP provider不支持IsAccountLocked属性,这里采用WinNT Provider:(注 ...

  3. 为什么await()后会执行lock.unlock,await()时不就释放锁了吗

    为什么await()后会执行lock.unlock,await()时不就释放锁了吗 1 是的,释放锁是为了别的线程获得,是为了线程间的通信,是临时释放的,真正满足继续向下执行条件后,被唤醒后获得了锁, ...

  4. 【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )

    文章目录 一. 减少布局嵌套 二. 布局渲染时间测量 1. FrameMetrics 使用流程 2. FrameMetrics 参数解析 3. FrameMetrics 代码示例 三. 布局渲染优化总 ...

  5. 【Android 性能优化】布局渲染优化 ( GPU 过度绘制优化总结 | CPU 渲染过程 | Layout Inspector 工具 | View Tree 分析 | 布局组件层级分析 )

    文章目录 一. GPU 过度绘制优化总结 二. CPU 渲染过程 三. CPU 渲染性能调试工具 Layout Inspector 四. Layout Inspector 组件树 DecorView ...

  6. 【Android 性能优化】布局渲染优化 ( 过渡绘制 | 背景设置产生的过度绘制 | Android 系统的渲染优化 | 自定义布局渲染优化 )

    文章目录 一. 背景设置产生的过度绘制 二. Android 系统的渲染优化 1. 透明组件数据传递 2. GPU 存储机制 3. Android 7.0 之后的优化机制 三. 自定义布局渲染优化 一 ...

  7. (三)渲染优化 (与浏览器为友,共进退)

    渲染优化 浏览器渲染原理和关键渲染路径 浏览器的渲染流程 1.浏览器构建对象模型(两棵树) 2.浏览器构建渲染树 回流与重绘, 如何避免布局抖动 Layout(布局)与Paint(绘制) 影响回流的操 ...

  8. 图片渲染延迟_2D Canvas 的渲染优化

    简介 HTML 上的图形渲染主要有两种方案 SVG 和 Canvas,前者更易于使用,而后者潜力更大,本文主要关注如何使用 Canvas 绘制出更多的图形,提供更加流畅的交互.本文的内容有: 渲染机制 ...

  9. 针对大数据量的渲染优化库:react-virtual的基本使用

    针对大数据量的渲染优化库:react-virtual的基本使用 针对大数据量的渲染优化库:react-virtual(List)的基本使用 react-virtual库的安装及引用 安装 使用 针对大 ...

最新文章

  1. vim+cscope+ctags打造属于自己的IDE
  2. Android---组件篇---Handler的使用(1)[转]
  3. Oracle 12C 新特性之级联truncate
  4. linux ftp解压命令 cannot fid or open,Linux环境搭建及常用shell命令集锦
  5. Hibernate一对一映射示例注释
  6. shell 循环删除进程
  7. delphi中griddata控件写入float数值_年中巨献!明道云发布多项重磅功能
  8. Juniper srx系列防火墙端口限速
  9. 从技术角度看人人网,互联网营销
  10. hadoop2.6---常用命令
  11. java度分秒转换度
  12. 计算机网络(四)—— 网络层(1、2):网络层概述、网络层提供的两种服务
  13. 删除文件夹需要管理员权限的解决方法
  14. 中职计算机应用专业核心素养的,基于职业发展的中职学生核心素养的研究与培养...
  15. 虚拟机Linux忘记root用户密码的修复方法
  16. 5G,上天了!卫星和基站擦出了火花?
  17. 海康2017校招C++开发岗位笔试题
  18. android 解锁过程,Android-解锁与刷机(以一加为例)
  19. 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...
  20. 关于IPv6(超详细讲解)

热门文章

  1. VTK:Shaders之CubeMap
  2. VTK:PolyData之MaskPoints
  3. QDoc清单文件示例
  4. C语言判断二叉树是否为二叉搜索树(附完整源码)
  5. C语言二叉树一个节点的所有祖先节点(附完整源码)
  6. OpenGL绘制二个不同颜色的三角形的实例
  7. OpenGL indirect material间接材料的实例
  8. c++内存,堆和栈的区别
  9. 「Self-driving: Perception」感知总览
  10. Python面向对象,类,继承,多态及鸭子类型,获取类的类型,方法和属性(类似java的反射)