Vert.x 源码解析(4.x)——Context源码解析
Vert.x 4.x 源码深度解析:Context核心概念详解 Vert.x 通过Context这一核心机制,解决了多线程环境下的码作资源管理和状态维护难题。Context在异步编程中扮演着协调者角色,码作确保线程安全的码作资源访问和有序的异步操作。本文将深入剖析Context的码作源码结构,包括其接口设计、码作网页抠图源码关键实现以及在Vert.x中的码作具体应用。Context源代码解析
Context接口定义了基础的码作事件处理功能,如立即执行和阻塞任务。码作ContextInternal扩展了Context,码作包含内部方法和功能,码作通常开发者无需直接接触,码作如获取当前线程的码作Context。在vertx的码作beginDispatch和endDispatch方法中,Context的码作切换策略取决于线程类型,Vertx线程会使用上下文切换,而非Vertx线程则依赖ThreadLocal。 ContextBase是ContextInternal的实现类,负责执行耗时任务,内部包含TaskQueue来管理任务顺序。WorkerContext和EventLoopContext分别对应工作线程和EventLoop线程的执行策略,它们通过execute()、runOnContext()和emit()方法处理任务,同时监控性能。 Context的创建和获取贯穿于Vert.x的生命周期,它在DeploymentManager的doDeploy方法中被调用,如NetServer和NetClient等组件的底层实现也依赖于Context来处理网络通信。额外说明
Context与线程并非直接绑定,而是根据场景动态管理。部署时创建新Context,非部署时优先获取Thread和ThreadLocal中的Context。当执行异步任务时,当前线程的Context会被暂时替换,任务完成后才恢复。源码中已加入详细注释,如需获取完整注释版本,可联系作者。 Context的重要性在于其在Vert.x的各个层面如服务器部署、EventBus通信中不可或缺,它负责维护线程同步与异步任务的执行顺序,是异步编程中不可或缺的基石。理解Context的实现,有助于更好地利用Vert.x进行高效开发。本大数据框架Hadoop学习书籍推荐
Hadoop,一个用Java编写的Apache开源框架,旨在分布式处理大型数据集。它简化了编程模型,让用户在无需了解分布式底层细节的情况下开发分布式程序。Hadoop成为大数据处理平台的首选,广泛应用于各种生产环境。以下是本关于Hadoop学习的推荐书籍,涵盖了从入门到深入的各个方面。 《Hadoop权威指南》 本书结合理论与实践,由浅入深地介绍了Hadoop这一高性能的海量数据处理和分析平台。读者能探索如何利用Hadoop分析大量数据集,以及如何安装和运行Hadoop集群。 《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》 本书从源代码的角度对MapReduce的架构设计与实现原理进行了详细的解析。适合Hadoop的二次开发人员、应用开发工程师和运维工程师阅读。 《Hadoop技术内幕:深入解析Hadoop Common和HDFS架构设计与实现原理》 本书同样以源代码为基础,深入剖析了Common和HDFS的架构设计与实现原理,适合相关领域专业人士阅读。 《Hadoop技术内幕:深入解析YARN架构设计与实现原理》 本书系统讲解了YARN的基本库和组件用法、应用程序设计方法、以及YARN上流行的计算框架。适合对YARN有深入研究的读者。 《深入理解Hadoop》 作者基于实践经验,深入浅出地讲解了Hadoop框架,包含大量实例和技巧,帮助开发者快速掌握分布式系统。 《Hadoop 2.X HDFS源码剖析》 本书基于Hadoop 2.6.0源码,详细剖析了HDFS 2.X中各个模块的实现细节,适合从架构设计和源码实现角度了解HDFS的读者。 《Hadoop实战》 本书深入浅出地介绍了Hadoop框架和编写数据处理程序所需的实践技能,适合需要处理大量离线数据的云计算程序员、架构师和项目经理。 《Hadoop海量数据处理:技术详解与项目实战》 本书从理论到实践,适合Hadoop初学者,也可作为高等院校相关课程的参考教材。 《Hadoop基础教程》 本书着重讲解了如何搭建Hadoop工作系统并完成任务,适合对Hadoop有初步了解的读者。 《Hadoop构建数据仓库实践》 本书适合数据库管理员、大数据技术人员、Hadoop技术人员和数据仓库技术人员,也是高等院校相关专业的教学参考。 《Hadoop应用架构》 本书提供了专业的券 源码架构指导,适用于设计Hadoop应用或集成Hadoop到现有数据基础架构的读者。 《Hadoop技术详解》 本书全面介绍Hadoop的各项操作,从设计到安装和设置,帮助读者构建稳定可靠的系统。适合希望深入理解Hadoop工作原理的开发者。开源自动化测试平台介绍一览
本文整理了各类自动化测试平台,为开发者提供参考。
一、autotestplat
作者:fin
功能:接口自动化测试、性能测试、appui自动化测试、webui自动化测试
源码:github.com/testdevhome/...
官网:autotestplat.com
语言:python
二、lego
作者:美团
功能:接口自动化测试
源码:未知
官网:tech.meituan.com//0...
语言:java
三、未知
功能:接口自动化测试
源码:github.com/githublitao/...
官网:.../用户名admin密码admin
语言:java
四、luckyframe
作者:seagull
功能:接口自动化测试、appui自动化测试、webui自动化测试
源码:gitee.com/seagull/L...
官网:luckyframe.cn
语言:java
五、automagic
作者:radiateboy
功能:webui测试
源码:github.com/radiateboy/a...
官网:未知
语言:python
六、easytest
作者:wsyu
功能:接口测试
源码:github.com/wsyu/EasyTes...
官网:未知
语言:python
七、eolinker
作者:eolinker
功能:接口测试
源码:github.com/eolinker
官网:eolinker.com
语言:php
八、xtest
作者:breaking
功能:接口测试
源码:github.com/x-utest/
官网:gtestbce.gtapp.xyz/logi...
语言:python
九、hitchhiker
作者:brookshi
功能:接口测试、性能测试
源码:github.com/brookshi/Hit...
官网:hitchhiker-api.com
语言:nodejs
十、Airtest
作者:Meteorix
功能:游戏和appui测试
源码:未知
官网:airtest.netease.com
语言:python
十一、./BSTester/Ope...
官网:bstester.com///wa...
语言:未知
十三、未知
功能:接口自动化测试
源码:未知
官网:.../#...用户名ceshi密码
语言:python
十四、Masteryi
作者:易大师
功能:接口自动化测试
源码:未知
官网:gitee.com/xuwangcheng/m...
语言:python
十五、三剑客
作者:
功能:接口自动化测试
源码:未知
官网:jiekouceshi.com
语言:python
编译实战 | 手摸手教你在Windows环境下运行Redis6.x
哈喽大家好啊,我是没事就愿意瞎捣鼓的Hydra。
不知道有没有小伙伴像我一样,平常开发中用的是windows操作系统,有时候想装点什么软件,一看只支持linux系统,无奈要么启动虚拟机、要么装在云服务器上。
这不前几天又是这样,刚想用一下Redis 6.x版本来尝试一下新特性,打开官网一看,好家伙我直呼内行,果然不支持windows系统:
不过虽然redis的官网上不提供windows版本下载,但是这也难不倒我这个面向百度编程的小能手,一番查找后让我找到了微软在github上维护的几个可以在windows上运行的redis版本:
项目的git地址是/MicrosoftArchive/redis/releases,我翻了一下,微软维护了2.x和3.x的多个windows版本redis,不过比较遗憾,在维护到3.0.正式版本后就放弃了更新。
不过问题不大,眼看微软撂挑子不干了,波兰的热心市民 Tomasz Poradowski 先生这时候站出来,继续开始提供可以在windows上运行的4.x和5.x版本的redis,并且从年到年一干就是5年。
项目git地址是/tporadowski/redis/releases,没错,其实我本地环境运行的redis-5.0.9就是以前从这里下载的,而且绿色版使用起来真的是干净又卫生,所以我强烈建议大家给这位老哥来一个Star支持一下。
不过绕了这么一大圈,我的问题还是没有解决啊,既然没有现成的可以在windows上运行的redis6.x版本,那我们干脆就来自己编译一个吧。
首先介绍一下我们今天要用到的工具Cygwin,先简单看一下它的官网 /,上面很清晰的解释了几个容易引起大家混淆的问题:
先解释了cygwin是什么:
再纠正了大家的常见误区:
其实可以用一句话来概括一下它的功能,cygwin是一个可运行于原生windows系统上的POSIX兼容环境,可以通过重新编译将linux应用移植到windows中。
好了,这样简单了解一下cygwin的功能对我们来说暂时就足够了,下面我们看看如何使用它来编译windows版本redis。
下面我们先进行编译工具Cygwin的下载和安装,在它的官网上就可以直接下载,完成后就可以开始安装了。下面我会贴出一些需要特殊配置的步骤,如果没有特殊说明的话,那么直接痛快的点击下一步就可以了。
网络连接配置这里选择第二项,也就是直接连接,不需要任何代理方式:
在选择下载源这一步,先手动输入User URL,添加阿里云的镜像/cygwin,点击add后再选择我们刚才添加的这个源,然后点击下一步:
接下来选择需要下载安装的组件包,我们只需要下载我们编译相关的模块即可。先通过上面的搜索框进行定位,选择安装Devel模块下面的make、gcc-core,Spintf源码gcc-g++,以及Libs模块下的libgcc1 、libgccpp1,然后点击New这一列的Skip,选择要安装的版本号,全部添加完成后点击下一步:
接下来会自动进行下载上面选择的模块,等待全部下载结束后安装就完成了:
安装完成后,我们运行Cygwin Terminal,通过命令检测可以看到Status为OK,表示cygwin运行正常:
准备好编译工具后,我们接下来先下载redis6.x版本的源码,6.0.的下载地址为:
download.redis.io/relea...
cygwin安装完成后,会在它的安装路径的home目录下,创建一个以你登录系统的用户名来命名的目录,我们把下载完成后的压缩包放到这个cygwin\home\${ user}目录下,在cygwin命令行中先执行解压命令:
使用下面的命令先切换到解压后的根目录,然后执行编译和安装:
点击回车,然后就开始漫长的等待吧,不得不说编译和安装的过程真的很慢,我这大概花了分钟才全部完成。
不出意外的最后果然出现了意外,报了两个Error,不过貌似没有什么太大影响,切换到src目录下,就已经可以看到编译完成后已经生成了6个exe可执行文件了:
但是如果这个时候双击redis-server.exe尝试进行启动的话,那么就会报错提示缺少dll动态链接库:
我们可以在cygwin的bin目录下找到这个文件,为了方便,把可执行文件、动态链接库文件、redis配置文件拷贝到一个单独的目录下再次尝试启动:
这次能够正常启动成功,我们再使用客户端连接工具连接并进行测试,终于,6.0.版本的redis可以在windows环境下正常运行了。
忙活一大顿总算成功了,我们也终于可以在windows上体验redis6.x版本了,不过这里还是给小伙伴们提个醒,这样编译的redis我们平常自己在学习中体验一下就可以了,尽量不要用在生产上。
因为cygwin编译后的程序,相当于在windows系统上模拟实现了POSIX兼容层,应用程序在底层多了一层函数调用,因此效率比运行在linux系统的原生应用低了很多。因此,这样在windows上运行的redis,无疑会损失掉它引以为傲的高性能这一优势。
秉持着好东西就要分享的原则,我也已经把编译好的windows版redis6.0.上传到了网盘,有需要的小伙伴们可以从下面获取下载方式。
那么,这次的分享就到这里,我是Hydra,下期见。
作者简介,码农参上,一个热爱分享的公众号,有趣、深入、直接,与你聊聊技术。个人微信DrHydra9,欢迎添加好友,进一步交流。
cocos教程?
求cocos2d-x教程
cocos教程百度网盘免费资源在线学习
链接:
提取码:e2ht?
cocos教程极客学院Cocos2d-x源码_第5阶段项目实战_第4阶段功能扩展_第3阶段常用功能_第2阶段基础知识_第1阶段环境搭建5使用Eclipse在Ubuntu下搭建Cocos2d-x3集成开发环境4CocosCodeIDE使用3Windows环境下VisualStudio中搭建Cocos2d-x3.1集成开发环境2Cocos2d-x3.1rc0项目创建及新功能介绍1WinMac环境Cocos2d-x开发环境搭建.HelloWorld示例详解.webm.在Mac平台编译成Android程序.webm.Mac平台开发环境搭建.webm
五子棋人机博弈游戏(cocoscreator)
参考文章:CocosCreator实战教程(1)——人机对战五子棋(节点事件相关)
源码:goBang
思考一:作为对手的系统用什么算法下棋?
估值函数、搜索算法和胜负判断等
博弈算法,在极大极小值搜索中应用alpha-beta剪枝
智能五子棋博弈程序的核心算法
智能五子棋中的算法研究
人机版五子棋两种算法概述
思考二:人机博弈的要点
1.棋局的状态能够在机器中表示出来,并能让程序知道当时的博弈状态
2.合法的走法规则如何在机器中实现,以便不让机器随便乱走而有失公平
3.如何让机器从所有的合法走法中选择最佳的走法
4.一种判断博弈状态优劣的方法,并能让机器能够做出智能的选择
5.一个显示博弈状态的界面,有了这样的界面程序才能用的起来而有意义
思考三:五子棋下棋规矩
五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。
整个对局过程中黑方有禁手,白方无禁手。
黑方禁手有三三禁手、四四禁手和长连禁手三种
思考四:人机下棋逻辑
系统先下,黑棋落子,交换下子顺序
玩家下,监测胜负(无胜负,交换下子顺序)
系统下(五元组中找最优位置),监测胜负(无胜负,交换下子顺序)
。。。
直到分出胜负(这里未考虑平局)
出现提示窗,源码报错告知玩家战局结果,同时可选择“返回菜单”或“再来一局”
具体实现:涉及知识点
官方文档--预制资源
将其改名为Chess拖入下面assets文件夹使其成为预制资源
1.在canvas节点上挂载Menu脚本组件
2.在按钮事件中,拖拽和选择相应的Target,Component和Handler
初始化棋子节点断点截图
系统为黑棋的评分表:
找最优位置下子
个人想法
这是我学习五子棋游戏开发的记录,后续还会写其他游戏开发,加油!
cocos游戏脚本怎么使用您好,方法
我们首先启动CocosCreator,然后选择打开其他项目。
在弹出的文件夹选择对话框中,选中我们刚下载并解压完成的start_project,点击打开按钮。
CocosCreator编辑器主窗口会打开,我们将看到项目状态。
在CoC中,游戏场景是开发时组织游戏内容的中心,也是呈现给玩家所有游戏内容的载体。
游戏场景中一般会包括以下内容:场景图像和文字,角色,以组件形式附加在场景节点上的游戏逻辑脚本。
当玩家运行游戏时,就会载入游戏场景,游戏场景加载后就会自动运行所包含组件的游戏脚本,实现各种各样开发者设置的逻辑功能。
CocosCreator放置游戏教程
所以除了资源以外,游戏场景是一切内容创作的基础,让我们现在就新建一个场景。
CocosCreator放置游戏教程
CocosCreator教程(入门篇)自动释放资源:切换场景后,上一个场景中的资源,从内存中释放。
延迟加载资源:意味着不用等待所有资源加载完毕,才显示场景。(快速切换场景,资源陆续在画面显示)
普通图,子层为一张spriteFrame。
创建方式:拖拽场景节点,到资源管理器。
精灵图,子层为多张spriteFrame。(精灵图合成软件:TexturePacker、Zwoptex)
打包时,将所在目录中的所有碎图,合成为图集。
数字为内容的图集。
动态字体:.ttf
位图字体:.fnt+.png(存在于同一目录)
小型动画
模式:webaudio、domaudio
操作流程:
(1)导出:文件=资源导出,选择.fire场景文件,输出assets目录的.zip压缩包。
(2)导入:文件=资源导入,选择压缩包源路径、解压路径,输出assets目录内容。
基于sizemode,尽量去除spriteFrame无像素的部分,减小尺寸。
作用:用于变换、子节点定位基准。
对摄像机、渲染组件的了解。
对widget、layout等UI组件的了解。
(1)创建动画的基本流程
(2)时间曲线(双击动画线,进入编辑窗口)
(3)事件管理(双击游标、加减按钮控制参数个数)
(4)脚本控制
碰撞组件(普通碰撞)
(1)editing——是否为编辑模式
(2)regeneratepoints——计算图形边界,自定生成控制点,数值为控制点的生成密度/准确度
(3)ctrl+点击——删除控制点
(4)组件类型:矩形、圆形、多边形
(5)设置碰撞组(项目=项目设置=分组设置):
制定分组=匹配分组=碰撞组件所在节点上,设置所属分组
(6)脚本控制
Box2D物理引擎(高级碰撞)
(1)audioSource组件
(2)脚本控制
(1)定义CCClass
(2)实例化
(3)判断类型
(4)构造函数(ctor)
(5)实例方法
(6)继承(extends)
(7)父构造函数
(8)完整声明属性
properties常用参数
(1)获得组件所在的节点
(2)获得其它组件
(3)获得其它节点及其组件
(4)访问已有变量里的值(通过模块访问)
(1)节点状态和层级操作
(2)更改节点的变换(位置、旋转、缩放、尺寸)
(3)颜色和不透明度
(4)常用组件接口
cc.Component是所有组件的基类,任何组件都包括如下的常见接口:
(1)创建新节点
(2)克隆已有节点
(3)创建预制节点
(4)销毁节点
(1)加载和切换
(2)通过常驻节点,进行场景资源管理和参数传递
(3)场景加载回调
(4)预加载场景
(1)资源属性的声明
(2)静态加载(在属性检查器里设置资源)
(3)动态加载
(4)加载远程资源和设备资源
(5)资源的依赖和释放
(1)监听事件
(2)关闭监听
(3)发射事件
(4)派送事件
(5)事件对象(回调参数的event对象)
(1)鼠标事件类型和事件对象
(2)触摸事件类型和事件对象
(3)其它事件
(1)动作控制
(2)容器动作
(3)即时动作
(4)时间间隔动作
(5)动作回调
(6)缓动动作
(1)XMLHttpRequest——短连接
(2)WebSocket——长连接
对象池的概念
在同一场景中,需要多次进行节点的生成、消失时,假如直接进行创建、销毁的操作,就会很浪费性能。因此,使用对象池,存储需要消失的节点,释放需要生成的节点,达到节点回收利用的目的。
工作流程
(1)初始化对象池
(2)从对象池请求对象
(3)将对象返回对象池
清除对象池
如何用Cocos引擎打造次世代3D画质‘游戏大观从Cocos2d-x3.0起我们已经可以在游戏中使用3D元素。shootergame 源码Cocos引擎推出3D功能的时间不算太迟,我们已经可以看到越来越多的手机上能流畅地渲染3D游戏,而且这些机型正在成为主流。在最近两年我们可以看到,高端手机游戏从2D转到3D的倾向很明显。许多游戏开发商试图在竞争激烈的红海里占有一席之地,那么选择开发3D游戏或许会是一个强有力的竞争手段。
上面的视频是我的下一款游戏作品《FoodoftheGods》。这游戏使用了Cocos2d-x3.3,视频是从我iPhone上录制的实际运行效果。在这篇文章里我将要介绍我是如何制作它、如何把它跑在cocos引擎上的。对于熟悉cocos官方提供的3D示例游戏《FantasyWarrior》的开发者,将会看到以下一些主要不同点:
1.光照贴图(LightMapping):你将看到每件物体都有被照亮并且投射阴影。光影效果的质量是由你的3D工具软件决定的,用3D软件能烘焙出复杂的光效,包括直接光照,反射光照,以及阴影。
2.顶点合并(VertexBlending):请注意看路、草地和悬崖交接的地方,看不到任何可见的接缝。
3.透明遮罩(AlphaMasks):灌木如果没有透明遮罩就跟纸片一样。
4.滤色叠加的公告板(Billboards):增加一些光束和其他环境的效果。
所有的模型都是用一个叫Modo的3D软件建模制作的,贴图则是使用Photoshop。关于3D模型的制作和贴图的绘制在此就不再赘述,网上已经有很多教程,在此主要介绍下跟Cocos2d-x有关的部分。
模型网格和贴图(MeshesandTextures)
如下图所示,每个模型的贴图都是由几个x或者更小的贴图组成的。同时你也会注意到我把所有的小都合在了一张贴图上,这是减少GPU绘制次数(drawcall)最简单的方法之一。贴图是从或者网上找的。
为了把这些拼接起来,我使用的是Photoshop的补偿滤镜(offsetfilter)然后在接缝的地方用修复画笔来做一些自然的过渡。为了获得一种油画的视觉效果我会先使用cutout滤镜(注意:cutout滤镜也会使得png格式的压缩效果更好),然后在需要的地方绘制一些高光和阴影的效果。我发现如果直接拿照片当贴图的话,当你把它尺寸缩小的时候会出现图像噪点。
另一种方案是为每一个模型网格制作一整张独立的贴图。当网格比较小或者摄像机不是很靠近网格的时候这种方法是可行的。如果你的photoshop技术过硬的话,出来的效果会更好。附带的好处是,因为只使用一张贴图因此只有一次GPU绘制调用。但我不建议采用这种方法来制作第一人称射击游戏(FPS)中的建筑,因为当你走得很靠近建筑物的时候,贴图分辨率过低的问题就会显露出来。我不喜欢用这种整张贴图方法,因为这实在太费时耗力了。这个场景的制作花了我足足四天时间。
光照贴图(LightMaps)
当你做好模型和贴图之后,现在就可以来烘焙光照贴图了。Cocos2d-x目前还不像Unreal或Unity一样在官方编辑器里提供烘焙光照贴图的功能,但是别失望,大部分的制作3D模型的软件都可以烘焙光照贴图,并且效果比市面上任何游戏引擎的效果还好。首先,在你的3D工具软件里,先给场景打好灯光,照亮场景,然后为每份网格制作第二张UVmap。每份网格的表面都必须被映射在0到1范围内的UV平面上。这听起来好像很复杂且耗时,但在Modo里这是非常简单的。我先后使用“Atlasmap”的UV工具和“PackUV”工具,这两个工具会自动将网格展开成一个相当不错的排布图。
这些都完成之后,设置3D工具软件的渲染器为“只渲染烘焙的光照”,然后开始渲染。当然了,如果你想做一些环境光遮罩的效果也是可以的。
你也可以使用一些分辨率较低的光照贴图。有时候这样的效果反而会看起来更好,因为相互混叠的模糊像素会让阴影看起来更柔和。上面的这些建筑都映射到一张x的光照贴图上。整个场景总共使用了4张x的光照贴图。请确保每个小图块之间有一定的空隙,且让你的渲染范围比这些图块的边界多出几个像素。这样可以防止当较低的mip-maps(一种纹理采样)起作用时黑边出现在网格周围的角落里。
最后一点听起来像是3D技术的行话。如果是对TexturePacker熟悉的话,那么其中的“Extrude”值起到的作用就是刚刚我所描述的。对贴图的边缘接缝做一些涂抹处理,这样在精灵之间就不会有那些烦人的缝隙了,那些缝隙在这里会变成多边形边缘的黑边。
如果你想牺牲内存和包大小来提高性能的话,你可以把颜色和光照信息都烘焙到一张贴图上并避免共同使用一张光照贴图。但是这样做的话,同样的像素密度,贴图的大小至少得翻一倍。这完全取决于你个人、以及你游戏的要求。
接下来,添加顶点颜色。我在地形上提供了顶点颜色,这可以让着色器在合成悬崖顶上的草地贴图时,不会有任何可见的接缝。下图中涂成白色的顶点部分可以合成你指定的贴图。在这个例子里实际上我只使用红色通道,当然了根据实际需要你可以使用4个通道(RGBA)去合成不同的贴图。
最后,我把整个场景分成了很多独立的网格(mesh):每个建筑都有自己独立的网格,地形独立一个网格,水也是独立一个。带透明遮罩的贴图也会有一个网格——比如视频中看到的植物叶子和小旗子。我这样做有两个原因,首先,让地形、建筑、水和带透明遮罩的贴图各自使用不同的着色器。其次,我们打算通过不渲染摄像机范围外的对象来减少性能开支。很重要的一点是摄像机会根据网格的包围盒来决定对象是否可见,因此尽量把网格弄成小块,这样包围盒会比较小。
导出
完成了模型和贴图之后,我们需要把每个mesh导出为一个.fbx文件。幸运的是,大多数的3D建模软件都支持这个功能。Autodesk为此格式提供了一个免费SDK。但不幸的是,Modo在导出fbx格式时会出现相当多的错误。因此我必须自己写一些脚本来保证第二组贴图坐标和顶点颜色的正确导出。你可以从我个人网站上的“ModoScripts”部分下载这个导出脚本。搞定fbx之后,你将需要用到Cocos2d-x自带的fbx-conv.exe命令行工具,它位于Cocos2d-x根目录的/tools下。
fbx-conv.exe-ayour_mesh_name_here.fbx
使用“-a”参数后,工具会同时导出mesh的二进制文件(.c3b)和文本格式文件(.c3t)。文本格式的文件非常的有用,你可以利用它来查看所有的东西是否被正确导出,但千万不要把它放到resource目录下。如果所有的都被正确地导出的话,你将在c3t文件的开头看到以下的内容:
“attributes”:[{
“size”:3,
“type”:“GL_FLOAT”,
“attribute”:“VERTEX_ATTRIB_POSITION”
},{
“size”:3,
“type”:“GL_FLOAT”,
“attribute”:“VERTEX_ATTRIB_NORMAL”
},{
“size”:2,
“type”:“GL_FLOAT”,
“attribute”:“VERTEX_ATTRIB_TEX_COORD”
},{
“size”:2,
“type”:“GL_FLOAT”,
“attribute”:“VERTEX_ATTRIB_TEX_COORD1″
}]
注意VERTEX_ATTRIB_TEX_COORD1这个属性。如果没有它光照贴图将无法显示。如果你导出了一张带顶点颜色的mesh,你也应该要看到一个类似的属性才行。还有一点很重要,贴图的坐标也必须按正确的顺序才行。我通常采用的是第一个tex_coord是瓦片贴图,最后一个tex_coord是光照贴图。使用Modo的话,uvmaps会按照字母顺序排列。
着色器(Shaders)
我花了很长的一段时间来搞懂GLSL和着色器,但正如编程中经常遇到的,有时候一个点通了,其他的就都好理解了。一旦理解了其中的原理,你便会发现着色器真的很简单。如果你不只是想用Cocos2d-x来把贴图套到模型网格上的话,你需要学会如何写着色器。目前Cocos2d-x没有Unreal那样好用的着色器可视化编辑器(visualshadereditor),所以我们只能自己动手焊代码。
本节我将讲解我为视频中的游戏场景所写的着色器,并说明我做了什么、为什么这样做。如果你对着色器已经非常熟悉了,那么可以快速跳过本节。
首先,先来看一下如何将着色器应用到模型网格上。
这段代码摘自Cocos2d-x的测试集cpp-tests工程。如果你用不同的着色器来加载大量的meshes,那么最好根据功能来进行,这样可以避免冗余。那么现在我们只关心如下的代码段,来看下这个着色器。
GLProgram*shader=GLProgram::createWithFilenames(“shaders/lightmap1.vert”,”shaders/lightmap2.frag”);
GLProgramState*state=GLProgramState::create(shader);
mesh-setGLProgramState(state);
Texture2D*lightmap=Director::getInstance()-getTextureCache()-addImage(“lightmap.png”);
state-setUniformTexture(“lightmap”,lightmap);
“lightmap1.vert”是顶点着色器(vertexshader)。如果将其应用到网格上,那么每个顶点的每一帧都将执行这个操作。而“lightmap2.frag”是片段着色器(fragmentshader),网格上贴图的每个像素的每一帧都将执行这个操作。我不太确定为什么将其命名为“片段着色器”,我一直认为应叫做“像素”着色器(pixelshader)。从这段描述,我们可以很容易理解为什么大量着色器指令会降低帧率,尤其是你用片段着色器的话。
接下来我们详细地分解顶点着色器:
attributevec4a_position;
attributevec2a_texCoord;
attributevec2a_texCoord1;
这些属性是由渲染器提供的。“a_position”是顶点的位置。“a_texCoord”和“a_texCoord1”对应你那两个UV坐标。还记得在.cbt文本格式文件中开头部分的“VERTEX_ATTRIB_TEX_COORD”么?这些值与属性对应起来了。你可以在渲染器中获取更多其他的属性,包括顶点法线(vertexnormal)和顶点颜色(vertexcolor)。请在cocos引擎的CCGLProgram.cpp中查看完整属性列表。
varyingvec2v_texture_coord;
varyingvec2v_texture_coord1;
“varying”值将被传到片段着色器中(fragmentshader)。片段着色器所需要的任何变量前都需要添加“varying”限定符。这个例子中,我们仅需要知道这两个贴图的坐标。
voidmain(void)
{
gl_Position=CC_MVPMatrix*a_position;
v_texture_coord.x=a_texCoord.x;
v_texture_coord.y=(1.0–a_texCoord.y);
v_texture_coord1.x=a_texCoord1.x;
v_texture_coord1.y=(1.0–a_texCoord1.y);
}
设置顶点位置,拷贝贴图的坐标给varyingvalues,这样片段着色器就可以使用这些值。现在我们一起来分解片段着色器。
#ifdefGL_ES
varyingmediumpvec2v_texture_coord;
varyingmediumpvec2v_texture_coord1;
#else
varyingvec2v_texture_coord;
varyingvec2v_texture_coord1;
#endif
声明从顶点着色器传递过来的“varying”值
uniformsampler2Dlightmap;
还记得在将着色器应用到网格时所使用的state-setUniformTexture(“lightmap“,lightmap);语句么?这个值就是对应语句中的那个贴图。
voidmain(void)
{
gl_FragColor=texture2D(CC_Texture0,v_texture_coord)*(texture2D(lightmap,v_texture_coord1)*2.0);
}
这个语句设置像素颜色。首先你会注意到从未声明过的CC_Texture0变量。Cocos2d-x中有大量可在着色器中使用的默认统一变量。再次强调,可在CCGLProgram.cpp中查看完整属性列表。这个例子中,CC_Texture0对应在3D模型中所应用到网格中的贴图。texture2D命令会在给定的贴图坐标中去查找贴图的像素颜色和透明度。它会返回一个包含了那个像素的RGBA值的vec4值。所以这里我会在UV1中查找到瓦片贴图的颜色值,然后在UV2中查到光照贴图的颜色值,最后把两个值相乘。
你应该注意到了我先是把光照贴图的颜色值两两相乘了。因为贴图颜色值范围为0.0-1.0,所以很显然,如果用白色值vec4(1.0,1.0,1.0,1.0)去乘中间灰值vec4(0.5,0.5,0.5,1.0),那么你仍是得到一个中间灰值vec4(0.5,0.5,0.5,1.0)。
PolarDB-X 源码解读(七):私有协议连接的一生(CN篇)
通过前文的介绍,大家基本了解了一条SQL在polardbx-sql中的解析和执行流程。由于polardbx-sql是无状态的计算节点,真正数据需要从存储节点传输到计算节点,这部分工作由私有协议完成。本文将详细介绍从发送请求到存储节点,接收返回数据的完整流程,重点在于私有协议连接的生命周期和关键代码解析。
概述
为了提高数据节点本地计算能力,同时减少网络数据传输量,计算节点会尽可能下推计算内容。一个逻辑表可能需要多个物理分片,因此计算节点与存储节点的请求会话数量会随着分片数增加而增加。传统MySQL协议+连接池架构已不能满足PolarDB-X的需求,因此私有协议在这一需求场景下应运而生。
如图所示,私有协议采用连接与会话分离的RPC协议设计理念,支持多个会话在同一个TCP通道中并行运行,具备流控机制、全双工响应式工作模式和高吞吐、可扩展等特性。
更多关于私有协议解决上述问题的设计详情,可以参考《PolarDB-X私有协议设计》一文。本文主要从代码层面详细描述私有协议的工作流程。
我们将从计算节点和存储节点两个角度完整解析私有协议连接的生命周期。篇幅限制,本文仅关注计算节点上私有协议的处理,存储节点部分将在后续文章中详细说明。
计算节点
计算节点作为私有协议的客户端,负责发送下推请求,并接收返回的数据。
网络层框架
PolarDB-X私有协议网络层采用定制化Reactor框架实现,基于Java的NIO,改进自polardbx-sql中的Reactor框架。网络层初始化时,设置CPU核心数的2倍(上限为)作为NIOProcessor,每个Reactor使用独立的堆外内存池作为收发包缓冲,总缓冲内存大小限制为堆内存大小的%。
NIO接收的包直接调用注册的处理函数,发送数据仅写入send buf,网络写入由单独线程完成。线程优先写入TCP send buf,当无法写入时,注册OP_WRITE事件等待可写后再写入剩余内容。
数据包的编码和解码在NIOClient中实现。为实现最佳性能,解包流程直接在堆外内存上进行,使用protobuf对流直接解析,将结果放入堆内。堆外内存被切分为KB chunk,每个Reactor独占一个chunk,连续解析和复用,最大化接收、解析效率。对于特大包,额外构造堆内大buffer接收和解析,回退标志在定时任务中重置,连续s无超大包时释放堆内内存,恢复高性能堆外KB buffer接收。
请求发送集成在NIOClient中,writer优先尝试写入发送缓冲队列尾部的buffer,不足时新申请buffer填充并追加到队尾。buffer来自预分配的堆外缓冲池,超过chunk大小时分配堆内buf进行序列化。
同时,NIOClient负责TCP连接的建立和断开资源释放,作为独立的底层网络资源管理实现。
连接及会话
网络层之后,我们聚焦连接与会话分离的具体实现。通过剥离连接及收发包的具体实现,连接和会话的管理变得更加清晰简洁。
首先,一个TCP连接的逻辑抽象结构在XClient中实现,为避免误解,取名为client与JDBC中的Connection区别。该类管理TCP连接和并行运行的会话,负责TCP完整生命周期的管理、认证鉴权,并维护公共信息。其中,workingSessionMap记录了连接上并行运行的所有会话映射关系,可快速通过会话ID找到对应的会话抽象结构XSession。
XSession提供了所有会话相关的请求函数和信息存储,包括执行计划请求、SQL查询请求、SQL更新请求、TSO请求、会话变量处理、数据包处理及异步唤醒等。
连接池及全局单例管理器
为了提高性能,TCP连接和会话的复用必不可少。由于连接和会话的解绑,连接池不仅缓存了到计算节点的TCP连接,也缓存了到计算节点的会话。
XClientPool管理到一个存储节点的连接池,通过IP,端口,用户名三元组唯一确定目标存储节点,同时存储该节点的全部TCP连接(XClient)和建立的会话(XSession)。
XClientPool实现存储节点会话获取,对应JDBC接口中的getConnection,同时实现连接和会话生命周期管理、连接探活、会话预分配等功能。实现单个存储节点连接池后,XConnectionManager维护目标存储节点三元组到实例连接池的映射,管理定时任务线程池,实现定时探活、会话&连接最长生命控制以及连接池预热等功能。
JDBC兼容层
新的SQL协议层对上层使用者要求较高,为了提高开发效率,私有协议提供兼容JDBC的使用方法,实现从JDBC平滑切换至私有协议,并支持协议热切换。
JDBC兼容层代码目录在compatible目录下,Connection继承在XConnection文件中。提供包括DataSource、Connection、Statement、PreparedStatement、ResultSet、ResultSetMetaData在内的大部分常用接口函数实现,不支持的函数会明确抛出异常避免误用。
整体关系
至此,私有协议计算节点端的大部分结构已说明完成。给出一个整体的关系图。
私有协议连接的一生(CN视角)
了解了私有协议各层实现后,我们以发到存储节点的请求为例,完整梳理执行流程。绕开计算节点复杂流程,直接运行代码示例(注:需将com.alibaba.polardbx.rpc.XConfig#GALAXY_X_PROTOCOL设置为true)。
直接运行playground看到预期的select 1的结果。接下来,我们深入跟踪说明。
数据源初始化
要使用私有协议,需要初始化对应存储节点的XDataSource。构造过程中,XDataSource会到XConnectionManager注册新的实例连接池,已存在的连接池引用计数加一。
获取Connection
当需要执行查询时,首先获取会话。无论是显式开启事务还是使用auto commit事务,会话都是执行请求的最小上下文。通过XDataSource的getConnection方法获取到对应存储节点的会话。XDataSource根据存储的IP,端口,用户名三元组查找到XConnectionManager中的连接池,在最高并发检查后,会话获取逻辑在XClientPool实现。首先尝试在空闲会话池中拿会话,通过重置检查和初始化后返回给调用者。大部分场景下,ConcurrentLinkedQueue提供较好的并发性能。
在代码场景下,数据源刚新建,后台定时任务未运行,流程进入连接创建流程。会有一把大锁锁住连接池,在TCP连接未达上限且没有超时的情况下,快速新建一个XClient占坑。若超限,则进入busy waiting循环。真正的TCP connect(waitChannel)在锁外被调用,首先client以阻塞模式带超时方式connect,然后切换为非阻塞模式,round robin策略注册到NIOProcesser上,返回时,TCP连接已建立。
为了兼顾安全和性能,连接鉴权在TCP建连后只用做一次,会话创建不需要鉴权。鉴权在initClient中完成,发送SESS_AUTHENTICATE_START_VALUE包,后续校验由回调完成。认证采用标准的MySQL认证流程,server端返回challenge值,库名、用户名和加盐hash后的密码返回给MySQL即可完成认证。
至此,到存储节点的TCP连接已建立,创建会话是一个异步流程。在创建新XClient时,XConnection已new好,通过下断点跟进去可看到newXSession流程,分配session id,设置状态为init,将XSession绑定到XConnection上。
最后,XConnection经过初始化(重置auto commit状态)、重置默认DB、默认字符集(lazy操作)和统计信息记录,返回给用户使用。
发送查询请求
拿到初始化好的兼容JDBC的Connection,为了简化流程,直接调用XConnection中的execQuery。XConnection的execQuery包装了XSession的execQuery,执行前执行了设置流式模式。
首先记录调用信息进行统计,进入关键的initForRequest流程。XSession初始化流程lazy,仅分配session id,设置状态为Init,真正创建session时发送SESS_NEW给server,绑定新session和session id。如果session已复用,则状态为Ready。
执行字符集更改的lazy操作,session可能在其他请求中切换字符集,根据目标字符集和当前字符集对比,决定是否发送额外的字符集更改请求。
经过一系列变量设置、lazy DB设置和protobuf包构造,请求发送到存储节点执行。发送后,同步生成XResult负责结果解析,同时XResult按照请求顺序依次拉链表,确保结果与请求一一对应。
请求流水线结构如下图所示,处理完成前序请求后,才能解析后续结果。
接收结果集
请求已发送到存储节点执行,拿到XResult,通过XResult收集查询结果集。XResult与发送请求一一对应,存储节点处理也是在会话上排队进行,不会影响流水线上其他请求的返回,保证流水线正常工作。
首先,查看结果集处理的状态机,主要状态包括获取元数据、获取数据行、获取额外信息等,顺序固定,根据请求类型,部分环节可能被省略。报错处理贯穿整个状态机,任何报错信息都会导致状态机进入错误处理环节。
对于非流式数据读取,请求结束时主动调用finishBlockMode将所有数据读出并缓存到rows中。对于流式执行的情况,结果集状态机消费数据包队列由XResult的next函数推动,内部函数internalFetchOneObject递归调用前序XResult,消费前序请求结果,从数据包队列中消费并推动状态机流转。
对于查询,首先收到RESULTSET_COLUMN_META_DATA包,表示返回数据列定义,一个包表示一列。元数据包后,收到包含数据行的RESULTSET_ROW包,一个包对应一行。数据行传输完成后,server端发送RESULTSET_FETCH_DONE标示数据发送完成。请求结束前,NOTICE包用于告知客户端rows affected等信息。最后,SQL_STMT_EXECUTE_OK包标示请求结束。
至此,完整请求处理完成,控制台应显示查询结果。
总结
本文详细描述了私有协议连接流程中的关键点和关键数据结构,相信通过本文描述,大家掌握了私有协议连接流程的基本点,在调试和修改使用中能够更加得心应手。虽然本文篇幅较长,但实际使用中涉及更多高级特性的使用,如多请求流水线、流控、执行计划传输、chunk结果集传输等。通过本文,我们对私有协议连接流程有了深入理解,为在实际场景中应用提供坚实基础。
计算机应用基础(第3版)的课后练习答案
第一章填空:
计算机的发展趋势:巨型化 微型化 网络化 智能化 多媒体化
阶段:电子管计算机 晶体计算机 集成电路计算机 大规模计算机
用途:巨型机 大型机 小型机 工作站 微型机
特点:快速运算 计算精度高 存储功能强 逻辑判断能力 自动运行程序
硬件设备:CPU 总线系统 内存储器 外存储器 输入 输出设备
编码:国标码 内码 外码 汉字字形码
选择:
1-6 C D B D A C
判断:
XXVXX(X错V对)
第二章
填空:
快捷键:WIN+D
按住:shift 按住:ctrl
Ctrl+Z
左右 上下 综合
书写顺序 取大优先 兼顾直观 能连不交,能交不连
选择:
1-6 A D B B D B
判断:
VVXXV
第三章
填空:
菜单元 工具栏 工作区 状态栏
直看正文的宽度 设定左右的界限 直行缩进位置 制表符位置
左对齐 右对齐 两端对齐
横排 竖排
亮度 对比度 灰度
选择:
1-5 A B B D C
判断:
XVVV
第四章
填空:
输入数据 编辑数据 设置数据格式 排序数据 筛选数据
列宽 标准列宽
单元格格式
等于 参数
图表对象
选择:
1-6 A B A C C A
判断:
XVVXVV
第五章
填空:
远程中断联机 计算机网络 计算机网络互联
服务器模式 对等模式
环形网 星型网 总线网 混合型
TCP/IP协议 IPX/SPX协议 NetBEUI协议 AppleTalk协议
A类B类C类
选择:
CADCD
判断:
XXVV
第六章
选择:D B A C A A
第八章
填空:
多媒体硬件 软件
多媒体立机 多媒体输入设备 多媒体存储设备 多媒体输出设备 功能键 操控控动设备 信息采集 信息回收
熵编码 信息源码
选择:
B B A
判断:
VXV
《计算机应用基础》(第3版)一书是为高等院校的计算机基础课教学而编写的教材,内容包括:计算机信息技术基础知识,Windows XP的基本操作、资源管理、环境设置和常用附件使用,办公软件Word XP、Excel XP和PowerPoint XP的操作使用, Internet基础知识及Internet应用,用FrontPage XP制作网页,压缩工具、系统优化工具、图像工具、下载工具和杀毒工具等常用工具软件。
本书知识面广,内容丰富,并配《计算机应用基础(第二版)实训指导》和课件光盘。本书可作技术应用型本科教材,也可作高职高专教材。各院校在使用时可根据具体情况对教材中的内容进行取舍。
作者:刘刚
出版社:上海交通大学出版社
出版时间:年月
2024-11-30 20:32
2024-11-30 20:18
2024-11-30 19:25
2024-11-30 19:09
2024-11-30 18:27