用于固定长度数据的压缩方法与流程

文档序号:17731763发布日期:2019-05-22 02:54阅读:512来源:国知局
用于固定长度数据的压缩方法与流程
本申请是基于并要求2016年7月6日提交的美国临时申请no.62/358,635的权益的正式申请,由此通过引用将该申请并入本文。本公开一般地涉及实时多玩家游戏,更具体地,涉及一种用于固定长度数据的压缩方法。
背景技术
:多年来,在线游戏的普及程度有所增加。越来越多的人开始参与玩实时多玩家游戏。为了增强这些游戏的玩家体验,新的改进和增强被定期地引入或革新。在一些情况下,这些改进涉及玩家在计算机图形界面方面与游戏的交互或与关于要实现的新挑战或任务的交互。为了完全理解对计算机图形界面的改变,可能需要玩家看不见的游戏的其他改进。例如,更快的互联网连接可能有益于玩家玩游戏。因此,提供了一种改善实时多玩家游戏的用户体验的方法。技术实现要素:一方面,提供了一种使用推断的数据创建用于数据结构的集合的压缩模型的压缩方法,数据结构的集合包括至少两个字段,该方法包括:通过将至少两个字段的值相加,将每个数据结构的位分组在一起,以生成数据结构和的集合;推断数据结构和的集合中每个前导零的零位;确定表示数据结构和的集合中的前导零中每一个的前导零标头;并用前导零标头替换数据结构和的集合中每个数据结构中的前导零。在另一个实施例中,确定包括:确定数据结构和的集合中各个数据结构和之间的共同前导零数量;并针对前导零标头使用共同前导零数量。在另一个实施例中,本公开进一步包括将数据字段标头应用于数据结构和的集合中的每一个数据结构和。在又一个实施例中,在将位分组之后,从最高到最低对数据结构的集合重新排序。在另一个实施例中,在将位分组之后,从最低到最高对数据结构的集合重新排序。在进一步实施例中,确定前导零标头包括用重复码对数据结构进行编码。在另一个实施例中,重复码表示前导零的数量。在又一个实施例中,通过使用按位掩码并将每个值编码为针对先前值的按位xor来压缩数据结构。附图说明现在仅通过举例的方式参考附图描述本公开的实施例。图1是32位整数固定数据结构的图;图2是两个整数数据复合结构;图3是由本公开的方法定义的数据复合结构;图4是用于本公开的方法的数据复合结构的对齐的示意图;图5是图4的数据结构的基于方差的重新排序的示意图;图6是编码的位串的示意图;图7a和图7b是压缩的另一个实施例的示意图;图8是用于多玩家游戏系统的系统的示意图;图9是描绘图8中所示系统的部件的更多细节的示意图;图10示意性地描绘了游戏系统在运行时如何运行;图11a和图11b是用于压缩的系统的实施例的示意图;图12是用于压缩的系统的另一个实施例的示意图;图13是编码的位串的示意图;图14是数据压缩方法的流程图;图15是另一压缩的方法的流程图;图16是遍历排序后列表的第一实施例的流程图;图17是遍历排序后列表的第二实施例的流程图;图18是遍历排序后列表的第三实施例的流程图;图19是基于熵的压缩的实施例的流程图;图20是概述压缩方法的流程图;并且图21是概述另一压缩方法的流程图。具体实施方式本公开涉及用于固定长度数据的数据压缩的方法和装置。在一个实施例中,本公开公开了一种整合多个固定长度数据段的方法。这些固定长度的数据段被视为具有固定位数的数据结构。在一个实施例中,本公开确定固定长度数据段中的每个位的概率并产生重新排序模型。然后使用重新排序模型来重新对齐每个固定长度数据段中的位。然后遍历每个固定长度的数据段以完成数据压缩过程。在优选实施例中,本公开的方法用于实时多玩家游戏。转到图8,示出了用于多玩家游戏系统或通用多玩家系统100的装置的示意图。该图提供了系统的一些(但不是全部)部件的总体概述。与系统100的示意图集成的是表示数据的框(诸如虚拟世界数据103或客户端指令108),其不形成系统的物理部件但是为了更好地理解系统100而被包括。在使用中,游戏开发者选择用于开发游戏(也被描述为游戏编辑流程)的第三方游戏引擎90。游戏开发者使用第三方游戏引擎90与系统100交互。第三方游戏引擎90通常包括或提供集成的第三方编辑器110和第三方游戏工件120。当用户正在玩游戏时,编辑器插件102(在系统100内)与符合开发者工作流程的第三方编辑器110通信。尽管在图8中以一对一的关系示出,但是单个编辑器插件可以与一个以上的第三方编辑器110相关联或通信,由此系统100可以用于创建不同的游戏。当由第三方编辑器110指令时,编辑器插件102可以访问与游戏模拟相关的虚拟对象数据。编辑器插件102根据虚拟对象数据生成虚拟世界数据103。虚拟世界数据可以被视为向用户产生游戏环境所必需的数据。该虚拟世界数据103和虚拟对象数据优选地由游戏开发者创建或构建,并在第三方编辑器110和编辑器插件102之间启用通信之前创建或构建。尽管被示为在系统100内,但虚拟世界数据103可以存储在其他地方,例如但不限于远程数据库。如果虚拟世界数据103存储在远程数据库中,则在需要时由系统100获取虚拟世界数据103。然后,虚拟世界数据103通过网络130传输,例如通过广域网(wan)、因特网或局域网(lan)、或某种组合传输,其中虚拟世界数据103存储在虚拟世界状态存储器104中。在被存储在虚拟世界状态存储器104中之后,虚拟世界数据103可以由模拟服务器101加载,以显示给正在玩多玩家游戏的用户。在游戏期间,模拟服务器101提供离散的世界模拟、分析、压缩和流传输。模拟服务器101还向连接的每个游戏插件105(用户正在访问和玩游戏所借助的手段)发送世界状态更新或状态更新107。游戏插件105可以存储在连接网络的计算机、笔记本电脑、或平板电脑等中。当模拟服务器101生成离散的世界状态时,它可以使用状态记录器106来存储它们。在当前实施例中,状态记录器106是可以经由系统总线或其他高速网络附接到模拟服务器101的高性能存储系统。只要被配置有足够的存储空间,状态记录器106在启用时就可以存储任意数量的世界模拟历史。状态记录器106还可以从被加载到模拟服务器101中的先前状态生成虚拟世界数据103以倒回或重放模拟,从而使得用户可以查看先前的游戏玩法。在优选实施例中,游戏插件105和模拟服务器101通过网络130彼此连接。游戏界面(在游戏插件内)与第三方游戏工件120接口,以提供允许用户在模拟服务器101上创建任意数量的自定义虚拟化功能的界面。通过开发调用这些虚拟化功能(优选地被序列化为客户端或用户指令108)之一的游戏代码,可以将这些指令或功能发送到服务器101,以便可以记录、存储和/或执行它们。在一个实施例中,模拟服务器101默认允许所有指令。模拟服务器101还可以允许开发者提供服务器插件109以提供审查规则。如此一来,并非用户提交的关于游戏的所有指令都可以被系统100接受。在另一个实施例中,模拟服务器101是可编写脚本的,由此开发者可以定义和/或定制多个服务器端功能。例如,客户端接口在使用时可用于调用这些服务器端功能。这也可以被视为典型的远程过程调用系统/软件模式。必要的话,可以在稍后的时间,例如在重放或其他类型的时移期间,记录和“回放”这些功能调用。图9是描绘图8中所示系统的部件的更多细节的示意图。更具体地,图9描绘了如何使用编辑器创建虚拟世界。本公开的编辑器插件有助于在将虚拟世界数据103上传到本公开的系统之前将虚拟世界数据103变换为通用格式。编辑器插件102包括特定于一个第三方编辑器110的并访问与第三方编辑器110相关联的所有虚拟世界数据103的编辑器适配器层200。在一个实施例中,第三方编辑器110本身是一种提供正在被实时组装和更新的虚拟世界的可视化表示的可视化工具。应当理解,虚拟世界表示正在玩游戏的场景。为了帮助开发虚拟世界,开发者定义一个或多个虚拟对象描述符202的集合,其包括图形数据(例如但不限于几何和纹理)、由第三方游戏工件120在运行时执行的可选逻辑单元以及各种物理属性数据(如质量、速度和力)。为了为虚拟世界创建运行时,一些虚拟对象描述符被实例化为一个或多个实例化对象201的集合。在运行时中,第三方游戏工件120从实例化对象201的列表生成虚拟世界。编辑器适配器层200自动将虚拟对象运行时部件206附接到每个虚拟对象描述符202以便于进行模拟和为开发人员提供会影响模拟的状态的界面。此界面提供访问以读取和设置模拟特定属性(如对象位置和旋转)、用户提供的自定义数据以及可选的物理属性(如质量、阻尼、摩擦、碰撞掩码等)。编辑器适配器层200对编辑器中的虚拟对象描述符202和实例化对象201两者进行解析,并且以独立于第三方编辑器110和游戏引擎的通用格式存储相应的数据。如上所述,编辑器110生成包含通用实例化对象203和它们所基于的通用虚拟对象描述符204两者的虚拟世界数据103。该数据通过网络130发送以进行存储。编辑器通过连接到提供对底层数据的读和写访问的虚拟世界存储器访问接口205来存储数据。图10示意性地描绘了游戏系统在运行时如何运行。状态更新从系统100流向第三方游戏工件120。模拟服务器101启动并从虚拟世界存储器访问接口205加载初始模拟数据。虚拟世界存储器访问接口提供以下选项:加载包含使用第三方编辑器110定义的世界的所有初始条件的虚拟世界数据103,或者加载来自先前状态的模拟数据。一旦加载了世界模拟数据,模拟服务器101就以被称为节拍的离散时间步长模拟世界交互。第三方插件306(在模拟服务器101内)调用关于模拟的虚拟对象301中每个单独对象的模拟规则,以便完成一个节拍。世界状态被更新并存储为运行时虚拟对象305,其被引导到两个系统中。两个系统中的第一个系统是自定义状态分析器309。该分析器309使用从所有连接的客户端(或用户)处接收的客户端状态数据312,其包含例如摄像机位置、视锥体、自定义客户端数据和客户端输入状态(即按下了什么键、鼠标位置、触摸屏上的触摸位置等)的相关信息。自定义状态分析器309和对象状态分析器302还向压缩优化310提供所有相关联的元数据,例如数据变换、上下文和熵信息。两个系统中的第二个系统是对象状态分析器302,其对运行时虚拟对象305执行分析以确定用于压缩的最佳方法和上下文。压缩器303提供下一阶段的处理,处理来自自定义状态分析器309、对象状态分析器302和运行时虚拟对象305的元数据,以生成本身包含紧凑的自定义状态数据308和压缩的虚拟对象304的世界状态更新107,其中自定义状态数据308从任意客户端状态312生成,并且压缩的虚拟对象304是在自定义状态307中表示的压缩后的对象集合。世界状态更新107通过网络130发送并由游戏插件105接收,其使用解压缩器311将更新解压缩回运行时虚拟对象305和自定义状态307。压缩器303还将运行时虚拟对象305的原始或最小压缩版本发送到状态记录器106,该状态记录器106利用虚拟世界状态存储器104将每个世界更新存储为历史。世界历史可供模拟服务器101以交互式(即游戏)或非交互式(即记录的游戏或视频)的方式重放。在多玩家游戏系统的执行中,为了改善或加速游戏或者为了改善或加速用户看到的显示的更新,一些正在传输的数据可以经历压缩以减少多玩家游戏(更具体地说是实时多玩家游戏)所需的网络流量的量或大小。在一个实施例中,该压缩可以在模拟服务器内发生,但是可以在系统内的其他地方执行。在一个实施例中,压缩方法或本公开可用于帮助减少在服务器之间传输的数据量,进而减少的数据可允许这些服务器之间的更快传输。压缩方法优选地允许压缩固定大小的二进制数据结构,如下所述。在典型的计算机软件数据结构中,固定大小或固定长度的二进制数据结构的范围可以从单个位到多个位的子结构的组合。例如,在某些软件中,应用程序可以使用32位整数结构存储计数器。参考图1,示出了32位整数结构10的示例。在其他实施例中,数据或整数结构可以更复杂并且存储为更大的复合数据结构,其可以包括浮点值、字符串或其他复合值。本公开涉及一种对固定大小的二进制数据结构的集合进行压缩的方法。虽然仅参考32位整数结构进行描述,但是本公开的方法还可以用于其他大小的通常更大的复合结构,以便改进传输速度和时间。转到图14,示出了概述数据压缩方法的流程图。最初,将固定大小的二进制数据结构(例如整数结构10)的集合合并成单一复合数据结构(1400)的集合。单一复合数据结构中的每一个包括预定数量的固定大小的二进制数据结构。例如,考虑简单的两个整数数据结构12(如图2所示)。在图2中,复合数据结构或复合结构12包含两个32位整数结构或值10。为了清楚理解,这些位用它们在相应整数结构10内的位置进行标记。数据结构12内的整数结构10被合并且被视为单一复合数据结构14(如图3中示意性所示)。在本公开的方法中,每个单一复合数据结构14可以被视为单个位串14。在正常游戏期间(在多玩家游戏中),定期传输单一复合数据结构14的集合。当前压缩方法将复合数据结构的集合视为字节串,并尝试将当前子串与先前遇到的子串匹配以执行压缩。在图3中,每个位用其在单一复合数据结构14内的绝对位置进行标记。如图所示,单一复合数据结构表示64个连续位的串,其是图2的两个整数结构10的组合。然后,每个单一复合结构中的位被彼此对齐(1402)。如图4中示意性所示,收集单一复合数据结构的集合,然后彼此对齐。当第一单一复合数据结构或第一单一复合数据结构实例的第一位与所有其他单一复合数据结构14的第一位直接相关时,单一复合数据结构被认为是按位彼此对齐。针对单一复合数据结构14内的每个位的位置计算位概率(或该位被设置的可能性)(1404)。然后将这些位概率(p1,p2...pn......,其中n表示每个数据结构14的位的位置)存储为位概率数据结构16(1406)。在当前示例中,位概率数据结构包括64位概率值。然后,位概率数据结构16用于构建重新排序模型(1408)或中间缓冲物18(如图5中示意性地示出)。对于给定的概率pn,它具有与其方差的平方成正比的值pn-pn^2。然后通过按递增顺序对每个概率pn进行排序来构建重新排序模型。这导致最小方差占据最左(或最高有效)位的位置,而具有最大方差的位占据最右(或最低有效)位的位置。然后,在中间缓冲物18内从最小(最左)到最大(最右)列出剩余的方差。该重新排序模型或中间缓冲物表示如何从单一复合数据结构的集合中的所有单一复合数据结构中重新映射各个位的一个实施例。在已经对位进行重新排序之后,压缩器使用映射(由方差排序创建)将单一复合数据结构16中的位以一对一关系重新排序为中间缓冲物10(1410)。换句话说,计算方差,然后基于方差对位的位置进行排序。这些新位置成为用于进行压缩的映射。在这些中间缓冲物就位的情况下,然后可以执行数据的进一步压缩(1412)。可以以如下概述的不同方式执行数据的进一步压缩。在进一步压缩(如图15中示意性地示出)的第一实施例中,压缩器将每个中间缓冲物18视为大整数(64位)。如果中间缓冲物包含64位或更少的位,则压缩器可以使用原始64位(或更小)整数类型,如果不是,则压缩器可以将位串视为任意长的整数类型。然后,压缩器对得到的整数进行排序(1502)(由中间缓冲物18的上述映射确定),优选地按升序排序。能够唯一地标识每个对象实例有利于进一步压缩。标识(id)信息存在于许多数据结构实现方式中,但是在id信息不是结构内的字段的那些情况下,列表中结构的顺序是重要的。本公开的压缩系统的用户提供该信息,然后使得压缩系统可以在执行位计算之前自动地与每个对象实例一起包括原始索引作为附加字段。然后,压缩器遍历排序后列表(1504),查看相邻的中间缓冲物对。在遍历排序后列表的一个示例(诸如图16中示意性示出的)中,处理器从较大值中减去较小值(1600)从而产生增量值。继续该过程直到中间缓冲物中的每个位都被转换为增量(首先保存)(如图6所示)。换句话说,如果存在n(其中n表示被压缩的中间缓冲物的数量),则在按照值对中间缓冲物进行排序之后,从中间缓冲物2中减去中间缓冲物1,以便为增量位串1提供编码的增量位串20。这一直持续到增量位串被计算到并包括n-1个位串。然后,压缩器通过添加表示每个增量所需的用于存储的位数的小标头,来将每个增量位串编码为输出(1602)。从每个增量中的第一个或最高有效设置位开始对位进行计数,使得所有前导零位不被显式地编码并且可以以这种方式进行推断。编码还将起始位缓冲物(编码位串的位串1)编码为非增量,使得解压缩器可以从中重新计算所有其他位缓冲物。在遍历排序后列表的第二种方法(如图17中示意性示出的)中,压缩器计算相邻位串或中间缓冲物之间的按位xor(1700)以确定或计算增量,而不是减去相邻值(例如,如图6中示意性示出的)。在确定增量之后,压缩器对每个增量进行编码(1702)以包括标头从而包括诸如上面公开的存储所需的位的数量。然后,解压缩器可以使用编码的位串重新计算压缩的数据。在遍历排序后列表的另一实施例(如图18中示意性示出的)中,每个中间缓冲物从最高有效位到最低有效位被逐位遍历(1800)。然后,这些位被用于在二叉树结构中生成路径和分支(如图7a中示意性示出的)(1802)。当位串被插入二叉树时,它们的公共位值形成共享分支。在遍历每个中间缓冲物时,压缩器生成(或将基于缓冲物遍历而生成)固定深度二叉树。在二叉树的每个叶子处,压缩器将最后一个分支点的位置编码为分支点数据。然后,压缩器通过将树转储为已知顺序(例如从左到右或从右到左)来对分支点数据进行编码。每次编码器向下编码到叶子时,它从树中移除已编码的大部分分支,然后跟随在叶子处编码的值返回到最后一个分支,并重复该过程。每次它回退到最近的分支时,它减少或最小化其针对新数据结构必须编码的附加数据。这种遍历的一个例子如图7b所示。在执行压缩之后,输出被创建,然后可以在传输之后进行解压缩。在上面公开的每个实施例中,生成输出(被视为编码的位串),其中每个编码的位串被编码为一系列前面是短标头的位串,如图6中示意性所示。编码的位串可以包括附加的元数据,例如但不限于位标头长度、模型和使用的压缩方法。在另一个实施例中,可以通过不同的通道提供模型。例如,可以从大量数据生成模型并将其存储在解压缩器中。然后压缩器使用此模型压缩输入数据,但不需要在输出中对模型进行编码。这通常会导致稍微不太理想的压缩,但仍可能生成较小的压缩的输出,因为模型不再需要使用输出进行编码。原理图在图13中示出。以这种方式,可以对样本数据集(例如,前几个对象—或位串)计算一次位重新排序,然后可以在随后的编码中重新使用该映射,使得每次都不需要与对象一起对映射进行编码。在压缩的另一实施例中,该实施例可以与上文概述的任何方法集成,或者可以作为独立的压缩功能来执行,该压缩方法可以是基于熵的压缩方法。在一个实施例中,基于熵的压缩可以作为任何上述压缩方法的输出的附加计算工作来应用,以进一步减小压缩后数据的大小。在进一步的实施例中,基于熵的压缩可以与上述压缩方法之一集成以增强压缩性能。可替代地,基于熵的压缩可以用用对字节流的通用压缩器。在该基于熵的实施例中,该压缩方法对位串进行操作。该方法涉及从来源确定位排序;变换得到的位串;并且通过减小变换的输出的大小的多模型熵压缩来放置得到的位串。转到图19,示出了概述基于熵的压缩的实施例的流程图。首先,确定位排序(1900)。输入数据最初被解释为连续的位串。有两种方法可以解释这些串位。第一个是从数据的开始处开始并且一次一位地遍历数据直到结束。例如,以下五(5)字节的输入数据可以表示为具有表示字节边界的空格的位串。换句话说,5个字节的数据可以被视为5个固定数据串。1000101110111010111011101100101010011001解释数据的第二种方式是将数据视为固定大小的结构的列表。使用上面示例中的输入数据,输入数据可以看作是8位固定大小的结构。通过将位视为列,其中行是8位固定数据结构的实例,可以对这些位进行对齐以表示公共信息:1000101110111010111011101100101010011001当每个数据结构的8位形成列时,列可以被解释为包含公共信息和被转置的位以生成逐列解释。这可以看作重组后发生的事情,并且这些位用于相互掩码。列(从左开始到右)变为:11111001100110001001001001111010001位流的列对齐解释允许对彼此相关的位进行压缩的选项。从上面可以看出,有两列明显具有1的情况比0更多。在第一种位解释方法中,这种关系并不明显。使用第二种方法执行位解释允许使用不同的统计模型对不同的列进行编码,从而提高编码效率。为了确定哪种位解释方法可以是更好的选择,可以观察或评估预测的压缩比。对于结构化的数据,很可能存在很少或从不改变状态的列。在那些情况下,输入数据可以被不同地编码-因为可能不需要所有值为1的行的熵编码器。相反,仅列号和值被编码。在解释输入数据之后,对位串进行变换以便将位串转换为符号(1902)。符号可以表示指示位串长度的数字。考虑不同的位变换方法。在可以被视为位状态长度实施例的位串变换的一种方法中,单个状态(0或1)下的一连串位被认为是完整的串。该完整的串可以表示为数字。例如,一行中的一系列1(例如11111)可以表示为5。每当有一个位改变状态时,则定义新的字符串。000111被视为2个串,每个长度为3。考虑例如100111010111110010000001110101101001010101101111110001101010111的一系列输入位。其可以被转换或变换为一系列符号:12311152163111211211111121632111113因此,变换产生一系列可被进一步处理和压缩的数字{1,2,3,1,1,1,5,2,1,6,3,1,1,1,2,1,1,2,1,1,1,1,1,2,1,6,3,2,1,1,1,1,1,3}。在可被视为零终止位串实施例的位串变换的另一实施例中,可将位串解释并转换为一系列长度。变换的这种变体查找1的串并将第一个0位视为终止。因此,当考虑诸如11001110的一系列位时,它可以被分解为{110,0,1110}。长度可以计为{3,1,4}。如果输入的位串全为1,或者不以0结束,则最终的尾随0被认为是隐式的。为了减少或防止数据损坏,最终编码的任何输出应该优选地包括被编码的位的数量,使得解码器不在其输出中产生隐式尾随0。如果输入的位串是另一个告诫是,诸如0000000000...0的输入位编码为{1,1,1...1}的较长序列,而诸如1111111111...1的输入编码为单个值。通常这不是问题,因为这些情况很容易被检测到并且可以使用替代方法进行编码。在可被视为一终止位串实施例的位串变换的进一步实施例中,除了寻找以1位终止的一连串0位之外,该变换与零终止位串实施例完全相同。因此串11001110编码为{1,1,3,1,1,1}。关于零终止实施例出现的类似问题存在于相反状态位的一终止实施例。在位串被变换之后,则然后对它们进行编码(1904)。在创建一系列数字的情况下,期望有效地对它们进行编码。考虑对变换后的位串进行编码的几种方法。在可以被视为无经验实施例的一个实施例中,使用标准算术编码器的无经验应用。由于该编码器可以编码小数位,因此如果数据集包含大量1长度,则编码器可以编码为单个位或更少(尽管有时更多)。这种无经验的压缩形式使用可以被视为“主上下文”的单个上下文或概率模型主上下文。在可被视为游程实施例的对位串进行编码的另一实施例中,可通过添加游程编码的概念来改进总体压缩方法。当使用逐位压缩器时,算术编码器模型中的特殊符号被用于表示运行。考虑以下示例:{1,3,4,1,5,1,1,1,5,3,1,1,4,5,5,1,1,2,3,4,1,4,4,2,1,5,6,6,1,3,3,3,1,1,1,1,1}可以看出,存在几个重复序列。如果游程定义为符号“r”,后跟随重复的值“v”,然后是重复计数“n”(r{v,n}),则这些参数r均使用相应的编码上下文进行压缩,使上下文计数达到3。每次编码器编码“r”时,它切换到包含重复符号模型的上下文。在对符号进行编码之后,再次切换到包含重复计数的上下文以对计数进行编码,此时它将切换回主上下文。使用该方法,上述数字串被转换为:1,3,4,1,5,r{1,3},5,3,r{1,2},4,r{5,2},r{1,2},2,3,4,1,r{4,2},2,1,5,r{6,2},1,r{3,3},r{1,5}可以看出,游程经常出现。因此,如果考虑上述概率模型,则上述数据的游程编码上下文(各自包含熵模型)被计算为(每个符号的位是标准熵计算,-log2(计数/总数)):v上下文符号计数每个符号的位141313413513613n上下文符号计数每个符号的位250.678071905322513原始数据是94位长,编码后数据小于85位长。注意,在某些情况下,例如r{1,2},使用游程可能没有意义。在这个例子中,可以看出两个1的编码小于4.52位,而r{1,2}编码为4.58位以上。通过计算r{v,n}语句的总大小并将其与使用主上下文对值进行简单编码相比较来减轻这种情况。可以被视为一游程实施例的替代编码实施例是仅对重复的1值进行游程编码。在这种情况下,不需要额外的“v”上下文,并且每个“r”符号后跟随1的计数。这可以提供改进的压缩,同时也更快地编码/解码。应用“一游程”变换的简单示例示出如下。{2,3,1,1,1,3,5,7,2,1,1,2,7,4,1,1,1,1,3,4,4,4}{2,3,r{3},3,5,7,2,r{2},2,7,4,r{4},3,4,4,4}在可被视为模式匹配实施例的又一编码实施例中,更复杂的编码器可以以类似于lempel-ziv/lempel-ziv-markov类编码器(lz*,lzm*)的方式使用模式匹配。可以使用特殊代码“p”来表示模式,以代替使用特殊代码“r”来表示游程。模式代码后跟随表示要回顾的符号数量的偏移量“o”,后跟长度“l”,其表示用于构造此模式(p{o,l})的后续符号的数量。考虑以下示例:{1,2,3,1,1,2,3,4,2,2,1,1,1,1,3,5,4,3,2,1}模式可以被确定,例如在示例下面列出的可以从该数据生成3个上下文的模型:“o”上下文符号计数每个符号的位110.60206410.60206710.60206910.60206“l”上下文符号计数每个符号的位310.60206230.124939在该示例中,43位的输入数据压缩到小于38位的输出数据。可以将以上概述的关于编码的所有方法组合成单个算法,然而在压缩期间可能需要更多逻辑以便选择使用哪种技术或实施例。这可以导致压缩的总体改进。当在编码或解码同时遵循用于修改每个上下文中的模型的规则时,会获得额外的效能。该技术是众所周知的,并且导致压缩性能的改进且可以被视为自适应编码和解码。在通过生成符号并对符号进行计数来编码数据之前创建模型。一旦计数了所有符号,它们就可以由算术/范围编码器一次编码一个。当特定符号被编码时,它将从适用模型的计数中移除。解码器遵循相同的规则。它使用与编码器相同的模型,并且当对特定符号进行解码时,它使用与编码器相同的规则从适用的模型中减少该符号的计数。还可以存储诸如每个编码增量的标头位数量的附加元数据。在一些情况下,可以使用算术或范围编码器对例如位串标头的重复标头进行编码以减少开销。如果使用算术或范围编码器,则那些模型也可以包括在标头中,可以是静态的,或者它们可以是对先前共享模型(例如增量模型)的校正。通常,在数据被压缩之后,数据将被解压缩。现在描述与上面公开的压缩方法一起使用的解压缩的实施例。在解析输出流中的任意元数据(可选模型和附加标头)之后,解压缩器然后反转由压缩器执行的步骤。解压缩器优选包括有助于解码编码后位串的解码器。解压缩器首先解码非增量第一位缓冲物(或图6中的位串缓冲物),然后解码后续的增量位缓冲物。然后将编码的中间缓冲物转换为整数,并且解压缩器将第二编码位串(或解码的增量)加(如果通过减法压缩)到第一位串上,或对第二编码位串(或解码的增量)和第一位串使用按位xor(如果用按位xor压缩)。然后,它将新解码的中间缓冲物转换为整数,并以相同的方式使用它来解码第三个值,依此类推,直到所有整个数据结构都被解码或解压缩。如果二叉树结构已被用于遍历排序后列表,则解码器或解压缩器将第一值解码为二叉树的左或最右分支。当元数据对树的深度进行编码时,解码器自动知道它何时到达叶子。一旦它解码了分支,它就会解码包含从树上回到下一个编码分支顶部的距离的叶子。解码器将位的下一集合解码为下一个分支,直到它再次解码到树的深度,其中解码下一个叶子,并重复该过程,直到它解码整个树。然后可以将数据视为已解压缩。图11a和图11b是可以执行压缩方法的另一环境的示意图。在图11a和图11b的系统1000中,开发者或用户提供自定义编程语言1101和状态配置信息或数据1102以开发或定制至少一个服务器堆栈1110。服务器堆栈1110包括第三方引擎1111(例如第三方物理模拟库)和第三方运行时模块1112。第三方运行时模块编译自定义编程数据1101。开发者1100还可以定义由第三方运行时模块1112管理和修改的外部数据1114的集合。也可以由开发者以状态配置数据1102的形式向服务器堆栈1110提供固有数据1113。固有数据1113和外部数据1114被提供给状态组合模块1114,状态组合模块1114与视图过滤器1123连接,视图过滤器1123又提供客户端视角数据1126或状态视图1124。客户端视角数据1126可以返回到开发者以协助自定义编程数据1101。状态视图1124连接到压缩器1130,压缩器1130然后经由网络1130将数据传输到客户端设备1140。客户端设备1140包括解压缩器1127、客户端分析器/解释器1141和包括呈现引擎1148的第三方引擎1111。客户端分析器/解释器1141和第三方引擎1111都将数据或信息返回到服务器堆栈1110内的客户端视角数据模块1126。终端用户也可以以终端用户输入1150的形式访问客户端设备1140。服务器可能需要将插件库嵌入于在所有连接的1140上运行的应用程序中。在一个实施例中,第三方引擎1111可以集成到解压缩器1127后台的系统中。解压缩器1127被设计为覆盖与2d和3d物理引擎库交互的所有方面。解压缩器1127进一步作用于并且可以改变各自包含固有数据1113的对象的集合,固有数据1113包括位置信息、以及物理特征,例如质量、静/动摩擦、角度阻尼、形状、比例、约束、角度和线性加速度、角速度和线速度等。第三方运行时模块1112是可以进一步改变固有数据1113并用外部数据1114对其进行扩充的次级进程集。服务器堆栈1110通过依次计算离散时间步长来执行模拟。转到图12,示出了与至少一个客户端设备1140通信的服务器堆栈1110的示意图。服务器堆栈1110通过网络1130与至少一个客户端设备1140通信。服务器堆栈1110包括其本身包括固定功能容器1116和自定义运行时容器1119的模型状态组合/适配器1115。服务器容器部件的集合存储在两个容器1116和1119内。这些服务器容器部件是用户或开发人员定义的数据容器。这些数据容器可以包含数据游戏特定数据以帮助玩游戏,例如玩家得分、玩家项目、游戏玩法动作等。固定功能容器1116包括存储固有数据1118的第一服务器容器部件1117,而自定义运行时容器1119包括自定义运行时服务器容器部件的集合中被视为服务器容器部件二1120到服务器容器部件n1121的剩余部分。自定义运行时容器1119内的服务器容器部件各自包括自定义数据。客户端设备1140包括客户端分析器/解释器1141,客户端分析器/解释器1141包括具有服务器容器部件1143(包括固有数据1144)的固定功能容器1142,服务器容器部件1143与服务器容器部件1117相对应。客户端设备进一步包括包括服务器容器部件1146的自定义运行时容器1145,服务器容器部件1146与服务器堆栈1110中的自定义运行时容器的服务器容器部件一一对应。本公开的方法的一个示例使用可以在快速浮点数据预处理中。单精度浮点数据(ieee754)是使用32位来存储3个值的特定类型的数据结构:1位用于存储标记信息,8位用于存储指数(应用于基数2),其余23位存储尾数。由浮点值表示的数字则为<标记>1.<尾数>×2指数。当压缩浮点值时,希望数据结构中的位尽可能少地变化。第一步是减少或消除指数位的可变性。为此,确定被压缩的值的集合是否具有可以在范围上扩散的绝对值,例如,值的集合{17,29,27.7,30.322}都落在16和32之间并且存在于24(16)的扩散内。应该注意的是,大多数值不是这种方便的结构。考虑集合{5.5,-1.3,4.1,-7.2}。该集合的绝对值扩散在3个不同的2次幂(21,22和23)之间。因此,浮点数据结构在其指数和尾数中将具有不同的值。如果获得高(或最大)绝对值和低(或最小)绝对值,则整个范围可以在幂=ceil(log2(max-min))内。计算2幂的值,然后该值被加到集合中的所有正值上,并从集合中的所有负值中减去。例如,由于集合{5.5,-1.3,4.1,-7.2}跨越23=8的范围,因此我们加上(或减去)8以生成新集合{13.5,-9.3,12.1,-15.2}。这些新的浮点数都有一个共同的指数。由于指数位的方差为零,因此压缩器将自动仅对所需位进行一次编码。要保留标记信息,因此不对标记位进行任何操作。可以进一步根据所需的精度调整尾数信息。尾数位表示分数1/2n,其中n是尾数中位的位置,因此第一位表示1/2,下一位表示1/4,依此类推。尾数表现得像一个固定点整数,其表示被标准化为给定指数的可能值的范围的比率。因为尾数长度为23位,所以精确到八百万分之一。通常需要更低的精度,例如旋转,其中1000分之一通常就足够了。为了将尾数减小到可适用的精度,掩码掉适当数量的最低有效位。对于1/1000精度,保留23位中的10位最高有效位。被掩码的位设置为0,并且方差为0,因此压缩器可以将它们从编码中删除。当截断尾数的位时,特别注意舍入。截断行为会删除非常大量的详细信息。例如,当掩码到超过第10位时,1.599和1.501会将两个值都更改为1.500。在掩码之前执行舍入变得重要。如果选择了两个ieee754尾数,比如说1.0110b(1.3725),并且它们被截断到两位,则需要检查第三位(.001b),因为它表示的值恰好是最终值的最低有效位的一半。如果设置了第三位,则通过在掩码之前将其加到目标上来上舍入该值:因此1.0110b+.001b=1.100b(1.5)。然后将掩码应用于1.100b以获得1.10b。尾数数学存在限制,其中每个位代表分数(1/2n),其中n是位的位置。这使得开发人员更难以确定误差容限,因为开发人员以十进制思考,但是对尾数中的位进行掩码会产生1/2n的误差值(即,为了增加n,每个位位置的误差值为0.5、0.25、0.125、0.0625、0.03125、0.015625、0.0078125、0.00390625等)。这使得错误预测不直观。替代方法是重新归一化尾数。为了将尾数归一化到给定数量的位b,将尾数乘以2b。例如,如果希望b=16(因此将尾数归一化为16位),则将尾数乘以216。通过将乘积除以223(对于23位尾数)来执行归一化。恢复尾数反转操作。该值乘以223,然后除以216。可以使用更快的方法,但可能并不总是产生完全相同的结果,因为它不执行任何舍入。可以将该方法视为将值乘以2(n-m)。然而,这与左移或右移(n-m)位没有什么不同,这相应地与上面的掩码技术没有区别。然后将偏移信息传输到解码侧或解压缩器,使得偏移信息可以被用于重构期望数据。偏移量可以作为浮点值发送,但如果仅限于针对偏移量2的幂的整数指数,则会更加紧凑。使用用3的最小公数技术编码的归一化四元数来发送面对数据,该技术对4个四元数值中的3个四元数值和第4个的标记位进行编码。四元数分量是在-1...1范围内的浮点值。使用上述技术的修改,使用2的偏移而不是1,导致值偏移到-3...-2、2......3的范围。如上所述,尾数被量化,但是不积极地量化1位(即,针对1000分之1的精度使用11位而不是10),因为所有值仅分布在2...4的范围的一半内。压缩可能有益的另一示例是在游戏数据流传输内。许多游戏的游戏数据涉及将世界状态从服务器转移到客户端。世界状态中的大部分数据是对象在该世界中的标识(id)、位置和旋转信息。考虑三维(3d)射击类游戏。玩家可以控制在包括平台、坡道、走廊和开放区域的竞技场上行走或跑步的虚拟化身。每个化身由id号、笛卡尔坐标中的位置和被编码为归一化四元数的面对值来描述。位置和旋转都是化身变换的一部分。玩家通过执行连接到公共服务器(或权威游戏客户端)的游戏客户端来加入游戏。服务器执行游戏模拟。游戏客户端接收来自玩家的输入并将命令发送到服务器,然后服务器选择执行哪些命令,并将有效输入应用于游戏模拟。服务器具有网络堆栈,模拟数据被呈现给网络堆栈。在该特定示例中,玩家输入导致虚拟世界中的化身运动,当他们围绕关卡移动时改变每个的变换。服务器每秒数次将世界状态编码为网络数据包,并将得到的数据包发送给所有游戏客户端。对数据包进行编码的过程涉及扫描模拟中的所有对象(化身和其他对象,例如项目或人工智能(ai)控制的实体),并将每个对象各自的变换序列化为缓冲物。该缓冲物被写入一个或多个数据包,然后使用诸如udp或tcp的网络协议发送到连接的游戏客户端。可以将压缩应用于数据,以最小化需要发送的数据包的数量。在优选实施例中,本公开的压缩方法用于该压缩。在模拟步骤结束时,服务器迭代模拟中的所有对象。它选择要序列化的那些。对于每个化身,它将对id和变换信息进行序列化。对于其他游戏对象,它可以对变换数据进行序列化,或者对一些其他相关联数据进行序列化。例如,关卡中可能存在没有更改变换的项目对象—已连接的游戏客户端已知道其位置。这些项目对象可能具有可被序列化的其他数据,例如点数或虚拟货币的数量,或者可见性值(如果项目是可收集的)。如果考虑具有变换的对象,则压缩恰好在数据包被构造之前发生。使用上述技术对每个化身的变换进行预处理。基于游戏客户端准确重建所需的精度来选择量化级别。如果级别是100×100米,并且要求位置精度为1cm,则位置部分可以量化为1/10000,这可以使用14位尾数精度来表示。面对值可以被类似地量化。量化过程涉及将变换和id数据复制到发生量化的新结构。当该过程完成时,创建可由上述压缩系统处理的已量化变换的列表。压缩的结果产生一系列被编码成一个或多个数据包作为连续位串的大整数类型,每个类型具有描述它们各自长度的相关联元数据。如果客户端还没有重映射数据,则可以以额外的数据包有效载荷大小为代价首先编码重映射数据。然后通过网络将数据包发送到连接的客户端,并且服务器在重复该过程之前继续计算下一个模拟步骤。在先前描述的用于模型生成的方法中,它们可能需要将大量数据嵌入到输出网络流中。虽然可以回收多个框架的模型,但另一种可能性是减小模型的大小。在压缩的另一个实施例中,生成可以利用推断的数据的压缩模型。二进制值是由一系列位表示的数字。该值的每个第n位表示2n对总值的贡献,因此二进制数1011=1*20+0*21+1*22+1*23=13(十进制)。对于任何n-1个不同的值,第n位将恰好改变一次。因此,可以推断出位n发生改变的概率与其前面的较低有效位的数字成反比。考虑一系列2位数:{1,2,3,0,0,1,3,2,3,1,0,2}。在二进制中,这些值被视为{10,01,11,00,00,10,11,01,11,10,00,01}。一旦被排序,这些值是{3,3,3,2,2,1,1,1,1,0,0,0),其在二进制版本中可以被视为{11,11,11,10,10,10,01,01,01,00,00,00}。注意,通常最高有效位(msb)比最低有效位(lsb)更不频繁地改变。具体来说,一旦lsb发生改变,msb的改变可能性降低50%。对于包含更多位的较大二进制值尤其如此。一旦排序,第n位对于第n-1位的每两次改变仅改变一次。这有助于建立对如何表示二进制值的基本理解。在当前实施例中,压缩模型减少了表示它所需的位数。可以将输入解释为二进制数,并且可以根据它们各自的位置以及它们具有值0的可能性来重新排列这些位,而不是单独分析每个位以确定其在输出中的位置。考虑包括分别为32位、16位和8位值的三个字段的数据结构。这可以示意性地示为:{f1[32位],f2[16位],f3[8位]}。对于上面的示例数据结构,数据结构中的总位数是56(32+16+8),这意味着如果数据结构中的所有位被使用,则压缩模型中可以存在多达56个值。尽管可以使用位打包来压缩此模型,但在大多数情况下,每个值都需要多个位来进行编码。对压缩模型值进行压缩的简单方法是每个值使用五(5)位,这导致峰值模型大小为56*5位或280位(33.75字节)。在这种情况下,模型本身相当于5个原始编码数据结构或数据结构实例。在一种替代编码方法中,检查二进制值。这些二进制值可以与所表示的数据结构的预期解释一致,或者可以基于分析重新定义边界以实现改进的或最佳的压缩。对于上面的示例数据结构,假设基于提供的二进制值边界对其进行分析。如图20的流程图所反映的确定位重新排序方案的一种方法可以如下:给定多个给定数据结构实例,使用将每个字段的第n位组合在一起的固有位重新排序(2000)。输出结构将表现为:{f1[17-32位],f1+f2[9-16位],f1+f2+f3[0-8位]}其中,来自每个字段fm的位置n处的每个位被组合在一起,使得:f1+f2+f3[位n]=f1[位n]|f2[位n]|f3[位n]|f1[位n-1]|f2[位n-1]|f3[位n-1]…在一般实施方案中,该方程可表示为:(f1+f2+f3+…fm)[位n]=f1[位n]|f2[位n]|f3[位n]|fm[位n]|f1[位n-1]|f2[位n-1]|f3[位n-1]|…fm[位n-1]|…对于任何大于给定字段中的位数的n,0位被推断出(2002)。在一种方法中,跟踪在每个字段中使用的高值位(2004)。这是通过查看msb来确定的,针对结构实例集合中的给定字段的高值或最大值,msb被设置为1,其可以被表示为fm(max)。以使得输出的msb更可能为0的方式或顺序对各个位进行洗牌(2006),因此如果f2(max)<f1(max)<f3(max),则上述重新排序现在是:f3+f1+f2[位n]=f3[位n]|f1[位n]|f2[位n]|f3[位n-1]|f1[位n-1]|f2[位n-1]…再次,如果字段fm小于另一字段,则推断这些高位为0(2008).作为示例,现在示出使用两个2-位字段或结构的简化表示。这些2-位字段最初可以表示为{01,01}。图21示出了对数据结构进行重新排序使得第一字段占据最高有效位的方法。最初,选择第一字段中的最高有效位,并将其写入输出(2100)。示意性地,这可以视作:{01,01}→{0---}然后选择第二数据结构中的最高有效位并写入输出(2102)。这可以示意性地示为:{01,01}→{00--}然后,获取第一数据结构中的第二位并将其写入输出(2104)。这示意性地示为:{01,01}→{001-}最后,选择并按顺序写入第二数据结构中的第二位(2106)。这可以示意性地示为:{01,01}→{0011}结果,获得了更紧凑的位表示。在使用中,例如用于压缩一系列固定长度的数据结构,如果存在多个固定大小的数据结构,每个数据结构包含单独的标识信息,则图20的方法可用于通过识别并删除或消除公共位来实现压缩。例如,考虑要压缩一系列定时的32位数据样本的示例。数据结构包括32位时间码和32位样本,两者都是无标记整数类型。第一个字段是样本的时间码,第二个字段是样本值。示例结构的表(表1)如下所示:表1来自数据的数据可以二进制表示为(在表2中):时间码(二进制)样本值(二进制)00000000000000000000000000000011000000000000000000000000110111110000000000000000000000000000101100000000000000000000000011110101000000000000000000000000000011010000000000000000000000001111110000000000000000000000000000010000000000000000000000000001000101010000000000000000000000000001011000000000000000000000000100101011000000000000000000000000000111110000000000000000000000010011100000000000000000000000000000110111000000000000000000000001010101110000000000000000000000000110001100000000000000000000000101000011表2可以看出,许多较高值位被设置为0。在一种方法中,为了利用重复的位,它们用重复码编码。编码的示例可以是编码表示前导零的数量的单个5位数,接着是以第一个1位开始的剩余位被编码为字面值。这样,数据结构可以平均减少50位,附加有标头数据的10位(每个字段5位)。结果,数据结构可以减小到大约24位的大小。本申请中描述的技术可以提供进一步的打包,同时减少所需的额外标头位的数量。给定以上数据,两个字段的平均、最大值和均值可用于计算重新排序模型。在这种情况下,与284的样本值字段平均相比,时间码字段具有较低的平均值31。因此,可以选择{时间码,样本值}的位重新排序。在一个实施例中,可以如下执行位重新排序:f1+f2或字段1加字段2。应当理解,这表示逐位串联而不是实际加法。这导致下表(表3):时间码+样本值00000000000000000000000000000000000000000000000001010001010111110000000000000000000000000000000000000000000000000101010110011011000000000000000000000000000000000000000000000000010101011111001000000000000000000000000000000000000000000000000100000011000100010000000000000000000000000000000000000000000000010000011001101101000000000000000000000000000000000000000000000001000001111110101000000000000000000000000000000000000000000000000100011011011111110000000000000000000000000000000000000000000000010001100000001111表3与之前的表示一样,结构的重新排序后的位包含48个前导0位的平均,留下结构数据所需的18位。因此,对于每个结构平均23位的总体结构,数据可以结构化为具有5位标头。通过使用按位掩码,并且将每个值编码为针对先前值的按位xor,甚至可以进一步压缩数据。如果数据是与顺序无关的,例如上面的数据,或者已经基于具有最高平均值的字段被排序,则得到的f1+f2值将是相对有序的。这种排序使xor在压缩数据方面更有效。得到的数据结构可以看作dn=(f1+f2)(n)^(f1+f2)(n-1)并且在表中表示为:dn000000000000000000000000000000000000000000000000101000101011111000000000000000000000000000000000000000000000000000010011000100000000000000000000000000000000000000000000000000000000001101001000000000000000000000000000000000000000000000010101011011100011000000000000000000000000000000000000000000000000000010101111100000000000000000000000000000000000000000000000000000000110000111000000000000000000000000000000000000000000000000001110010010101000000000000000000000000000000000000000000000000000001101110000表4注意,第一值保持不变,由此下一个值d2包含增量,以使用d1根据表1重新创建第三时间码的值。这些被掩码的值平均需要12位。它们的长度可以使用5位进行编码,这给定每个数据结构平均为17位。在进一步实施例中,还可以通过将二进制算法应用于输出来实现压缩增益。这减少了编码标头数据所需的位数。在推断数据压缩算法的进一步应用中,压缩可以用于通过结构字段重新解释来压缩固定长度数据结构。通过重新解释数据结构,可以提高压缩效率。在该实施例中,数据结构内的各个字段进一步细分为较小的子字段。例如,一对8位字段可以被解释为一系列8个2位字段考虑具有两个字节的数据结构的集合,其表示二维(2d)中的对象的x和y坐标。此数组表示对象随时间的位置。样本值如下表所示:表5每个数据结构的两个字节需要总共16位来表示它们的值。在二进制格式中,x和y值变为:xy01100100001010110110011000110011011010000011100101101010001111010110110000111111011011100011111101110000001111010111001000111001011101000011001101110110001010110111100000100001表6可以看出,每个结构的每个字段具有一些前导零。如果使用固有但灵活的位打包方法,则在每个值的前面插入3位标头,以表示每个字节使用的位数。这些标头的长度为3位,以覆盖所有8个潜在的最高有效位位置。这导致每个数据结构需要19位进行编码-这比其未打包的16位大小(2×3位标头数据+13位位置数据)要多。然而如上所述,通过使用推断的数据压缩方法,每个数据结构可以使用每字段17位来表示(4个标头位+13位位置数据,因为数据中的前导0被集中到最高有效位置)。如果在调用字段重新排序方法之前改变字段的边界以便获得8个2位字段而不是2个8位字段,则在该变换之后仅查看数组中的第一个元素时,确定以下值:f1f2f3f4f5f6f7f80110010000101011表7在对所有数据结构执行字段细分之后,可以单独地对每个字段求和或执行加法。在一个实施例中,选择基于最低到最高总值的顺序。如果总和中的两个产生相同的值,则优先级被给予占据其数据结构中最高有效位的字段。例如,如果一个结构的第7位和第8位平均为与另一个数据结构的第1和第2位相同的值,则在重新排序方面优先级被给予第7/第8对(注意在这种情况下位的位置是相对于它们的值-即最左边的位具有最高值,并且那些是获得优先级的值)。数据的结果产生如下:f1f2f3f4f5f6f7f8值113314200302823顺序17260543表8在这种情况下,f5总和为0,这意味着它从不具有值。由于该模型的工作原理,f5可以从最终序列中省略。因此得到的重新排序公式为:f1+f3+f8+f7+f6+f2。将该重新排序公式应用于数据以二进制格式产生以下内容:打包–二进制00001110111100000000101111110101000101100101010100010111110111000001111011111100000111110111110000000110110111010000011111010101000010101111010100001111111100010001001011010001表9现在可以将这些打包为16位的值,这产生每符号16.27位的平均打包大小。虽然它仍然相对原始数据扩大了,但是损失是平均一位的一小部分,并且这些值比基于字段的位打包被更有效地打包。这种改进取决于数据而变化,并且随着值占据其包含的字段类型的较少位,改进可以有高达25%。即使进一步使用诸如算术二进制编码器的基于熵的压缩器打包各个位,也由于仅需要单个标头作为开销,所以仍然保持了这一优点。上述实施例仅旨在作为示例。在不脱离预期保护的范围的情况下,本领域技术人员可以对特定实施例进行改变、修改和变化。尽管参考优选实施例及其具体示例以在此示出和描述了本公开,但是对于本领域技术人员显而易见的是,其他实施例和示例可以执行类似的功能和/或实现类似的结果。所有这些等同的实施例和示例都在本发明的精神和范围内。在前面的描述中,出于解释的目的,阐述了许多细节以便提供对实施例的透彻理解。然而,对于本领域技术人员显而易见的是,可能不需要这些具体细节。在其他情况下,可以以框图形式示出公知的结构以免模糊理解。例如,没有提供关于本文描述的实施例的元件是否实现为软件例程、硬件电路、固件或其组合的具体细节。本公开的实施例或其部件可被提供为或表示为存储在机器可读介质(也称为计算机可读介质、处理器可读介质或具有包含在其中的计算机可读程序代码的计算机可用介质)中的计算机程序产品。机器可读介质可以是任何合适的有形非暂时性介质,包括磁性、光学或电子存储介质,包括磁盘、光盘只读存储器(cd-rom)、存储器设备(易失性或非易失性)或类似的存储机制。机器可读介质可以包含各种指令集、代码序列、配置信息或其他数据,其在被执行时使处理器或控制器执行根据本公开的实施例的方法中的步骤。本领域技术人员将理解,实现所描述的实现所必需的其他指令和操作也可以存储在机器可读介质上。存储在机器可读介质上的指令可以由处理器、控制器或其他合适的处理设备执行,并且可以与电路连接以执行所描述的任务。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1