渲染优化 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才有的问题?

转载于:https://www.cnblogs.com/lancidie/archive/2011/05/22/2053342.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/548906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 共享盘cifs、nfs

linux 共享盘cifs、nfs 1、安装并启用nfs服务 #安装nfs并启用相关服务 yum install -y rpcbind nfs-utils systemctl start rpcbind systemctl start nfs-server#创建本地nfs文件夹 mkdir -p /data/nfs/d{1..4} [rootlocalhost ~]# vim /etc/exports /data/nfs/d1 *(rw,sync…

选出你最喜欢的Linux操作系统吧

做一份调查&#xff0c;你最喜欢的LINUX版本是什么&#xff1f;有何优点&#xff1f; 为什么使用它&#xff1f;说出一二个优点哈。Redhat/Fedora SUSE Debian Mandriva Ubuntu RedFlag Asianux CentOS Gentoo Others希望大家能发表自己的意见~~说出各自的优点。转载于:https:…

linux 运维最常用命令大全

linux 运维最常用命令大全 1、帮助命令 man&#xff1a;全拼manual&#xff0c;用来查看系统中自带的各种参考手册。 help&#xff1a;用于显示shell内部命令的帮助信息。 2、文件和目录操作命令 ls&#xff1a;全拼list&#xff0c;列出目录的内容及其内容属性信息。 cd…

PHP学习——定界符格式引起的错误

下面是一个错误的代码&#xff0c;能看出哪里出错了么&#xff1f;&#xff1f;对于我这个初学者什么都是蒙蒙懂的&#xff0c;真的无从下手&#xff0c;但是真的要自己尝试了才知道哪里错了&#xff0c;书和教程都不会告诉我哪里错了 错误代码&#xff1a;Parse error: syntax…

K8S初学命令

K8S初学命令 1、pod常用命令 作用命令查看pod节点kubectl get pod查看所有pod节点kubectl get pods -A查看pod节点详情kubectl get pod -o wide查看所有名称空间下的podkubectl get pod --all-namespaces根据yaml文件创建podkubectl apply -f <文件名称>根据yaml文件删…

SBO错误提示总帐科目缺失解决方法

检查&#xff1a; 管理-定义-财务-总帐科目确认的收入标签中的应收和收入科目是否设置&#xff1b; 库存标签中的总帐科目设置是否完全&#xff1b; 如果没问题再检查业务伙伴主数据的应收科目是否设置&#xff1b; 如果有舍入还要检查总帐科目确认中的舍入科目是否设置。 如果…

k8s常用命令总结

k8s常用命令 #查看所有namespace的pods运行情况 kubectl get pods --all-namespaces #查看具体pods&#xff0c;记得后边跟namespace名字哦 kubectl get pods kubernetes-dashboard-76479d66bb-nj8wr -n kube-system # 查看pods具体信息 kubectl get pods -o wide kubernete…

iphone开发之私有库private frameworks

https://github.com/kennytm/iphone-private-frameworks Headers for private frameworks or undocumented interfaces of iPhoneOS 3.x or before (4.x is not supported yet). class dump出来的头文件&#xff0c;包含apple没有开放的json库&#xff0c;SpringBoard&#xf…

sed修改网卡配置

sed -i -e s/192.168.10.10/192.168.66.10/ -e s/192.168.10.1/192.168.66.1/ /etc/sysconfig/network-script/ifcfg-ens33

iphone开发之C++和Objective-C混编

C和Objective-C混编&#xff08;官方文档翻译&#xff09; 原文网址&#xff1a; http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html Using C With Objective-C 苹果的Objective-C编译器允许用户在同一个源文件…

sed多个替换选项

sed -i -e s/192.168.10.10/192.168.66.10/ -e s/192.168.10.1/192.168.66.1/ /etc/sysconfig/network-script/ifcfg-ens33sed -i -e s/192.168.10.10/192.168.66.10/&#xff1b; s/192.168.10.1/192.168.66.1/ /etc/sysconfig/network-script/ifcfg-ens33

PHP之数组学习

对于网页编程来说&#xff0c;最重要的就是存取和读写数据了。存储方式可能有很多种&#xff0c;可以是字符串、数组、文件的形式等&#xff0c;今天学习了数组&#xff0c;可以说是PHP的数据应用中较重要的一种方式。PHP的数组函数众多&#xff0c;下面是我学习的小结&#xf…

centos 彻底卸载软件包(含依赖)并解决安装冲突包问题

centos 彻底卸载软件包&#xff08;含依赖&#xff09;并解决安装冲突包问题 1、查看yum操作事务 [rootlocalhost ~]# yum history list 或 yum history Loading "fastestmirror" plugin Config time: 0.007 Yum version: 3.4.3 ID | Login user …

mysql Error 1045(28000)

2019独角兽企业重金招聘Python工程师标准>>> 在windows操作系统安装mysql数据库&#xff0c;碰到Error 1045(28000) Access Denied for user rootlocalhost (Using password:NO)错误时&#xff0c;你需要重新设置密码。 具体方法是&#xff1a; 1.先在安装目录找到m…

linux将上一条命令的结果作为下一条命令的参数

linux将上一条命令的结果作为下一条命令的参数 1、xargs [rootlocalhost test]# touch test{1..10}.txt [rootlocalhost test]# ls test10.txt test1.txt test2.txt test3.txt test4.txt test5.txt test6.txt test7.txt test8.txt test9.txt [rootlocalhost test]# …

linux代码、数据库备份

1、linux代码备份脚本 #!/bin/bash #指定运行的脚本shell #运行脚本要给用户执行权限 bakdir/bakdir/web monthdate %m daydate %d yeardate %Y hourdate %k mindate %M dirname$year-$month-$day-$hour-$min gzupload$year-$month-$day-$hour-$min-www.tgz cd /opt/www tar -z…

linux搭建ftp虚拟用户服务器

linux搭建ftp虚拟用户服务器 1 安装服务 #1、安装ftp服务 [rootlocalhost ~]#yum install -y vsftpd ftp #2、关闭防火墙 [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config [rootlocalhost ~…

给你的博客添加个看电影的频道

PPTV新推出一个Silverlight版PPTV在线剧场&#xff0c;里面电影电视剧和PPTV 软件端同步&#xff0c;只需安装Silverlight软件&#xff0c;即可在线观看。PPTV剧场版网址 为COOL.PPTV.COM &#xff0c;使用iframe代码&#xff0c;嵌入到页面中&#xff0c;给博客网站增加 一个在…

docker inspect命令详解

docker inspect命令详解 1、作用 获取容器/镜像的元数据(JSON格式) 2、语法格式 docker inspect [OPTIONS] NAME|ID [NAME|ID...] -f 指定返回值的模板文件 -s 如果类型为容器&#xff0c;则显示文件总大小 --type 返回指定类型的JSON3、实际例子 #获取容器 IP docker ins…

redhat linux配置RSH遇见的问题

在配置informix HDR时&#xff0c;由于需要配置2台机器的可信任关系&#xff0c;结果就在这过程中停顿了好一阵&#xff0c;现在将问题记录下来&#xff0c;供以后参考1.检查是否安装相关软件包# rpm -qa|grep rshrsh-server-0.17-40.el5rsh-0.17-40.el52.检查服务是否开启# ch…