当前位置: 首页 > 编程日记 > 正文

Vulkan Tutorial 12 Fixed functions

Vertex input


VkPipelineVertexInputStateCreateInfo结构体描述了顶点数据的格式,该结构体数据传递到vertex shader中。它以两种方式进行描述:

  • Bindings:根据数据的间隙,确定数据是每个顶点或者是每个instance(instancing)

  • Attribute 描述:描述将要进行绑定及加载属性的顶点着色器中的相关属性类型。

因为我们将顶点数据硬编码到vertex shader中,所以我们将要填充的结构体没有顶点数据去加载。我们将会在vertex buffer章节中回来操作。

VkPipelineVertexInputStateCreateInfo vertexInputInfo = {};
vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
vertexInputInfo.vertexBindingDescriptionCount = 0;
vertexInputInfo.pVertexBindingDescriptions = nullptr; // OptionalvertexInputInfo.vertexAttributeDescriptionCount = 0;
vertexInputInfo.pVertexAttributeDescriptions = nullptr; // Optional

pVertexBindingDescriptionspVertexAttributeDescriptions成员指向结构体数组,用于进一步描述加载的顶点数据信息。在createGraphicsPipeline函数中的shaderStages数组后添加该结构体。

Input assembly


VkPipelineInputAssemblyStateCreateInfo结构体描述两件事情:顶点数据以什么类型的几何图元拓扑进行绘制及是否启用顶点索重新开始图元。图元的拓扑结构类型topology枚举值如下:

  • VK_PRIMITIVE_TOPOLOGY_POINT_LIST:顶点到点

  • VK_PRIMITIVE_TOPOLOGY_LINE_LIST:两点成线,顶点不共用

  • VK_PRIMITIVE_TOPOLOGY_LINE_STRIP:两点成线,次索引的顶点作为后一个顶点的开始顶点,即顶点共用

  • VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST: 三点成面,顶点不共用

  • VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP:三点成面,每第三个顶点作为下一个三角形的首个顶点,即顶点共用

正常情况下,顶点数据按照缓冲区中的序列作为索引,但是也可以通过element buffer缓冲区自行指定顶点数据的索引。通过复用顶点数据提升性能。如果设置primitiveRestartEnable成员为VK_TRUE,可以通过0xFFFF或者0xFFFFFFFF作为特殊索引来分解线和三角形在_STRIP模式下的图元拓扑结构。

通过本教程绘制三角形,所以我们坚持按照如下格式填充数据结构:

VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
inputAssembly.primitiveRestartEnable = VK_FALSE;

Viewports and scissors


viewport用于描述framebuffer作为渲染输出结果目标区域。它的数值在本教程中总是设置在(0, 0)(width, height)

VkViewport viewport = {};
viewport.x = 0.0f;
viewport.y = 0.0f;
viewport.width = (float) swapChainExtent.width;
viewport.height = (float) swapChainExtent.height;
viewport.minDepth = 0.0f;
viewport.maxDepth = 1.0f;

记得交换链和它的images图像大小WIDTHHEIGHT会根据不同的窗体而不同。交换链图像将会在帧缓冲区framebuffers使用,所以我们应该坚持它们的大小。

minDepthmaxDepth数值指定framebuffer中深度的范围。这些数值必须收敛在[0.0f, 1.0f]区间冲,但是minDepth可能会大于maxDepth。如果你不做任何指定,建议使用标准的数值0.0f和1.0f

viewports定义了image图像到framebuffer帧缓冲区的转换关系,裁剪矩形定义了哪些区域的像素被存储。任何在裁剪巨型外的像素都会在光栅化阶段丢弃。它们的功能更像过滤器而不是定义转换关系。这个区别如下图所示。需要注意的是,对于图像比viewport尺寸大的情形,左侧的裁剪矩形只是众多可能的一个表现。

在本教程中我们需要将图像绘制到完整的帧缓冲区framebuffer中,所以我们定义裁剪矩形覆盖到整体图像:

VkRect2D scissor = {};
scissor.offset = {0, 0};
scissor.extent = swapChainExtent;

viewport和裁剪矩形需要借助VkPipelineViewportStateCreateInfo结构体联合使用。可以使用多viewports和裁剪矩形在一些图形卡,通过数组引用。使用该特性需要GPU支持该功能,具体看逻辑设备的创建。

VkPipelineViewportStateCreateInfo viewportState = {};
viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
viewportState.viewportCount = 1;
viewportState.pViewports = &viewport;
viewportState.scissorCount = 1;
viewportState.pScissors = &scissor;

Rasterizer


光栅化通过顶点着色器及具体的几何算法将顶点进行塑形,并将图形传递到片段着色器进行着色工作。它也会执行深度测试depth testing、面裁切face culling和裁剪测试,它可以对输出的片元进行配置,决定是否输出整个图元拓扑或者是边框(线框渲染)。所有的配置通过VkPipelineRasterizationStateCreateInfo结构体定义。

VkPipelineRasterizationStateCreateInfo rasterizer = {};
rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
rasterizer.depthClampEnable = VK_FALSE;

它的depthClampEnable设置为VK_TRUE,超过远近裁剪面的片元会进行收敛,而不是丢弃它们。它在特殊的情况下比较有用,像阴影贴图。使用该功能需要得到GPU的支持。

rasterizer.rasterizerDiscardEnable = VK_FALSE;

如果rasterizerDiscardEnable设置为VK_TRUE,那么几何图元永远不会传递到光栅化阶段。这是基本的禁止任何输出到framebuffer帧缓冲区的方法。

rasterizer.polygonMode = VK_POLYGON_MODE_FILL;

polygonMode决定几何产生图片的内容。下列有效模式:

  • VK_POLYGON_MODE_FILL: 多边形区域填充

  • VK_POLYGON_MODE_LINE: 多边形边缘线框绘制

  • VK_POLYGON_MODE_POINT: 多边形顶点作为描点绘制

使用任何模式填充需要开启GPU功能。

rasterizer.lineWidth = 1.0f;

lineWidth成员是直接填充的,根据片元的数量描述线的宽度。最大的线宽支持取决于硬件,任何大于1.0的线宽需要开启GPU的wideLines特性支持。

rasterizer.cullMode = VK_CULL_MODE_BACK_BIT;
rasterizer.frontFace = VK_FRONT_FACE_CLOCKWISE;

cullMode变量用于决定面裁剪的类型方式。可以禁止culling,裁剪front faces,cull back faces 或者全部。frontFace用于描述作为front-facing面的顶点的顺序,可以是顺时针也可以是逆时针。

rasterizer.depthBiasEnable = VK_FALSE;
rasterizer.depthBiasConstantFactor = 0.0f; // Optionalrasterizer.depthBiasClamp = 0.0f; // Optionalrasterizer.depthBiasSlopeFactor = 0.0f; // Optional

光栅化可以通过添加常量或者基于片元的斜率来更改深度值。一些时候对于阴影贴图是有用的,但是我们不会在章节中使用,设置depthBiasEnableVK_FALSE

Multisampling


VkPipelineMultisampleStateCreateInfo结构体用于配置多重采样。所谓多重采样是抗锯齿anti-aliasing的一种实现。它通过组合多个多边形的片段着色器结果,光栅化到同一个像素。这主要方法在边缘,这也是最醒目的锯齿发生的地方。如果只有一个多边形映射到像素是不需要多次运行片段着色器进行采样的,相比高分辨率来说,它会花费较低的开销。开启该功能需要GPU支持。

VkPipelineMultisampleStateCreateInfo multisampling = {};
multisampling.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
multisampling.sampleShadingEnable = VK_FALSE;
multisampling.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
multisampling.minSampleShading = 1.0f; // Optionalmultisampling.pSampleMask = nullptr; // Optionalmultisampling.alphaToCoverageEnable = VK_FALSE; // Optionalmultisampling.alphaToOneEnable = VK_FALSE; // Optional

在本教程中我们不会使用多重采样,但是可以随意的尝试,具体的参数请参阅规范。

Depth and stencil testing


如果使用depth 或者 stencil缓冲区,需要使用VkPipelineDepthStencilStateCreateInfo配置。我们现在不需要使用,所以简单的传递nullptr,关于这部分会专门在深度缓冲区章节中讨论。

Color blending


片段着色器输出具体的颜色,它需要与帧缓冲区framebuffer中已经存在的颜色进行混合。这个转换的过程成为混色,它有两种方式:

  • 将old和new颜色进行混合产出一个最终的颜色

  • 使用按位操作混合old和new颜色的值

有两个结构体用于配置颜色混合。第一个结构体VkPipelineColorBlendAttachmentState包括了每个附加到帧缓冲区的配置。第二个结构体VkPipelineColorBlendStateCreateInfo包含了全局混色的设置。在我们的例子中仅使用第一种方式:

VkPipelineColorBlendAttachmentState colorBlendAttachment = {};
colorBlendAttachment.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
colorBlendAttachment.blendEnable = VK_FALSE;
colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_ONE; // OptionalcolorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ZERO; // OptionalcolorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD; // OptionalcolorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; // OptionalcolorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; // OptionalcolorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD; // Optional

这种针对每个帧缓冲区配置混色的方式,使用如下伪代码进行说明:

if (blendEnable) {finalColor.rgb = (srcColorBlendFactor * newColor.rgb) <colorBlendOp> (dstColorBlendFactor * oldColor.rgb);finalColor.a = (srcAlphaBlendFactor * newColor.a) <alphaBlendOp> (dstAlphaBlendFactor * oldColor.a);
} else {finalColor = newColor;
}finalColor = finalColor & colorWriteMask;

如果blendEnable设置为VK_FALSE,那么从片段着色器输出的新颜色不会发生变化,否则两个混色操作会计算新的颜色。所得到的结果与colorWriteMask进行AND运算,以确定实际传递的通道。

大多数的情况下使用混色用于实现alpha blending,新的颜色与旧的颜色进行混合会基于它们的opacity透明通道。finalColor作为最终的输出:

finalColor.rgb = newAlpha * newColor + (1 - newAlpha) * oldColor;
finalColor.a = newAlpha.a;

可以通过一下参数完成:

colorBlendAttachment.blendEnable = VK_TRUE;
colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;

可以在规范中找到所有有关VkBlendFactorVkBlendOp的枚举值。

第二个结构体持有所有帧缓冲区的引用,它允许设置混合操作的常量,该常量可以作为后续计算的混合因子:

VkPipelineColorBlendStateCreateInfo colorBlending = {};
colorBlending.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
colorBlending.logicOpEnable = VK_FALSE;
colorBlending.logicOp = VK_LOGIC_OP_COPY; // OptionalcolorBlending.attachmentCount = 1;
colorBlending.pAttachments = &colorBlendAttachment;
colorBlending.blendConstants[0] = 0.0f; // OptionalcolorBlending.blendConstants[1] = 0.0f; // OptionalcolorBlending.blendConstants[2] = 0.0f; // OptionalcolorBlending.blendConstants[3] = 0.0f; // Optional

如果需要使用第二种方式设置混合操作(bitwise combination), 需要设置logicOpEnableVK_TURE。二进制位操作在logicOp字段中指定。在第一种方式中会自动禁止,等同于为每一个附加的帧缓冲区framebuffer关闭混合操作,blendEnableVK_FALSEcolorWriteMask掩码会用确定帧缓冲区中具体哪个通道的颜色受到影响。它也可以在两种方式下禁止,截至目前,片段缓冲区向帧缓冲区中输出的颜色不会进行任何变化。

Dynamic state


之前创建的一些结构体的状态可以在运行时动态修改,而不必重新创建。比如viewport的大小,line width和blend constants。如果需要进行这样的操作,需要填充VkPipelineDynamicStateCreateInfo结构体:

VkDynamicState dynamicStates[] = {VK_DYNAMIC_STATE_VIEWPORT,VK_DYNAMIC_STATE_LINE_WIDTH
};VkPipelineDynamicStateCreateInfo dynamicState = {};
dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
dynamicState.dynamicStateCount = 2;
dynamicState.pDynamicStates = dynamicStates;

在绘制的过程中指定这些数据,这会导致忽略之前的相关数值。我们会在后续的章节中回过头来讨论。如果没有任何需要动态修改的数值清设置为nullptr

Pipeline layout


可以在着色器中使用uniform,它是类似与动态状态变量的全局变量,可以在绘画时修改,可以更改着色器的行为而无需重新创建它们。它们通常用于将变换矩阵传递到顶点着色器或者在片段着色器冲创建纹理采样器。

这些uniform数值需要在管线创建过程中,通过VkPipelineLayout对象指定。即使在后续内容中用到,我们也仍然需要创建一个空的pipeline layout。

创建类成员变量持有该对象,因为我们在后续章节中的函数中引用它:

VkPipelineLayout pipelineLayout;

createGraphicsPipeline函数中创建对象:

VkPipelineLayoutCreateInfo pipelineLayoutInfo = {};
pipelineLayoutInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
pipelineLayoutInfo.setLayoutCount = 0; // OptionalpipelineLayoutInfo.pSetLayouts = nullptr; // OptionalpipelineLayoutInfo.pushConstantRangeCount = 0; // OptionalpipelineLayoutInfo.pPushConstantRanges = 0; // Optionalif (vkCreatePipelineLayout(device, &pipelineLayoutInfo, nullptr, &pipelineLayout) != VK_SUCCESS) {    throw std::runtime_error("failed to create pipeline layout!");
}

该结构体还指定了push常量,这是将动态值传递给着色器的拎一个方式。pipeline layout可以在整个程序的生命周期内引用,所以它在程序退出的时候进行销毁。

void cleanup() {vkDestroyPipelineLayout(device, pipelineLayout, nullptr);...
}

Conclusion


这就是所有有关fixed-function的内容,看起来有很多的工作去做,值得庆幸的是我们几乎了解了所有有关渲染管线的内容。这个过程减少了因为不了解某些组件的默认状态,而造成运行时碰到未知行为的可能性。















本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1940553 ,如需转载请自行联系原作者





相关文章:

年后跳槽BAT必看:10种数据结构、算法和编程课助你面试通关

作者 | javinpaul译者 | 大鱼编辑 | 一一出品 | AI 科技大本营进入 BAT 这样的巨头企业工作&#xff0c;无疑是很多程序员的梦想。但事实上&#xff0c;能通过这些公司高难度编程面试的只是一小撮人&#xff0c;大多数人因为理论知识和项目实践的匮乏导致在面试后很快被淘汰&am…

戚薇在冰箱放香水,是贫穷限制了想象力!

前有李诞冰箱里放面膜&#xff0c;今有戚薇冰箱里放香水&#xff0c;《拜托了冰箱》真是为观众们打开了新世界的大门。在昨晚播出的节目中&#xff0c;戚薇充分展现了她作为“美妆博主”的实力&#xff0c;冰箱里摆满的香水不仅让冰箱家族看得目瞪口呆&#xff0c;网友们也是激…

使用apache的activemq集合JMS处理异步消息

为什么80%的码农都做不了架构师&#xff1f;>>> 1&#xff1a;先去apache下载 http://activemq.apache.org/ &#xff0c;大约有25M&#xff0c;要有点耐心 直接打开就可以使用&#xff1b;当然它也提供了安装为windows service的方法 2&#xff1a;配置activemq 在…

中国大学生创业报告发布

由中国人民大学牵头&#xff0c;北京师范大学、上海交通大学等30余家高校、企业和社会组织联合跟踪调查的《2017年中国大学生创业报告近日发布。这份覆盖全国52所高校的报告表明&#xff0c;大学生创业意愿持续高涨&#xff0c;大学生创业层次也在不断提升&#xff0c;但大学生…

windows server 2012 application control policy

启用Application Control policy 组策略设置&#xff0c;可以实现基于用户或组的应用程序权限控制&#xff0c;有两点需要注意&#xff1a; 1、策略的顺序是从上到下执行的&#xff0c;allow的策略需要放在上面。 2、在客户端上&#xff0c;或者在远程桌面的服务器上需要启用ap…

你已经是个成熟的表格,该学会NLP了

作者 | 唐都钰、孙一博来源 | 微软亚洲研究院AI头条编者按&#xff1a;在我们的生活中&#xff0c;用语音查询天气&#xff0c;用必应搜索信息&#xff0c;这些常见的场景都离不开一种应用广泛的数据存储方式——表格&#xff08;table&#xff09;。如果让表格更智能一些&…

[Design] Flyweight Pattern

结构模式  结构模式描述如何将类或者类的对象结合在一起形成更大的结构。  结构模式描述两种不同的东西&#xff1a;类与类的实例。结构模式可以分为&#xff1a;类的结构模式和对象的结构模式两种。  类的结构模式&#xff1a;类的结构模式使用继承来把类、接口等组合在一…

网友们票选的2018 Best Paper,你pick谁?

整理 | 琥珀出品 | AI科技大本营不久前&#xff0c;Reddit 机器学习论坛上一位网友发布了一个帖子&#xff1a;“What is the best ML paper you read in 2018 and why?&#xff08;你认为 2018 年读过的最好的论文是哪篇&#xff1f;&#xff09;”吸引了各路网友前来回答。营…

微信小游戏创业,究竟是红海还是死海?

“跳一跳”、“弹球王者”、“海盗来了”、“斗地主”等等微信小游戏&#xff0c;你是不是很眼熟呢&#xff1f;这些都是前段时间被刷了屏的小游戏&#xff0c;以“海盗来了”为例&#xff0c;据透露&#xff0c;其月流水已经突破了 1000 万&#xff0c;单日流水峰值也达到了 2…

OSPF中的frame-relay(3) 点到多点非广播

hostname R1!interface Loopback0 ip address 1.1.1.1 255.255.255.255interface Serial0 ip address 192.168.1.1 255.255.255.0 encapsulation frame-relay ip ospf network point-to-multipoint non-broadcast //将接口类型指定为点对多点非广播 frame-relay map ip 192.1…

一步一步SharePoint 2007之十六:注册并配置一个网站用户

在前面的文章中&#xff0c;我已经介绍了如何创建管理帐户。创建其它帐户的方法是一样的。大家可以把这个注册系统放到自己的网站中&#xff0c;就可以成为网站的一部分了。本文将只讲解如何在管理工具中将用户手动加入到网站用户组中&#xff0c;至于如何将注册完后的用户自动…

Facebook再曝数据丑闻删除应用数据仍会被泄漏

据外媒报道&#xff0c;道德黑客、漏洞赏金猎人Inti De Ceukelaire于昨日披露&#xff0c;名为“NameTests”的第三方测验应用令1.2亿Facebook用户面临数据泄露风险&#xff0c;这进一步时使Facebook的数据丑闻升温。道德黑客Inti De Ceukelaire发现&#xff0c;只要用户注册Na…

榨菜肉丝汤的做法

<!-- /* Font Definitions */ font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} font-face {font-famil…

“不设边界”的云知声:从多场景AI芯片到视觉AI,誓要2019营收近3倍

记者| 杨丽 出品| AI科技大本营 若非要总结 2018、展望 2019 的话&#xff0c;可以借用云知声创始人兼 CEO 黄伟的一句点评&#xff1a;“所有伟大的公司都诞生于真实的生产需求。” 2019 年 1 月 2 日&#xff0c;云知声在京召开战略发布会&#xff0c;正式公布其正在研发的…

微软公布Win10正式版功能对比表,哪个版本适合你?

微软今天公布了Win10各个版本功能特性对照表&#xff0c;详细列出了Windows10系统的大多数功能以及哪些版本具备这些功能。通过这张表格可为消费者购买或升级Win10提供参考。 微软公布的原版表格为英文版&#xff08;可点此下载&#xff09;&#xff0c;IT之家将其翻译为中文&a…

linux tpm 测试完整记录,亲测有效。

没有tpm芯片&#xff0c;采用模拟器的方式来测试。 实验环境&#xff1a;内核版本 3.10.0-327 软件包准备&#xff1a; 内网&#xff0c;没有仓库&#xff0c;自己网上下载&#xff1a; 1. cmake-3.9.6-Linux-x86_64.tar.gz 解压后就已经有bin文件&#xff0c;可以直接使用bin下…

互联网流量太贵!新零售成创业新风口

什么是新零售?无人便利店、每个创业者都有自己的电商平台?运用人工智能、大数据等技术手段&#xff0c;对商品生产、流通、销售进行再升级&#xff0c;进而提高线上服务与线下体验?其实&#xff0c;说白了就是效率更高的零售新模式。联网早期的流量福利开始变弱&#xff0c;…

拼多多黄峥给陆奇“兼职”,欲挖掘这类AI人才

整理 | 一一出品 | AI科技大本营在上任 Y Combinator 中国创始人兼 CEO 四个月后&#xff0c;陆奇今日宣布三位兼职合伙人加盟 YC 中国&#xff0c;同时宣布新一期创业训练营正式完成招生工作&#xff0c;即将开始为期三个月的冬季训练营培训工作。三位兼职合伙人分别是拼多多创…

Crystal Reports中的字段

字段&#xff0c;是Crystal Reports呈现数据的基本单元&#xff0c;也是报表的数据中心。 在Crystal Reports中&#xff0c;字段的类型有数据库字段&#xff0c;公式字段&#xff0c;参数字段&#xff0c;组名字段&#xff0c;运行总计字段&#xff0c;特殊字段&#xff0c;未绑…

深度学习的发展可能已达极限!

【编者按】回首 2018 年&#xff0c;身处技术圈的你是否曾反思过些什么——科技与非科技企业界限的日益模糊、技术的发展现状和前景、科技发展的正向助推到负面效应&#xff0c;乃至个人心态上的变化。人文、生态、社会……玩技术的人看到的从来不仅仅是技术本身而已&#xff0…

大学生创业难?现在已不是问题!

现在越来越多的大学生离开学校加入了自主创业的队伍&#xff0c;那么你一定要知道政府为扶持大学生创业&#xff0c;出台的那些鼓励政策&#xff01;如果你符合以下条件&#xff1a;1、公司法人是普通高等院校&#xff08;高自考的不行&#xff09;毕业前2年的在校生和毕业后5年…

Oracle:彻底结束会话 ,彻底解锁

oracle会话被锁是经常的。但有时alter system kill session sid,serial#;并不能彻底的杀死会话。只能通过杀死Linux上对应的进程才行。以前都是通过v$session里的logon_time&#xff0c;和ps -ef|grep oracle所列出的时间大约的定位进程。然后结束。本来想把这个写成日志。但有…

使用vim打造自己的python编辑器

基础配置 vim的配置是在用户主目录下的 ~/.vimrc 文件中完成的&#xff0c;如果没有的话&#xff0c;需要自己新建一下&#xff1a; cd ~ touch .vimrc首先做些简单的配置&#xff1a; set nocompatible "关闭与vi的兼容模式 set number "显示行号 set nowrap &qu…

两亿多用户,六大业务场景,知乎AI用户模型服务性能如何优化?

作者 | 王政英来源 | 知乎技术专栏用户模型简介知乎 AI 用户模型服务于知乎两亿多用户&#xff0c;主要为首页、推荐、广告、知识服务、想法、关注页等业务场景提供数据和服务&#xff0c;例如首页个性化 Feed 的召回和排序、相关回答等用到的用户长期兴趣特征&#xff0c;问题…

加班到凌晨三点,就能月薪五万了吗?

早起上班的地铁上&#xff0c;看到朋友圈有不少人刷视觉志推出的一篇《凌晨3点不回家&#xff1a;成年人的世界是你想不到的心酸》&#xff0c;出于好奇&#xff0c;就点击看了一些。文章用一堆煽情的图片和煽情的文字推导出一个结论&#xff1a;成年人的世界很不容易&#xff…

山西之行的感想

出差学习、外出培训&#xff08;既“训”别人&#xff0c;也被别人“训”&#xff0c;呵呵&#xff09;……充实啊。关于这次出差学习&#xff0c;很想说点什么的。不过说实话&#xff0c;他们的全员人口系统目前只是完成信息编辑、查询功能&#xff0c;进一步的汇总、数据挖掘…

GIS开发随笔(2)——关于建立GIS数据库的几个问题

真正的实战开始了&#xff0c;根据用户的需求首先就是编写了一大堆的这样那样的文档说明&#xff0c;并根据用户需求分析建立了数据库的库表及其内容。在建库的过程中我们使用的是微软的Sql Server2000数据库&#xff0c;在分析数据库前也在网上游荡了些时日&#xff0c;发现很…

刘铁岩谈机器学习:随波逐流的太多,我们需要反思

嘉宾 | 刘铁岩 整理 | 阿司匹林 来源 | AI科技大本营在线公开课 人工智能正受到越来越多的关注&#xff0c;而这波人工智能浪潮背后的最大推手就是“机器学习”。机器学习从业者在当下需要掌握哪些前沿技术&#xff1f;展望未来&#xff0c;又会有哪些技术趋势值得期待&#…

SQL2K数据库开发二之查看和修改Sample数据库

1.在SQL Server 企业管理器中&#xff0c;选择“数据库”节点&#xff0c;右击sample 数据库图标&#xff0c;在弹出的菜单中选择“属性”。 2."常规"页面显示了数据库的概要信息。 3.“文件组”页面显示了数据库中现有的文件组&#xff0c;此时数据库中只有一个主文…

谈点正经的:Papi酱能火,如果你现在学她却未必能火起来

集才华美貌于一身的女子Papi酱刷屏了。先是融资1200万&#xff0c;估值3亿。其次&#xff0c;又即将在四月和罗辑思维一起联手推出“中国第一场新媒体广告拍卖会”。 这些数据和事件串在一起&#xff0c;网红经济又被推至新的高点&#xff0c;内容在资本圈也越发繁荣。是的&…