如果etc激活显示手机蓝牙未开启不支持Vulkan,怎么办还能不能开启

ETC设备无法开启蓝牙功能这可能昰因为设备蓝牙发射部件已经损坏了,请尽快更换一个新的ETC设备此时你可以带上本人有效身份证、车辆行驶证、原OBU设备到银行ETC服务网点免费更换。

ETC设备开启蓝牙功能的方法如下:ETC设备的上方有一个按钮按下这个按钮就能开启蓝牙功能,这样就能在通过ETC通道时扫描到您的設备

如果您的车辆通过ETC通道时未能扫描到,这可能是因为您关联的储值卡余额不足造成的此时您需要重新插入卡片,这样可以显示余額如果卡片余额不足,那么请到相关部门进行充值

另外一个原因也会导致这个问题,就是ETC卡过期了如果你的卡过了有效期但你不想換的话,那么您可以申请银行帮你延长几年的时间等到你什么时候有空了,再到银行预约更新ETC设备和卡即可

ETC的安装必须是由ETC服务中心(站)的工作人员安装,不然ETC入口的一起没办法扫描到车内的OBU所以你如果要重新安装ETC设备,那得开车去当地的ETC服务中心(站)去现场办悝重新安装业务并进行激活

实际上不能保证你花30分钟的时間就能对vulkan有一个基本的了解

这篇文章是写给对已有的图形API(例如D3D11或GL)比较熟悉并且理解多线程、资源暂存、同步等概念但想进一步了解它们在Vulkan中是如何实现的读者的,所以我们会对Vulkan API中的主要概念提炼和概括

我希望本文中的内容是我第一次见到Vulkan就写下的,所以文章花大篇幅着重描写初识Vulkan API就必须要知道的基本内容文章即并不追求通俗易懂又不会大量地介绍背景和API设计缘由(那样的话,你应该去阅读Vulkan规范戓者更深度的教程)但必要时本文会给出参考。为了获得更准确的理解你应该去读Vulkan规范。

和其他图形API一样Vulkan也被设计成跨平台。但是鉯前的这些图形API在设计时和当时的显卡关系密切只是提供了一些可配置的固定功能。编程人员不得不在显卡厂商的怜悯之下使用所谓標准格式的顶点数据来勉强进行光照( lighting )和着色( shading )操作。

随着显卡架构的成熟它们开始提供越来越多的可编程功能,这些新功能都以某种方式集成到现有的API中这就导致了不理想的抽象和编程时更多的猜测。也导致了游戏为了获得更好的性能而更新驱动当然,有时也是为了自身的利益因为这些驱动的复杂性,应用开发者还必须解决不同厂商间的不兼容问题比如Shader的格式。除了这些情况外在过去的十年中,峩们也看到具有强大显卡的嵌入式移动设备这些移动设备根据电量( energy )和空间的需求(space requirements)具有不同的GPU架构。其中一个显著地例子就是 tiled rendering ,通过给予编程人员更多的控制来从改善的性能中受益。之前的API的另一个限制就是不支持多线程这在CPU端往往是造成瓶颈的重要原因。

Vulkan根据现代显卡嘚特点从头开始设计,从而解决了这些问题它通过让编程人员使用更多的API来明确自己的意图,从而减轻驱动的负担并且支持多线程囷并行的提交命令。它将Shader代码转换成字节码(byte code format)解决了不同厂商间Shader不兼容的问题最后一点,它承认了当代显卡的计算能力并将图形( graphics )和计算( compute )功能集成到了一个API中。

让我们来大致看一下Vulkan是如何一步一步来渲染一个三角形的以下几个概念在后续章节里还会详细介绍,这里只是想讓你对各个概念之间的联系有个宏观的了解

device)。当然也可以告诉VkDevice你想要使用何种队列。Vulkan中的大多数操作如绘画命令和内存操作,都要提交到VkQueue中在VkQueue中异步执行这些命令。队列从队列家族(queue families)中分配每一种队列支持一组特定的命令或操作。比如可能存在一些不同种类的队列,它们分别支持图形操作、计算操作、内存转移操作队列的这种特点也可以成为你选择VkPhysicalDevice的依据。Vulkan可能会支持一些不具有图形操作的显鉲不过请放心,目前Vulkan支持的显卡基本上都已支持你感兴趣的各种操作

除非你只想离线渲染(offline rendering ) ,否则就必须创建一个将渲染结果显示到屏幕上的窗口(window) 你可以使用本地平台的API来创建window ,或者使用像GLFW和SDL这样的库在这篇教程中我们选择GLFW,这一点你将在后续的教程中看到

manager)进行交互。Surface是对window 的一个抽象通常他需要window的引用来创建,比如windows上的HWND 幸运的是GLFW的内置函数能够自动为我们解决不同平台间的差异。

chain)是渲染对象的┅个集合它的功能简单说就是:保证正在渲染的image和现在显示在屏幕上的image是两个不同的image。保证image渲染完毕后才能进行显示十分重要每次我們想要画一个帧时,都必须从交换链里请求一个image来渲染绘画完毕后,再将它返回到交换链以便在某个时间后显示到屏幕上。渲染对象嘚数量以及如何将渲染完毕的图像呈现到屏幕上显示由呈现模式(present mode)来决定常见的呈现模式有双缓冲和三缓冲,我们将在创建交换链时再详細讨论这个问题

渲染通道描述了在渲染过程中要使用的image类型、如何使用以及如何处理image的内容。在我们的示例三角形应用中我们要告诉Vulkan,我们要使用一个image作为color的目标并且希望它在绘画操作前被涂成纯色。然而渲染通道只是描述要使用的image类型而framebuffer(通过绑定image)才是要使用image的实體。

buffer)操作等以及由它来描述和设定渲染管线中的可编程部分(参见VkShaderModule,其实就是shader程序)VkShaderModule对象用shader的字节码来创建。驱动需要知道哪些渲染目标將在pipeline中使用而这些目标就是我们在渲染通道中定义的image。

Vulkan和现存的其他图形API最显著地区别就是:几乎所有不可编程部分的参数配置或者说狀态设定都要在pipeline创建前提前完成这就意味着即使你只想替换一个shader程序或者仅仅改变顶点布局(vertex layout),你也得重新创建管线 这也意味着你必须提前创建很多管线,来应对渲染过程中不同渲染需求的组合只有很少的一些配置比如viewport的大小和清空操作后的颜色等可以动态改变。管线Φ所有的配置状态你必须显示的进行定义vulkan不会为你提供默认的配置,比如颜色混叠等。

这样做有一个好处就是你相当于将渲染程序提湔编译而不是即时编译驱动将有更多的机会优化你的程序,程序的运行时性能也变的更加的可预测因为在vulkan中,对渲染管线的状态参数嘚改变是需要显式地指明的 例如切换一个不同的渲染管线。

之前也提到过在Vulkan中,很多我们想执行的操作(如绘图操作)必须提交到对应的隊列:这些命令首先要记录到VkCommandBuffer中然后才能提交的到队列。这些命令缓冲区必须要从关联特定队列族的中分配为了画一个三角形,我们需要以下几个步骤来将绘制命令记录到命令缓冲区中:

1.开始渲染管道 2.绑定图形管线 3.画三个顶点 4.结束渲染管道

因为framebuffer中的image取决于交换链返回給我们的是哪一个,所以我们可以为每一个可能的image记录一个命令缓冲区然后在绘画阶段选择正确的那个来运行。另外一种方法是在绘制烸一帧图像时都记录一个commandBuffer, 但这种方法效率没有前者高

现在绘画命令已经被记录到CommandBuffer中了, 渲染三角形的程序主循环就变得非常简单明了艏先使用调用函数vkAcquireNextImageKHR从交换链那里获取一个image,然后根据这个image选择对应的命令缓冲区 然后通过调用vkQueueSubmit来执行这个命令缓冲区的命令 。我们将这個渲染完成的image放回到交换链

提交到队列中的命令是被异步执行的,因此我们必须采用像信号量(semaphores)这样的同步对象来确保不同批次的提交程序执行顺序的正确性。绘画操作或者说渲染操作必须要等待从交换链中获取image完成后才能进行否则就会出现当前渲染的图像数据还在被讀取显示到屏幕上的情况。同理vkQueuePresentKHR也必须等待image渲染结束才能进行呈现显示操作,这就需要我们再使用一个semaphore来等待渲染结束

通过上述大致嘚讲解,想必你对绘制你的第一个三角形之前所要做的工作已经有了基本的认识然而现实生活中的游戏引擎或3D显示程序比这要远远复杂嘚多,其中包含像分配顶点缓冲区和创建uniform buffer以及上传纹理图片等工作我们将在后续的章节一一介绍它们。因为vulkan具有相当陡峭的学习曲线峩们打算先从简单入手。这里我们耍了点小计俩把顶点坐标硬编码到Shader里,而不是直接使用顶点缓冲区因为管理顶点缓冲区需要你先对命令缓冲区有一定了解。

总之为了画这个三角形,我们需要:

7.为渲染管道创建frameBuffers 8.创建整个图形管线。 9.为每一个可能从交换链获取得到image 分配绘画命令缓冲区并记录绘画命令。 10.通过获取得到的images来绘制, 提交的记录绘画命令最后将绘画完成的结果(image)返回到交换链。

Vulkan是一个的C语言图形库这一点和OpenGL相同。

  • 多数函数调用都是以结构体或者是嵌套结构体的参数而不是基本类型
  • VkAllocationCallbacks * 是许多 vkCreate*/vkDestroy* 函数的参数,它用来定制你自己的CPU侧嘚内存分配/内存释放函数对于简单的应用,你可以简单地传NULL让vulkan自己负责其CPU侧的内存分配和释放。 注意:我并没有考虑任何错误异常处悝也没有讨论API实现中各种资源的上下界限制并如何遵守它们。

1、任何绘图程序无论使用的是Win32 API,还是Java Swing都离不开GC和DC的概念,使用XCB编写窗ロ程序也是如此这两个概念,一个代表了图怎么绘一个代表了图绘在哪里。由于绘图时需要指定太多的信息比如画笔的粗细、线型、前景色、背景色等等,如果把这些信息统统作为参数传递给绘图函数就会产生两个问题:一是调用这些函数太复杂,二是效率太低所以,目前所有主流的GUI库都采用了一致的做法那就是把这些信息组织成一个context,我们称之为graphic context可简称gcontext或GC。DC可以认为是绘图时所用的画布峩们可以直接把图绘到屏幕上,也可以把图绘到窗口中当然,也可以绘到控件中(因为控件的本质也是窗口)在面向对象的编程语言Φ,可以绘图的组件往往都继承自Drawable在XCB中,从绘图函数的签名可以看出它仍然将绘图的目标称为drawable,虽然它只是一个id

  2、什么时候绘圖。理论上讲任何时候都可以调用绘图函数。但是从实践上来讲所有的GUI程序都是在窗口重绘的事件中调用绘图函数。窗口重绘事件囿的叫onPaint,有的叫onDrawXCB中比较奇怪,叫EXPOSE不管叫什么,其道理是一样的那就是当窗口初次显示、从隐藏到显示或窗口内容需要刷新时,都会觸发该事件所以在处理该事件的代码中调用绘图函数是最好的,既可以保证我们看到绘图的结果又兼顾效率(窗口不可见时绘图函数鈈用执行,窗口不变化时绘图函数也不用执行)MVC模式也是构建在这样的基础之上,将数据与显示分离数据可以随时被操作,但是绘图呮在窗口重绘时进行

  3、调用绘图函数。这个不需要多讲因为几乎所有的绘图函数都是自解释的,看到函数名就知道它要进行什麼操作。

在XCB中创建GC可以通过xcb_create_gc()函数进行,创建窗口可以通过xcb_create_window()函数进行在这两个函数中,都有一个比较奇怪的模式那就是通过一个mask和value数組来设定GC和窗口的具体信息。在上一篇中创建的窗口没有背景,而这一篇中窗口具有白色背景,就是因为这里调用xcb_create_window时在其mask参数中指萣了XCB_CW_BACK_PIXEL。

Vulkan API的初始化必须要创建实例(VkInstance)Vulkan实例之间是完全相互独立的,可以给不同的实例设置不同的属性你需要通过Vulkan实例去配置是否激活驗证层和激活所需要的扩展。 Vulkan提供查询函数你可以通过这些查询函数去枚举你的显卡提供的层和扩展。

通过VkInstance可以检查可使用的GPU设备。Vulkan嘚实现可不一定是运行在GPU上但是这里我们把问题简单化。每个GPU都会提供一个VkPhysicalDevice这是个句柄

world级别的显示三角形程序来说,我们只需要简单哋选择第一个物理设备并在其上面创建VkDevice就行了深入之后程序复杂了再回来开启可选的器件特性,如果需要API调用检查并打印错误信息 可鉯开启验证层。

为什么要用Validation layers ? Vulkan的设计理念是:使驱动(driver)的负担最小化一个明显的表现就是它有限的错误检测,像设置错误的枚举值或者将必須的函数参数传递为空指针(NULL)这类简单的操作都没有明确的处理Vulkan只是简单的Crash或者产生一些未定义的行为(undefined

追踪对象的创建与销毁,检测是否與有资源泄露

追踪线程(thread)调用的源头,检测线程是否安全

将方法调用的参数打印到标准输出。

有了VkDevice我们可以开始创建任意类型的资源(一少部分资源可能还需要依赖除VkDevice之外的其他的资源对象),比如VkImage和VkBuffer

相对GL来说,使用Vulkan时你必须在创建一个图像之前声明该图像的用法。你可以提供一个位域 该位域的每一个位表示某一种使用的类型------ Color Attachment(rbg颜色附件)、shader中采样的纹理、或者用于图像的加载/存储等功能。

你也鈳以指定图像数据的存储布局格式:Linear(线性存储)或者Optimal(优化存储)这设置了Image在内存中的布局。这影响Image数据是否可直接读写

Buffers 类似并更加直接,你需要指定了大小和用处Buffer通常直接使用,因为它仅仅是一块内存但如果你想将他们在Shader中作为纹理缓冲使用,你需要提供一个VkBufferView

刚創建的buffers和images并不能立即使用,因为我们并没有为他们分配内存

我们可以通过调用vkGetPhysicalDeviceMemoryProperties查询应用可使用的内存。它会返回请求大小的一个或多个內存堆或者请求属性的一种或多种内存类型。每种内存类型来自于一个内存堆 - 因此一个典例就是PC上的一个独立显卡将会有两个堆 - ┅个是系统内存,另一个是GPU内存并且他们各自拥有多种内存类型。

内存类型有不同属性一些内存可以被CPU访问或者不行、GPU和CPU访问一致、囿缓存或者无缓存等等。

这些宏之一本书的源代码构建系统将会使用一个编译器命令行帮助你完成这个工作。

vulkan描述符集合布局和管线布局 在前面的例子中您创建了一个uniform 缓冲区,但是您没有告诉着色器该如何使用它缓冲区包含了MVP转换的Uiform变量,它只会被顶点着色器使用泹是Vulkan还不知道这一点。我们通过使用描述符来实现这一点

描述符是一个特殊的不透明的着色器变量,着色器使用它以间接的方式访问缓沖区和图像资源它可以被认为是一个资源的“指针”。Vulkan API允许在绘制操作之间更改这些变量以便着色器能够为每次绘制访问不同的资源。在样例例子中您只有一个Uniform 缓冲区。但是你可以创建两个Uniform 缓冲区每个缓冲区都有一个不同的MVP来给出不同的场景视图。然后您可以很嫆易地改变描述符,以指向任何一个Uniform 缓冲区以便在MVP矩阵之间来回切换。描述符集合被称为“集合”因为它可以引用一组同构资源,可鉯用相同的布局绑定(Layout Binding)来描述在本例中,您没有使用纹理但是使用多个描述符的一种可能方法是用两个描述符构造一个描述符集合,每个描述符引用一个单独的纹理因此,在绘制过程中两种纹理都是可用的。然后命令缓冲区中的命令可以通过指定所需纹理的索引来选择纹理。需要注意的是您只是在“描述”这里的描述符集合,实际上并没有真正地分配或创建描述符集合本身稍后您将在”Descriptor_Set”礻例中进行描述。为了描述描述符集合您可以使用描述符集合布局。

  • 您只有一个描述符集合所以binding成员的惟一选择是0。
  • 因为这个描述符引用了一个Uniform 缓冲区所以您适当地设置了descriptorType。
  • 在这个描述符集合中您只有一个描述符,它由descriptorCount 成员表示
  • 您指出,这个Uniform 缓冲区资源将被绑定箌shader顶点阶段

管道布局包含一个描述符集合布局的列表。它还可以包含一个推送常量范围的列表这是将常量传递给着色器的另一种方法,在这里不会被覆盖与描述符集合一样,您只是定义了布局实际的描述符集合的内存分配和填充,会在稍后的uniform 缓冲引用中VkPipelineLayoutCreateInfo pPipelineLayoutCreateInfo = {};

  • N表示M的描述符集合布局中的pBindings
  • I表示N的描述符集合中描述符的索引

缓冲区内容映射到myBufferVals结构。“set=M”没有指定默认为0。“std140”是描述数据如何在统一块中打包的标准如果您希望将更多的数据放在一个统一的块中,您可能希望引用它更多信息请查看 。

GUI程序都是事件驱动的目前这已经是大镓的共识,X Window也不例外在这一篇中,将展示X核心协议中有哪些事件以及怎么使用XCB来捕获并响应事件。

X Window程序处理事件遵循以下流程:

1、创建窗口的时候向X服务器注册该程序需要处理哪些事件这是为了效率方面的考虑,对于本程序不关心的事件X Server就不用发过来了。在前面一篇创建gcontext的时候提到XCB使用一种特殊的mask、value数组的方式来向X

2、在程序中使用一个while循环在循环中调用xcb_wait_for_event()函数来接受事件,也可以使用xcb_poll_for_event()函数来主动向X Server查询事件接受到事件后,使用一个switch...case...来根据事件的类型处理相应的事件如果接受到quit事件,则结束while循环退出程序。

流程就是这么简单主要是一些细节。比如创建窗口时,mask的取值可以是下面这些值的组合:

当在mask中指定了XCB_CW_EVENT_MASK后就需要在value数组中对应的项填写程序关心的事件。程序关注的事件可以是以下值的组合:

这些枚举值的定义都是很明确的所以这里不多做解释。

  对于事件对应的数据结构如果抽涳到X.org翻看一下X11协议,会发现核心协议中对事件的定义很简单所有事件的长度都是32字节,而且其第1个字节代表了事件的类型所以,在程序中可以使用xcb_generic_event_t指针来保存从xcb_wait_for_event()函数返回的事件然后根据event->response_type来决定事件的类型,然后再将这个指针强制转型为其它事件的指针

~0x80)这一句,为什麼response_type要和~0x80按位与呢同样,翻一下X11协议就可以获得答案因为如果response_type的最高位为1,也就是事件号128~255代表该事件是其它程序使用SendEvent发送过来的如果response_type嘚最高位为0,也就是事件号0~127代表该事件是X Server发送过来的很显然,我们并不关心事件的来源只关心事件的类型,所以只需要知道response_type的低7位即可。另外对于0~127这些数字,X核心协议最多只会使用0~63而64~127是为其它扩展保留的。再另外XCB教程中说目前只有33个事件需要处理.

签箌排名:今日本吧第个签到

本吧因你更精彩,明天继续来努力!

成为超级会员使用一键签到

成为超级会员,赠送8张补签卡

点击日历上漏签日期即可进行补签

超级会员单次开通12个月以上赠送连续签到卡3张

该楼层疑似违规已被系统折叠 

这样的etc怎么开启蓝牙,把插卡没鼡



该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 

用卡片插进去連续快速刷两下


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 


该楼层疑似违规已被系统折叠 

我紟天拿到的也是一样,插卡也没有反应


该楼层疑似违规已被系统折叠 


扫二维码下载贴吧客户端

我要回帖

更多关于 etc激活显示手机蓝牙未开启 的文章

 

随机推荐