Direct3D 10系统(四)

HP-Socket国产优秀socket通信组件推荐 * HP-Socket 官方网站:http://www.jessma.org * HP-Socket 项目主页:http://www.oschina.net/p/hp-socket * HP-Socket 开发文档:http://www.oschina.net/p/hp-socket/doc *HP-Socket 源代码下载地址:https://github.com/ldcsaa/HP- 阅读详情

Direct3D 10系统(四)  

作者:David Blythe
本文版权归原作者所有,仅供个人学习使用,请勿转载,勿用于任何商业用途。
由于本人水平有限,难免出错,不清楚的地方请大家以原著为准。欢迎大家和我多多交流。
翻译:clayman
Blog:http://blog.youkuaiyun.com/soilwork
5 Core API and Runtime
         我们把 API 和运行时分为了两个独立,但是完整的部分:核心 API/ 运行时以及着色语言 / 状态管理系统。我们将讲述新运行时中几个比较重要的部分,以及与当前系统相比的变化。
         核心 API 以及运行时作为硬件系统上的一个薄抽象层( thin abstraction layer ) , 扮演了 low-overhead 的角色。可编程管线的转变和固定功能冗余功能的移除,戏剧性的简化了 API 和运行时。 API 为以下操作提供服务:分配以及修改资源;创建视图状态并把他们绑定到管线的不同部分;创建 shader 并且把他们绑定到管线;控制管线不可编程部分的状态;初始化渲染操作;通过检索统计( retrieving statistics )或资源内容,从管线中查询信息。
5.1 StateManagement
         我们要解决的主要问题之一,就是减少应用程序到硬件之间传输指令的端到端的消耗。我们把指令分为两类:分配或释放资源的类型,以及改变管线状态的类型。其中,我们特别关心后者,因为他们在应用程序中将频繁出现。我们使用了一个简单的模型,来把这些指令传递给管线。运行时将为应用程序的指令分配一块内存缓冲。每条通过运行时到驱动的 API 指令,都将转变为特定的硬件指令,并储存到这个缓冲里。当缓冲被填满或另一个操作需要同步渲染状态的时候( e.g 读取一个渲染目标的内容),整个缓冲就被提交给硬件。
         在过去 10 年的 PC 系统上,运行时模型几乎没变化。我们的目标是在不需要额外处理的情况下,把指令附加到缓冲中。在过去,这显然是不切实际的,因此,我们尽量了解其中的原因,并且寻找和修改设计方案,让我们的模型接近这个目标。
         我们发现在运行时和驱动两方面,都有一些原因,会带来额外的处理。
l          API 和硬件之间的不匹配
l          延迟处理的风格( deferred processing style )
l          错误传输应用程序请求
         上面三个原因中,第三个是最容易解决的,只要在应用程序开发者,运行时,驱动,以及硬件提供者之间达成一致,就能极大的改善情况( e.g 不是 10% 而是数十倍的提高)。
         第二个问题涉及到传统的实现策略:当图元提交到管线时,分辨哪些状态改变是累积的。这样做的优点是可以成批的处理一组状态的改变,同时,相互独立的(非正交的 non-orthogonal )状态实现可以一起处理,而不是每次处理相关改变中一个独立的状态。他还允许丢弃冗余状态。但是,这些功能都需要占用额外的 CPU 周期来记录改变,并且进行全局控制。非正交的灾难性例子之一,就是纹理绑定的改变,需要重新编译 shader ,以适应新的纹理格式。我们提倡尽可能减少对硬件状态实现的依赖性,把对冗余状态改变的处理,划分到运行时中一个可选的层来处理。
         第一个问题涉及到多种类型的不匹配。重编译 shader 时的正交不匹配 ?? 就是例子之一 (orthogonality mismatches as exemplified by the shader recompile example) ,当然还有很多种其他情况。原因之一与状态改变的粒度( granularity )有关。无论 OpenGL 还是以前的 Direct3D 本版,都把状态改变的粒度定义的非常精细( fine granularity ), e.g ,改变一个混合因子,或者改变一种采样模式。我们已经进行了许多尝试,努力把状态改变集中到一起,以提高效率,比如,使用 OpenGL 中的显示列表或者 Direct3D 9 中的状态块( state blocks )。虽然这些解决方案可以工作的很好,但是,我们选择了一种更简单的方法。丢弃固定管线的冗余功能已经大大减少了总的状态种类数量。通过分析,我们发现当前过细的粒度划分,并没有什么优点,因此,我们把分散的状态组织为了较大的,相关的,不可变的聚合体( immutable aggregates )成为 状态对象( state objects ) 。这样可以建立一个清晰的模型,指明哪些状态应该是独立的,哪些不是,从而减少完全重新装配管线所需的 API 调用数量。我们发现使用了这些新 API 的程序,能提高匹配的准确性。
         Direct3D 10 定义了 5 个状态对象: InputLayout(vertex buffer layout) , Sampler , Rasterizer , DepthStencil ,以及 Blend 。这样的划分,反映了状态逻辑上的关系,如果应用程序需要单独频繁的改变某个独立状态,那么可以进一步对此进行细分。当创建状态对象时,驱动将为此状态创建相应的硬件表示( e.g ,一组寄存器值),当对象需要绑定到管线时,相应的命令就被复制到命令缓冲中。某些硬件实现可能会在硬件中保留(缓存)状态表示,从而减少把 API 命令转换为硬件命令的代价。
         在第四节中,我们描述了更新管线常量时可能出现的问题。他实际上只是管道故障( hazards )中,比较普通的一种。当某个值即将被使用,但之前的值仍在使用时,同样可能导致一些故障。解决这个问题通常使用的方法就是,使用额外的储存空间来保存新值,同时,重定向引用,指向新的缓冲。
         另一种故障发生在从刚写入数据的资源中读取数据时。比如,把之前的渲染目标作为纹理来使用。当进行这样的交换时,要求渲染指令已经执行完毕,同时,所有数据已被写入渲染目标,这样才能从中拾取数据。与前面的描述的更新故障不同, read - after - write 故障更难,或者根本不可能在 API 和运行时中解决。为了避免在这种情况下对管线造成延迟( stalling ),应用程序在构建时,就应该尽量避免渲染操作需要立即读取之前渲染目标中的数据。
 
5.2 Validation and Error Handing
         部分 API 设计的原则是避免发生错误,或者避免对某些使用频率较低,但代价很大的操作进行错误检查,比如对创建对象进行检查,而不是对使用对象检查。虽然我们对性能的需求,不允许通过 API 对已部署的程序进行过多错误检查。这里,我们的错误检测和报告策略是把错误分为两类,致命和非致命的。在任何版本的运行时中,都会对致命错误进行检测和报告。非致命错误的检测则是通过一个单独的监听层来完成,它对运行时来说是透明的。这个验证层最初是在程序的开发时使用,当部署程序的时候,开发者通常会屏蔽它。为了检测错误,它通常还会寻找和报告 API 的不理想( non-ideal )使用类型。可以对这个验证层进行控制,指定他对哪些错误进行探测和报告。
         错误分化的方法确实有一点点模糊( ambiguity ):哪些错误总是会被检测,哪些没有被检测出的错误将有怎样的行为?未定义的错误行为稍后可能会转变为一种 unintended but relied upon (defacto) behavior 。再者,如果运行时没有检测出某个特定的错误,那么驱动将忽略性能代价,尽力避免出现灾难性的硬件错误。我们将努力鉴别出这种错误,并且在运行时中对他们进行检测。另外,在渲染时,我们不会进行任何错误检查, e.g ,错误检测将被延迟,直到一个 Draw 命令完成。致命错误保护扩了深度缓冲和渲染目标尺寸不匹配,同时把一个资源绑定到读取和写入操作上,等等,不致命的错误则包括:不匹配的 shader 类型联接(签名),以及数据格式声明不匹配。
         在当前着色编成模型发展的阶段,捕获着色程序运行期间的错误代价是很大的。因此,我们定义了完善的行为,比如,当数组越界时返回 0 ,来获得一致的行为。从长远来看,硬件将会支持异常机制。
 
C++ DLL封装Socket通信与数据库代理:从原理到工程实践 动态链接库(DLL)是Windows系统中实现模块化编程与代码复用的核心技术,通过封装特定功能为独立二进制模块,供主程序动态加载调用。其原理在于导出函数接口,实现逻辑与数据的隔离,从而提升软件的可维护性与部署灵活性。在涉及网络通信与数据访问的复杂场景中,DLL的技术价值尤为凸显,它能将底层的Socket连接管理、应用层协议封包解包以及数据库操作代理等复杂逻辑封装成简洁的API。本文聚焦于一个典型应用场景:为遗留的C/S架构系统开发一个独立的C++ DLL模块,该模块需通过自定义Socket协议登录远程服务器 阅读详情

相关推荐

【Windows】 C++实现 Socket 通讯

【Windows】 C++实现 Socket 通讯

m0_51005282的博客 2535

DirectX 10教程1:在Visual Studio中设置DirectX 10

 在编写图形代码前我们需要合适的工具,首要工具是一个编译器,它最好能够内建在一个漂亮的IDE中。我使用的是Visual Studio 2010,你也可以根据你的喜好选择其他的编译器,有些在网络上可以免费下载到。 第二个工具是DirectX SDK,它可以从Microsoft的网站上免费下载到,当下载并安装好SDK后,你就拥有了编译DirectX程序的必要文件了。在SDK中还包含示例,工具和

2373

截获 Windows socket API

 1前言本文主要介绍了如何实现替换Windows上的API函数,实现Windows API Hook(当然,对于socket的Hook只是其中的一种特例)。这种Hook API技术被广泛的采用在一些领域中,如屏幕取词,个人防火墙等。这种API Hook技术并不是很新,但是涉及的领域比较宽广,要想做好有一定的技术难度。本文是采集了不少达人的以前资料并结合自己的实验得出的心得体会,在这里进行总

移动开发专栏 1万+

DirectX教程(6):初始化Direct3D

  在上一节,我们已经研究了关于Direct3D的基本概率,现在让我们开始构建一个简单的Direct3D程序,以便深入探讨实际问题。在这个程序中,我们只是初始化Direct3D,然后将其关闭。虽然内容不多,甚至连一个“hello world”级别都不算,但这是一个好的开始。 COM   COM是组件对象模型(Component Object Model)的缩写,它是一种创建非常高级对象的方法,它的...

父进程的博客 2433

C/C++ socket套接字详解(Windows)

一、编译环境本篇博客是在windows系统下的CodeBlocks环境下编写而成的,Linux系统以及其他编译环境暂不适用关于如何CodeBlocks如何安装和配置,可以参考链接(转自萤火虫塔莉):CodeBlocks的安装以及编译器的配置...

CRC的博客 1万+

C++基于TCP和UDP的socket通信

TCP和UDP属于传输层协议。其中TCP提供IP环境下的数据可靠传输,它事先为要发送的数据开辟好连接通道(三次握手),然后再进行数据发送;而UDP则不为IP提供可靠性,一般用于实时的视频流传输,像rtp、rtsp就是建立在udp的基础上的。      首先谈谈tcp socket     tcp简单的三次握手过程如图,     SYN(Synchronize Sequence Numbe

4万+

DirectX3D SDK 基础教程(一)

概述 在这第一篇教程中,我们将通过一些必要的元素去创建一个最小的 Direct3D 10 应用. 每一个 Direct3D 10 应用都必须有这些功能元素对应功能属性. 这些元素包括设置窗口和设备对象,然后在窗口中显示一种颜色。 设置Direct3D 10 设备 现在我们在一个只有一个空窗体的工程中, 去设置一个 Direct3D 10 设备, 如果你想去渲染任何一个3D 场景,设置3D 设

bzwang的专栏 1173

win32下Socket编程(1)

   一.win32的socket编程,是socket编程中比较经典也比较基础的一部分,根据传输方式和协议的区别,可以简单的分为TCP传递和UDP传递两种。这篇文章主要是阐述基于TCP的Socket编程。二.Socket相关API1.WSAStartupint WSAStartup( __in WORD wVersionRequested, __out

Ckary的博客 1487

Direct3D 10教程7:纹理映射和常量缓存

概览 在前面的教程中我们介绍了光照,现在我们将在立方体上添加纹理。我们还会介绍常量缓存的概念,以及如何通过最小化带宽的方式利用常量缓存加速处理过程。 这个教程介绍如何在立方体上施加纹理。 这个教程包含了Direct3D 10中的基本概念,以后的教程通过介绍DXUT、网格加载和shader的示例扩展这些概念。 源代码 (SDK root)\Samples\C++\Direct3D10

735

Python、/C/C++ Socket编程实例

Socket: socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。  在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的

Skyline 3132

利用Socket在计算机本地实现通信(二)

本文主要是在计算机本地使用基于TCP协议的Socket建立服务端与客户端的连接与基本通信 系统:Windows 10 软件:Visual studio 2019 语言:C++ Socket通信实现步骤 创建ServerSocket和Socket 打开连接到的Socket的输入/输出流 按照协议对Socket进行读/写操作 关闭输入/输出流和Socket 本文的程序...

Tiiktak‘s 2219

DirectX10 学习1(摘录Introduction to 3D Game Programming with DirectX 10(中文版))

一、Direct3D概述 Direct3D是一种底层绘图API(application programming interface,应用程序接口),它可以使我们获得3D 硬件加速功能,提高3D 场景的渲染效率。从本质上讲,Direct3D提供的是一组软件接口,我们可以通过这组接口来控制绘图硬件。例如,要命令绘图设备清空渲染目标( 例如屏幕), 我们可以调用Direct3D 的ID3D10Devi...

weixin_34417183的博客 237

VC++编写的Socket udp通信程序

VC++编写的Socket udp通信程序

ffghggf的博客 2459

libssh2编译lib/dll与使用的步骤

1:下载源码:libssh2https://www.libssh2.org/ 2.OpenSSL安装 编译libssh2需要安装OpenSSL,这里自己编译库比较复杂,直接安装带库的包比较方便: 直接从Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions下载 注意,不要下载 light 版本,因为 light 版本不带库文件。 3.在根目录创建编译目录 mkdir build cd bui...

more_HH 6946

DLL的多线程

为了解决这个问题,我们可以通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。如果一个初始化函数是在线程A中调用的,而核心功能函数是在线程B中调用的,那么线程A初始化函数的资源就无法对应线程B中的核心功能,此外还有核心功能函数间的数据传递,这样的DLL就不是线程安全的,必然导致错误。这是一个优点也是一个缺点。但如果你要保持函数的线程安全,那么静态变量是不能用的,因为静态变量是全局的,是属于进程的,也就是属于进程内线程共享的。

m0_74823292的博客 947

Socket异步通信

使用Begin...End..异步方法 简单处理了粘包,粘包时自动分拆 命名空间:Wodsoft.Net.Sockets 常用类: TCPClient TCPClientEventArgs TCPListener TCPListenerClient TCPListenerEventArgs UDPService UDPServiceEventArgs   常用类常用方法:

Wodsoft Developer Home 4348

Windows下实现C语言Socket通讯TCP传送结构体信息

版权声明:本文为博主原创文章,未经博主允许不得转载 Windows下实现C语言Socket通讯 <TCP传送结构体信息> 首先socket通信的步骤: 三次握手协议 三次握手协议 代码 服务器端 #include <stdio.h> #include <WinSock2.h> #include...

qq_36082072的博客 1533

使用C#+socket实现用移动设备控制的虚拟手柄

近期在和同学玩死神vs火影,以怀念小时候,突然觉得用键盘玩的不够畅快,因此萌生了写一个虚拟手柄的念头。 我的思路是在移动设备(iOS、Android)上实现手柄,在电脑上监听,利用socket建立持久连接,通过移动设备向电脑上的监听软件发送操作码,通过操作码来处理事件。 现在已经完美实现了单键和组合键的操作,可以完美的代替键盘。 本文介绍的C#实现键盘事件与socket监听的方法。

最美的时光 1901
上一篇: 通用折射模拟
下一篇: XNA Framework announced~~~!!!
soilwork
博客等级 码龄23年 290粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值