1.Entity Model Studio功能介绍
2.JDK编译时注解处理器结合Javapoet动态生成模板化Java源文件
3.一文看懂ECS架构
4.源码看饥荒第二期 entity与prefab
5.重磅!源码MyBatis-Plus 可视化代码生成器来啦,源码开发效率提升2倍 !源码
6.cesium 笔记-自定义Primitive
Entity Model Studio功能介绍
Entity Model Studio以其UML标准为基础,源码提供了直观的源码图形化建模工具。它对UML进行了简化,源码ndp源码既保持了UML的源码核心价值,又易于用户操作。源码其数据库设计与实体静态模型紧密相连,源码采用面向对象的源码物理数据库设计方式,成功地将实体模型中的源码继承和多态特性应用到实际设计中。这个工具支持Sql Server()和Oracle(g)数据库,源码使得数据库生成、源码同步和逆向生成实体模型变得轻松便捷。源码
对于源代码和文档生成,源码Entity Model Studio支持C#和VB .NET语言,生成的源代码完全基于模型,与实体类的内容保持一致。此外,它还能自动生成描述数据库表结构的详细文档,为开发者提供了丰富的开发文档支持。
引入Eql(Entity Query Language),这是一种基于宿主语言的SQL接口,使开发者能够以熟悉的编码方式编写SQL语句,同时EMLib作为ORM框架,提供了强大的功能。EMLib实现了全面的面向对象数据库操作,包括对象关系映射,实体关系和属性的全面支持,以及多态特性的应用。它还包含懒加载、数据刷新、可控制的级联操作,以及内存事务和全局对象查询等特性,极大地提升了面向对象数据库开发的效率和灵活性。
JDK编译时注解处理器结合Javapoet动态生成模板化Java源文件
面对繁复的业务代码和重复劳动,我们一直在寻求更高效的解决方案。Lombok的出现,通过其注解如@Data,能自动生成getter、setter等方法,简化了代码编写。然而,对于自定义对象和集合类型,如JPA中需要扩展AttributeConverter的情况,如何减少手动编写转换类的繁琐呢?
答案在于利用Java的编译时注解处理器(Annotation Processing Tool,APT)和JavaPoet源代码生成器。APT在编译阶段处理注解,源码ice通过动态生成.java源代码,能解决重复代码问题。JavaPoet则提供了优雅地生成代码的功能,让代码生成变得轻松。
具体步骤如下:首先,理解AttributeConverter的工作原理,它在Entity和数据库之间建立数据关联。我们创建一个通用的Converter基类,如AbstractJsonConverter,用于处理类型转换。接着,定义一个自定义注解JsonAutoConverter,标记需要生成Converter的类,由AnnotationProcessor扫描并处理,生成相应的源代码,如OrderNoticeEventConverter。
通过执行编译命令,我们能在生成的源文件中看到JavaPoet生成的Converter类,它继承自AbstractJsonConverter,实现了特定类型的转换。这个例子展示了如何利用JDK编译时注解处理器结合Javapoet动态生成模板化的Java源文件,以减少重复工作,提升编码效率。
开发中的"小技巧"往往隐藏在深处,只要我们愿意探索,就能发现并应用它们,打开新的编程世界。源码地址:/zhucan/extension-spring-boot-starter/tree/master/jpa-conversion,欢迎有兴趣的朋友查看和学习。
一文看懂ECS架构
在游戏开发中,ECS架构是一种解决实际问题的高效方式。其核心思想是通过组合和数据打包优化性能,而非传统的继承结构。以下是ECS架构的三个关键部分的概述。
实体(Entity):每个实体仅包含一个唯一的ID,代表其身份。
组件(Component):组件是相关功能数据的集合,如Transform组件包含位置和旋转信息。每个组件类型对应一个独一无二的ID,用于跟踪和匹配。
签名(Signature):通过std::bitset表示实体拥有的组件集合,每个组件类型在位图中对应一个位置。系统通过比较其关心的组件签名和实体签名,确保所需组件的匹配。
实体管理器(EntityManager):负责ID的分配与回收,使用队列管理可用ID,保证高效创建和销毁操作。cid源码
组件数组(Component Array):存储同类型组件的数据,通过映射保持数据紧凑,避免无效数据影响性能。当实体被销毁,数据需重新组织以保持数组连续性。
系统(System):关注特定组件签名的实体列表,通过std::set保持高效查找,处理相关组件的逻辑。
系统管理器(System Manager):维护已注册系统及其签名,确保与Component Manager和EntityManager的协调。
协调器(Coordinator):整合所有Manager,提供跨Manager操作的接口,简化代码结构。
通过一个实例,比如,立方体受重力影响的场景,ECS架构展示出其在性能上的优势。但也要注意,ECS不适用于所有场景,通常在对性能要求高的部分,如物理模拟,采用ECS。
学习ECS架构的深入资料可以参考Austin Morlan的"A Simple Entity Component System (ECS) [C++]",源代码和详细解释可在相关链接中获取。
源码看饥荒第二期 entity与prefab
引言
entity,中文一般称为实体,指的是游戏中出现的一切物体,包括看不见的物体和随处可见的花草。创建实体没有任何门槛,在创建之后可以随意改造。prefab是一种模板,用于存放所有能体现实体独特性的东西,包括各种资源和初始化代码。使用prefab可以方便地生成多种实体,减少代码重复和维护成本。
prefab与entity的区别在于,entity是实实在在占用资源的物体,而prefab只是模板,占用资源较小。class与prefab之间的区别在于,prefab在定义后无法在运行中修改,而class在许多语言中支持运行时修改。
预制物定义
预制物通过Prefab类构建,包含名称、初始化函数、资源文件路径、依赖和是否强制搜索路径等参数。初始化函数描述了预制物在生成时如何设置,bldc 源码例如动画、外形、攻击属性等。
初始化函数
初始化函数在预制物中通常包含多个部分,包括创建实体、添加底层组件、添加tag、设置StateGraph和Brain、添加Component以及监听和其它设置。预制物创建后,实体会被封装为EntityScript类的一个实例,用于后续操作。
底层组件
底层组件用于控制实体的行为,如动画、声音播放、位置变化等。这些组件与Component有类似用法,但定义代码被封装在游戏引擎内部,无法直接修改。在初始化时,会添加对应的底层组件,并设置初始化参数。
Tag标记
Tag用于区分预制物类型,系统根据标记对预制物进行响应。在初始化时,需要添加相应的标记,如玩家标记、蜘蛛标记等。
StateGraph和Brain
StateGraph和Brain负责实体的状态管理,包括状态转换、行为决策等。在预制物初始化中,为预制物设置StateGraph和Brain。
Component组件
Component组件为预制物提供丰富功能,如移动能力、吃东西能力、存储物品能力等。添加和初始化组件时,需遵循官方提供的函数和标准组件。
监听机制
监听机制用于在满足特定条件时执行动作,如实体在特定季节的外观变化、受到攻击后的逃跑行为等。通过设置触发器和回调函数来实现。
其它设置
其它设置包括为实体添加特定任务、检查条件执行动作等个性化处理。例如,使用inst:DoTaskInTime为实体执行特定任务。hippo源码
结语
预制物为生成实体提供模板,其中最重要的部分是初始化函数。初始化函数包含多个部分,如创建实体、底层组件、标记、状态图和大脑、组件以及监听和其它设置。通过学习预制物代码,可以理解实体是如何构建的。下期将讲解游戏组件,包括系统组件和自定义组件。预制物解释了物体构建方式,组件则提供了丰富功能。
重磅!MyBatis-Plus 可视化代码生成器来啦,开发效率提升2倍 !
基于Mybatis-Plus的代码自助生成器
在使用Mybatis-Plus进行开发时,可以提高开发效率。然而,常规的代码生成工具可能无法满足所有需求,尤其是对于多数据库的支持,以及高度定制化的要求。因此,一款支持图形用户界面的代码生成框架变得尤为重要。本文介绍了一款名为mybatis-plus-generator-ui的代码生成器,旨在为开发者提供更加高效、灵活的代码生成解决方案。
mybatis-plus-generator-ui是基于Mybatis-Plus生成器进行封装,通过Web界面快速生成兼容Spring Boot和Mybatis-Plus框架的业务代码。它提供了交互式的Web界面,让开发者能够生成符合Mybatis-Plus框架的实体类(Entity)、映射类(Mapper)、Mapper.xml、服务类(Service)、控制器类(Controller)等。此外,该工具支持自定义模板和各类输出参数,甚至可以通过SQL查询语句直接生成代码。
要使用mybatis-plus-generator-ui,首先可以通过Maven引入jar包,并创建一个程序入口,使用main函数运行。从1.4.0版本开始,mybatis-plus-generator-ui支持独立部署为Spring Boot项目,通过页面指定目标项目的根目录,为多个项目提供源码生成服务。配置示例包括数据库连接信息、运行端口以及默认的模板目录地址。
使用mybatis-plus-generator-ui进行代码生成时,可以浏览和查询配置的数据源的数据表信息,选择生成模板代码。工具内置了多种代码模板配置,包括Entity、Mapper、Service、Controller等,并提供了模板替换和参数修改功能。此外,支持策略配置,如是否覆盖原有文件、生成文件的种类等。SQL配置生成功能允许用户通过输入SQL查询语句,自动生成对应的查询方法、DTO对象和ResultMap。
为了满足不同团队的需求,mybatis-plus-generator-ui提供了代码模板调整和自定义扩展功能。开发者可以通过修改btl模板文件来自定义代码生成的各个方面,包括代码层级配置、服务层、控制器层、实体类命名等。mybatis-plus-generator-ui的前端界面也支持自定义修改,只需将代码clone下来,进入frontend目录进行扩展开发即可。
总结来说,mybatis-plus-generator-ui为基于Mybatis-Plus的开发提供了高效、灵活的代码生成工具,简化了代码开发流程,提高了开发效率。通过实例集成和详细的扩展开发介绍,本文旨在为有需要的开发者提供实用的指导和帮助。
cesium 笔记-自定义Primitive
在 Cesium 技术中,`Primitive` 是一个关键接口,尤其对于新手来说,通常会更熟悉 `Entity`。官方也提供了相应的指导文档来解释 `Entity` 和 `Primitive` 的区别。相比之下,`Entity` 在 Cesium 中属于更上层的接口,它封装了一系列的图形,提供了一致的对外 API,更加易于理解和使用。`Entity` 具备强大的属性功能,但性能方面不如更底层的 `Primitive`。而 `Primitive` 更多面向底层图形开发人员,通过 `Geometry` 和 `Appearance` 实现更底层的绘制操作。它提供了接近原始 WebGL 的接口,但在上层进行了一定的封装,使其相对于原始 WebGL 更加易于使用。
使用 `Primitive` 创建一个矩形并添加贴图,主要代码如下。第一步是创建一个矩形,并添加所需的贴图。在第二步,我们考虑更改皮肤。我们知道,像 Windy 的色斑图渲染通常使用 canvas 方式,而现在我们使用单通道,可以考虑类似 Wind-Layer 的方式在着色器中进行双线性插值和着色,使渲染效果更佳。下面是如何进行改造的步骤。
在着色器中,我们创建一个 * 1 的 canvas 来兼容渐变色带和非渐变色带,具体效果可以通过观察结果来验证。接着,我们修改材质的 uniforms,并新增一些数据以适应这个变化。然而,到目前为止,我们还无法获得预期效果。我们还需要修改 fabric 以添加一个新的材质着色器。最后,我们改变 options.colorScaleType,将其设置为 step,并指定插值步长,重新查看效果。
在实现预期效果后,我们提出需求,需要针对瓦片数据进行拾取。基于材质的修改,我们尝试使用默认的 `scene.pick` 方法。虽然结果表明 `Primitive` 被正确拾取,但我们无法获取对应数据位置的像素数据。因此,我们考虑使用鼠标位置计算其在原始灰度数据瓦片的位置,然后读取数据。然而,在处理大规模图像数据时,这种方法在 JS 中操作效率较低。为提高效率,我们应考虑使用类似 `pick` 的方式通过 GPU 进行读取,这需要我们对 `Primitive` 进行自定义。
自定义 `Primitive` 需要实现以下接口,以达到实现上节效果的目的。关键点包括顶点着色器实现、顶点数据生成、适应 3D 和 2D 渲染需求、数据投影兼容性、渲染过程和拾取操作。在 SCENE3D 下渲染时,代码可以正常工作,但在 SCENE2D 和 COLUMBUS_VIEW 视图中无法渲染。我们在查看 Cesium 相关资料时发现,实际内部使用的顶点数据是区分 3D 和 2D 的。在源码的 `Primitive.prototype.update` 函数中,可以看到它并未直接使用 `vertexArray` 的数据,而是经过了一系列处理步骤。这些步骤包括 `PrimitivePipeline.combineGeometry` 的处理,以及 `loadSynchronous` 和 `createVertexArray` 的具体工作,有兴趣的开发者可以自行查看源码。完成这些处理后,需要根据 `va` 的数量生成多个 `DrawCommand`。
数据投影兼容性是实现自定义 `Primitive` 的重要部分,特别是在使用不同投影系统时。例如,当使用 Web Mercator 纹理数据时,需要对数据进行重投影计算。在实现中,这一步骤确保了与 Cesium 内部使用的投影系统相兼容。
在创建 `DrawCommand` 同时,应创建与之对应的 framebuffer 的渲染。这两个渲染是一一对应的,fboShaderProgram 的顶点着色器复用真实绘制的顶点着色器,但在去除灰度值与色带的对应逻辑后,将计算结果保存到 framebuffer 的纹理输出。从 framebuffer 读取像素值的过程较为复杂,需要先将对应数据渲染到 framebuffer,然后读取鼠标位置的颜色值,根据传入参数计算像素值对应的数值。
在完成以上步骤后,即可实现预期功能,如对鼠标位置的像素值进行计算,进而获取真实值。这涵盖了自定义 `Primitive` 的关键实现过程,包括渲染、拾取操作等,为实现更复杂的图形渲染功能提供了基础。
C++中 数据类型和变量名的区别和联系
首先,数据类型即对象类型是一种类型(type),是一种实体(entity);而变量名是指称(denote)变量(viarable)这种实体的名称(name)。通过名称指称实体是语言中表达实体存在性的手段。实体是语言所要表达的语义,而名称则是在代码中通过字符方式体现的,两者是不同的概念。类似地,人是一个实体,人的姓名是名称,可以通过姓名来指代一个人,但不能把两者等同起来。(尽管一般教材对这点比较模糊甚至根本没有叙述,理解实体和名称的不同是非常重要的。)LS的论述显然就是忽略了这点的反面教材之一(LZ的老师或许只是口误)。
其次,“类型”和“变量”C++语言中的两种实体。变量是一种对象,而对象是在程序运行期是在随机存储器(例如内存的栈和寄存器)中可以有对应实际存在的数据的实体;变量起的主要作用是表达一个值;同时,因为是对象,具有确定的类型。对象的类型则可以理解为是对对象进行的分类,以便在编译期根据不同的类型分配具体操作以及进行静态类型检查。关于(静态)类型存在的必要性,举例来说,位和位整数加法对应的指令可以是不同的,如果只定义了一个i,那么编译器不知道诸如表达式i + i中的+应该被编译成哪条指令。而确定了i是int类型(一般为位),编译器就可以知道这个+是指哪条指令了。
C++是强类型语言,编译期定义对象时类型必须被确定,且无法改变。这点在某种意义上保证了对于确定对象的操作的确定性:对于不兼容的操作,很可能因为无法通过静态类型检查无法而产生编译错误,这样能够有效地减少用户写出能通过编译但逻辑上有错误的代码。
注意类型不是对象。从源代码的角度而言,类型不是语言的一等公民(first-class citizen)/第一类实体(first-class entity),大部分对于对象的操作都不能作用于类型之上,例如C++中类型不能作为函数(包括运算符)的参数(在参数列表中出现仅指示参数对象的类型),而只能作为模板(template)的参数;注意调用操作符的表达式实质上和函数调用相同。这样,要是写int + int会引起编译错误:int是类型而不是对象;int a = 0, b = 1, c; c = a + b;之类的则没有问题:a和b是经过声明的对象,对象可以和操作符+组成表达式。从目标代码的角度而言,编译器知道对象的类型,但编译后的目标代码不包含类型信息(用RTTI特性可以映射类型为对象然后进行操作,但受到严格的限制)。
----
以下是严格的定义,参照C++:
3 Basic concepts
--
3 An entity is a value, object, subobject, base class subobject, array element, variable, function, instance of a
function, enumerator, type, class member, template, or namespace.
4 A name is a use of an identifier (2.) that denotes an entity or label (6.6.4, 6.1). A variable is introduced
by the declaration of an object. The variable’s name denotes the object.
----
题外话:
声明是指在声明所在处引入一个名称,这个名称从声明开始到作用域结束(取决于声明本身所在的位置)持续有效(特殊情况下被另外声明的同名名称隐藏除外)。定义是指在源代码所在的翻译单元(可以简单理解为包含了头文件的源文件)引入一个实体。定义一个某个类型的对象也称为类型的实例化(instantiation)。定义了的对象是这个类型的一个实例(instance)。
====
[原创回答团]
quot;是什么意思
转义字符。在HTML转义符、java 转义符、xml 转义符、 oracle 转义符、sql 转义符 、sqlserver 转义符php 转义符、asp 转义符、vb转义符、 javascript 转义符等等,还有网址中的百分号。
例如,HTML的< >&"©分别是<,>,&,",©;的转义字符
XML只有5个转义符: < >& " '
扩展资料:
转义字符组成
1,转义字符串(Escape String),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。比如,要显示小于号(<),就可以写 < 或者 < 。
2,用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。提示:实体名称(Entity)是区分大小写的。
3,备注:同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。
参考资料:
百度百科——转义字符