一种3D引擎设计方法和装置与流程

文档序号:22756968发布日期:2020-10-31 09:54阅读:79来源:国知局
一种3D引擎设计方法和装置与流程

本申请涉及数据处理技术领域,尤其涉及一种3d引擎设计方法和装置。



背景技术:

随着计算机技术的不断发展和计算机技术的不断提高,电子娱乐逐渐成为人们的一种重要的休闲娱乐方式。3d游戏以其虚幻的场景画面、逼真的人物造型以及体验的真实性和良好的交互性已经成为人们喜爱的一种主流娱乐方式。

3d引擎引擎技术,简单的说就是把3d游戏中可以重复利用的部分,用一种模块化的方式将其封装起来,使其达到最优化,使得游戏开发人员能在3d引擎的基础上进行快速的游戏开发。3d引擎在各种领域均有广泛的应用,例如军方的模拟训练系统,电力公司的模拟电厂,铁路行业等等。

但本申请发明人在实现本申请实施例中技术方案的过程中,发现上述现有技术至少存在如下技术问题:

在现有技术中,3d引擎一般采用一种固定的渲染协议,渲染效果不好,图像画质不佳。

申请内容

本申请实施例通过提供一种3d引擎设计方法和装置,解决了现有技术中3d引擎采用一种固定的渲染协议,渲染效果不好,图像画质不佳的技术问题,达到了采用多个渲染协议,根据性能优先原则自动选择渲染协议,提高渲染效果,增强图像画质的技术效果。

为了解决上述问题,第一方面,本申请实施例提供了一种3d引擎设计方法,所述方法包括:获得第一渲染协议;获得第二渲染协议;根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

优选的,所述如果所述第一性能优于所述第二性能信息之后,包括:判断所述第一渲染协议是否可用;如果所述第一渲染协议可用,根据所述第一渲染协议进行渲染;如果所述第一渲染协议不可用,根据所述第二渲染协议进行渲染。

优选的,所述方法包括:获得第一指令;根据所述第一指令,获得第一引擎功能;获得第二引擎库;判断所述第一引擎功能是否在所述第二引擎库中;如果所述第一引擎功能在所述第二引擎库中,对所述第一引擎功能进行调用。

优选的,所述方法包括:如果所述第一引擎功能不在所述第二引擎库中,获得第一提醒指令,所述第一提醒指令用于提醒所述第二引擎库进行更新;根据所述第一提醒指令,对所述第二引擎库进行更新。

优选的,所述获得第二引擎库,包括:构建第一引擎库;获得第一预定时长阈值;根据大数据对所述第一引擎库按照所述第一预定时长阈值为周期进行更新,获得第二引擎库。

优选的,所述方法包括:获得屏幕xy轴信息;获得第一纹理信息;根据所述屏幕xy轴信息和所述第一纹理信息,获得第一角度差,所述第一角度差为所述屏幕xy轴信息和所述第一纹理信息之间的角度差;获得第一预定角度差阈值;判断所述第一角度差是否超过所述第一预定角度差阈值,获得第一判断结果;根据所述第一判断结果,确定是否过滤掉所述第一纹理信息。

优选的,所述方法包括:如果所述第一判断结果为所述第一角度差超过所述第一预定角度差阈值,过滤掉所述第一纹理信息;如果所述第一判断结果为所述第一角度差未超过所述第一预定角度差阈值,保留所述第一纹理信息。

第二方面,本申请实施例还提供了一种3d引擎设计装置,所述装置包括:

第一获得单元,所述第一获得单元用于获得第一渲染协议;

第二获得单元,所述第二获得单元用于获得第二渲染协议;

第一判断单元,所述第一判断单元用于根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

第一渲染单元,所述第一渲染单元用于如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

优选的,所述装置包括:

第二判断单元,所述第二判断单元用于判断所述第一渲染协议是否可用;

第二渲染单元,所述第二渲染单元用于如果所述第一渲染协议可用,根据所述第一渲染协议进行渲染;

第三渲染单元,所述第三渲染单元用于如果所述第一渲染协议不可用,根据所述第二渲染协议进行渲染。

优选的,所述装置包括:

第三获得单元,所述第三获得单元用于获得第一指令;

第四获得单元,所述第四获得单元用于根据所述第一指令,获得第一引擎功能;

第五获得单元,所述第五获得单元用于获得第二引擎库;

第三判断单元,所述第三判断单元用于判断所述第一引擎功能是否在所述第二引擎库中;

第一调用单元,所述第一调用单元用于如果所述第一引擎功能在所述第二引擎库中,对所述第一引擎功能进行调用。

优选的,所述装置包括:

第六获得单元,所述第六获得单元用于如果所述第一引擎功能不在所述第二引擎库中,获得第一提醒指令,所述第一提醒指令用于提醒所述第二引擎库进行更新;

第一更新单元,所述第一更新单元用于根据所述第一提醒指令,对所述第二引擎库进行更新。

优选的,所述装置包括:

第一构建单元,所述第一构建单元用于构建第一引擎库;

第七获得单元,所述第七获得单元用于获得第一预定时长阈值;

第八获得单元,所述第八获得单元用于根据大数据对所述第一引擎库按照所述第一预定时长阈值为周期进行更新,获得第二引擎库。

优选的,所述装置包括:

第九获得单元,所述第九获得单元用于获得屏幕xy轴信息;

第十获得单元,所述第十获得单元用于获得第一纹理信息;

第十一获得单元,所述第十一获得单元用于根据所述屏幕xy轴信息和所述第一纹理信息,获得第一角度差,所述第一角度差为所述屏幕xy轴信息和所述第一纹理信息之间的角度差;

第十二获得单元,所述第十二获得单元用于获得第一预定角度差阈值;

第十三获得单元,所述第十三获得单元用于判断所述第一角度差是否超过所述第一预定角度差阈值,获得第一判断结果;

第一确定单元,所述第一确定单元用于根据所述第一判断结果,确定是否过滤掉所述第一纹理信息。

优选的,所述装置包括:

第一过滤单元,所述第一过滤单元用于如果所述第一判断结果为所述第一角度差超过所述第一预定角度差阈值,过滤掉所述第一纹理信息;

第一执行单元,所述第一执行单元用于如果所述第一判断结果为所述第一角度差未超过所述第一预定角度差阈值,保留所述第一纹理信息。

第三方面,本申请实施例还提供了一种3d引擎设计装置,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现以下步骤:

获得第一渲染协议;

获得第二渲染协议;

根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

第四方面,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:

获得第一渲染协议;

获得第二渲染协议;

根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:

本申请实施例通过提供一种3d引擎设计方法和装置,所述方法包括:获得第一渲染协议;获得第二渲染协议;根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。解决了现有技术中3d引擎采用一种固定的渲染协议,渲染效果不好,图像画质不佳的技术问题,达到了采用多个渲染协议,根据性能优先原则自动选择渲染协议,提高渲染效果,增强图像画质的技术效果。

上述说明仅是本申请技术方案的概述,为了能够更清楚了解本申请的技术手段,而可依照说明书的内容予以实施,并且为了让本申请的上述和其它目的、特征和优点能够更明显易懂,以下特举本申请的具体实施方式。

附图说明

图1为本发明实施例中一种3d引擎设计方法的流程示意图;

图2为本发明实施例中一种3d引擎设计装置的结构示意图;

图3为本发明实施例中另一种3d引擎设计装置的结构示意图。

附图标记说明:第一获得单元11,第二获得单元12,第一判断单元13,第一渲染单元14,总线300,接收器301,处理器302,发送器303,存储器304,总线接口306。

具体实施方式

本申请实施例提供了一种3d引擎设计方法和装置,解决了现有技术中3d引擎采用一种固定的渲染协议,渲染效果不好,图像画质不佳的技术问题,达到了采用多个渲染协议,根据性能优先原则自动选择渲染协议,提高渲染效果,增强图像画质的技术效果。

为了解决上述技术问题,本申请提供的技术方案总体思路如下:

一种3d引擎设计方法,所述方法包括:获得第一渲染协议;获得第二渲染协议;根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。解决了现有技术中3d引擎采用一种固定的渲染协议,渲染效果不好,图像画质不佳的技术问题,达到了采用多个渲染协议,根据性能优先原则自动选择渲染协议,提高渲染效果,增强图像画质的技术效果。

下面通过附图以及具体实施例对本申请技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。

实施例一

本发明实施例提供的一种3d引擎设计方法,所述3d引擎设计方法应用于一3d引擎。如图1所示,所述方法包括:

步骤110:获得第一渲染协议;

步骤120:获得第二渲染协议;

步骤130:根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

步骤140:如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

具体而言,所述3d引擎包括渲染模块,所述渲染模块根据3d场景中的数据结构(如摄像机位置、灯光类型、贴图模式等等)来渲染场景,它的强大与否直接决定着最后游戏画质的质量。所述渲染模块采用webgl(webgraphicslibrary)渲染和canvas渲染两种方式,其中所述webgl渲染为第一渲染方式,所述canvas渲染为第二渲染方式,所述第一渲染方式采用所述第一渲染协议,所述第二渲染方式采用所述第二渲染协议。对同一3d场景的数据结构进行渲染,所述第一渲染方式的性能为所述第一性能信息,所述第二渲染方式的性能为所述第二性能信息,当所述第一性能信息优于所述第二性能信息时,说明所述第一渲染方式更适合所述3d场景,采用所述第一渲染协议对所述3d场景进行渲染;当所述第二性能信息优于所述第一性能信息时,说明所述第二渲染方式更适合所述3d场景,采用所述第二渲染协议对所述3d场景进行渲染,达到根据渲染协议渲染性能的优劣自动选择渲染协议,采用性能优越的渲染协议对3d场景进行渲染,提升渲染效果,增强图像画质的技术效果。

优选的,所述如果所述第一性能优于所述第二性能信息之后,包括:

判断所述第一渲染协议是否可用;

如果所述第一渲染协议可用,根据所述第一渲染协议进行渲染;

如果所述第一渲染协议不可用,根据所述第二渲染协议进行渲染。

具体而言,所述渲染模块包括底层接口,所述第一渲染协议、所述第二渲染协议适用于不同的底层接口,当所述第一渲染协议适合所述底层接口时,则所述第一渲染协议可用,所述渲染模块采用所述第一渲染协议对3d场景进行渲染;当所述第一渲染协议不适合所述底层接口时,则所述第一渲染协议不可用,所述渲染模块采用所述第二渲染协议对3d场景进行渲染,达到根据渲染协议与所述底层接口的匹配与否对是渲染协议进行自动选择,使所述渲染协议与所述底层接口相匹配的技术效果。

进一步的,所述方法包括:

获得第一指令;

根据所述第一指令,获得第一引擎功能;

获得第二引擎库;

判断所述第一引擎功能是否在所述第二引擎库中;

如果所述第一引擎功能在所述第二引擎库中,对所述第一引擎功能进行调用。

进一步的,所述方法包括:

如果所述第一引擎功能不在所述第二引擎库中,获得第一提醒指令,所述第一提醒指令用于提醒所述第二引擎库进行更新;

根据所述第一提醒指令,对所述第二引擎库进行更新。

具体而言,所述3d引擎包括第二引擎库,所述第二引擎库实质上是一个程序数据库。所述第二引擎库内包括多个引擎功能,每个所述引擎功能对应一个实现程序。所述第一指令为用户需要实现的某个功能指令,所述第一指令对应第一引擎功能。根据所述第一引擎功能在所述第二引擎库中进行检索,判断所述第二引擎库中是否包含实现所述第一引擎功能的程序。如果所述第二引擎库中包含所述第一引擎功能,则调用所述第一引擎功能所对应的实现程序;如果所述第二引擎库中不包含实现所述第一引擎功能,则通过人机交互界面向用户发送所述第一提醒,提醒用户所述第二引擎库中没有所述第一引擎功能。用户根据所述第一提醒将所述第一引擎功能添加到所述第二引擎库中,实现对所述第二引擎库的更新,达到将所述第二引擎库中缺少的引擎功能及时加入到所述第二引擎库中,丰富所述第二引擎库的引擎功能,及时更新所述第二引擎库的技术效果。对所述第二引擎库实现更新后,所述用户可以通过所述第一指令调用所述第一引擎功能。

进一步的,所述获得第二引擎库,包括:

构建第一引擎库;

获得第一预定时长阈值;

根据大数据对所述第一引擎库按照所述第一预定时长阈值为周期进行更新,获得第二引擎库。

具体而言,所述第一引擎库为所述3d引擎的基础程序数据库,在所述3d引擎创建完成时即包含所述第一引擎库。所述第一引擎库中包含有多个引擎功能,每个引擎功能对应一个实现程序。为了使所述3d引擎的功能更加强大,需要定期对所述第一引擎库进行更新,将所述第一引擎库中缺少的引擎功能添加进去。所述3d引擎包括引擎更新模块,所述引擎更新模块以所述第一预定时长阈值为周期,对大数据进行收集,判断是否存在第二引擎功能,其中所述第一引擎库不包含所述第二引擎功能,所述第一预定时长阈值用户可以根据实际需求进行设置。如果存在所述第二引擎功能,将所述第二引擎功能加入到所述第一引擎库中,包含所述第二引擎功能的所述第一引擎库即为所述第二引擎库。达到了定期对3d引擎的引擎库进行更新,使所述3d引擎的功能更全面、更强大的技术效果。

进一步的,所述方法包括:

获得屏幕xy轴信息;

获得第一纹理信息;

根据所述屏幕xy轴信息和所述第一纹理信息,获得第一角度差,所述第一角度差为所述屏幕xy轴信息和所述第一纹理信息之间的角度差;

获得第一预定角度差阈值;

判断所述第一角度差是否超过所述第一预定角度差阈值,获得第一判断结果;

根据所述第一判断结果,确定是否过滤掉所述第一纹理信息。

进一步的,所述方法包括:

如果所述第一判断结果为所述第一角度差超过所述第一预定角度差阈值,过滤掉所述第一纹理信息;

如果所述第一判断结果为所述第一角度差未超过所述第一预定角度差阈值,保留所述第一纹理信息。

具体而言,所述第一纹理信息包括第一纹理坐标、第一像素值,当将所述第一纹理信息应用于第一图元时,必须将所述第一纹理坐标平移到所述第一图元坐标上,将所述第一像素值赋予所述第一图元,其中所述第一图元在所述屏幕上,所述第一图元的坐标为第二坐标。所述屏幕包括x轴、y轴和z轴,其中,所述x轴、所述y轴和所述z轴两两相互垂直。所述所述第一纹理坐标与所述第二坐标之间的连线为第一连线,所述第一连线与所述屏幕xy轴平面之间的角度为所述角度差。所述角度差的存在使映射到屏幕上的纹理模糊失真,所述渲染模块内设置一所述预定角度差阈值,当所述角度差大于所述预定角度差阈值时,所述第一纹理信息映射到所述第一图元上后模糊失真,所述渲染模块滤掉所述第一纹理信息,即不将所述第一纹理信息映射到所述第一图元上。当所述角度差小于等于所述预定角度差阈值时,所述第一纹理信息映射到所述第一图元上后模糊失真不大,所述渲染模块将所述第一纹理信息映射到所述第一图元上。达到提高图像质量,增强图像清晰度的技术效果。

实施例二

基于与前述实施例中一种3d引擎设计方法同样的发明构思,本发明还提供一种3d引擎设计装置,如图2所示,所述装置包括:

第一获得单元11,所述第一获得单元11用于获得第一渲染协议;

第二获得单元12,所述第二获得单元12用于获得第二渲染协议;

第一判断单元13,所述第一判断单元13用于根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

第一渲染单元14,所述第一渲染单元14用于如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

优选的,所述装置包括:

第二判断单元,所述第二判断单元用于判断所述第一渲染协议是否可用;

第二渲染单元,所述第二渲染单元用于如果所述第一渲染协议可用,根据所述第一渲染协议进行渲染;

第三渲染单元,所述第三渲染单元用于如果所述第一渲染协议不可用,根据所述第二渲染协议进行渲染。

优选的,所述装置包括:

第三获得单元,所述第三获得单元用于获得第一指令;

第四获得单元,所述第四获得单元用于根据所述第一指令,获得第一引擎功能;

第五获得单元,所述第五获得单元用于获得第二引擎库;

第三判断单元,所述第三判断单元用于判断所述第一引擎功能是否在所述第二引擎库中;

第一调用单元,所述第一调用单元用于如果所述第一引擎功能在所述第二引擎库中,对所述第一引擎功能进行调用。

优选的,所述装置包括:

第六获得单元,所述第六获得单元用于如果所述第一引擎功能不在所述第二引擎库中,获得第一提醒指令,所述第一提醒指令用于提醒所述第二引擎库进行更新;

第一更新单元,所述第一更新单元用于根据所述第一提醒指令,对所述第二引擎库进行更新。

优选的,所述装置包括:

第一构建单元,所述第一构建单元用于构建第一引擎库;

第七获得单元,所述第七获得单元用于获得第一预定时长阈值;

第八获得单元,所述第八获得单元用于根据大数据对所述第一引擎库按照所述第一预定时长阈值为周期进行更新,获得第二引擎库。

优选的,所述装置包括:

第九获得单元,所述第九获得单元用于获得屏幕xy轴信息;

第十获得单元,所述第十获得单元用于获得第一纹理信息;

第十一获得单元,所述第十一获得单元用于根据所述屏幕xy轴信息和所述第一纹理信息,获得第一角度差,所述第一角度差为所述屏幕xy轴信息和所述第一纹理信息之间的角度差;

第十二获得单元,所述第十二获得单元用于获得第一预定角度差阈值;

第十三获得单元,所述第十三获得单元用于判断所述第一角度差是否超过所述第一预定角度差阈值,获得第一判断结果;

第一确定单元,所述第一确定单元用于根据所述第一判断结果,确定是否过滤掉所述第一纹理信息。

优选的,所述装置包括:

第一过滤单元,所述第一过滤单元用于如果所述第一判断结果为所述第一角度差超过所述第一预定角度差阈值,过滤掉所述第一纹理信息;

第一执行单元,所述第一执行单元用于如果所述第一判断结果为所述第一角度差未超过所述第一预定角度差阈值,保留所述第一纹理信息。

前述图1实施例一中的一种3d引擎设计方法的各种变化方式和具体实例同样适用于本实施例的一种3d引擎设计装置,通过前述对一种3d引擎设计方法的详细描述,本领域技术人员可以清楚的知道本实施例中一种3d引擎设计装置的实施方法,所以为了说明书的简洁,在此不再详述。

实施例三

基于与前述实施例中一种3d引擎设计方法同样的发明构思,本发明还提供一种3d引擎设计装置,其上存储有计算机程序,该程序被处理器执行时实现前文所述一种3d引擎设计方法的任一方法的步骤。

其中,在图3中,总线架构(用总线300来代表),总线300可以包括任意数量的互联的总线和桥,总线300将包括由处理器302代表的一个或多个处理器和存储器304代表的存储器的各种电路链接在一起。总线300还可以将诸如外围设备、稳压器和功率管理电路等之类的各种其他电路链接在一起,这些都是本领域所公知的,因此,本文不再对其进行进一步描述。总线接口306在总线300和接收器301和发送器303之间提供接口。接收器301和发送器303可以是同一个元件,即收发机,提供用于在传输介质上与各种其他装置通信的单元。

处理器302负责管理总线300和通常的处理,而存储器304可以被用于存储处理器302在执行操作时所使用的数据。

实施例四

基于与前述实施例中一种3d引擎设计方法同样的发明构思,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现以下步骤:

获得第一渲染协议;

获得第二渲染协议;

根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;

如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。

在具体实施过程中,该程序被处理器执行时,还可以实现实施例一中的任一方法步骤。

本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:

本申请实施例通过提供一种3d引擎设计方法和装置,所述方法包括:获得第一渲染协议;获得第二渲染协议;根据所述第一渲染协议的第一性能信息、所述第二渲染协议的第二性能信息,判断所述第一性能信息是否优于所述第二性能信息;如果所述第一性能优于所述第二性能信息,根据所述第一渲染协议进行渲染。解决了现有技术中3d引擎采用一种固定的渲染协议,渲染效果不好,图像画质不佳的技术问题,达到了采用多个渲染协议,根据性能优先原则自动选择渲染协议,提高渲染效果,增强图像画质的技术效果。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1