我见过一些将数据存储在索引文件中的程序和游戏,他们从该文件加载他们通常称为cache
的数据。
我希望能够以这种方式加载我的数据:
final int SPRITES_INDEX = 3;
List<Sprite> sprites = (List<Sprite>) cache.loadIndex(SPRITES_INDEX);
有没有人知道它是如何完成的以及为什么这样做?或者这种存储数据的方法有名称吗?
答案 0 :(得分:3)
你应该查看&#34;资源&#34; in&#34; jar&#34;文件。这是java世界中这项工作常用的东西。通常情况下,jar文件只是一个zip文件,它是顺序的,但多年前他们添加了索引jar文件的功能,这些文件提供对其内容的随机访问。
您可以从这里开始:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/jar.html
(查找&#34; i&#34;选项,为jar文件添加索引。)
答案 1 :(得分:1)
至少对于图像/渲染,这称为Texture Packing
,因为OpenGL在渲染之前“绑定”了图像,并且这种绑定在处理方面可能很昂贵。
将纹理打包在较大的图像中允许游戏/应用程序仅绑定一次,然后,基于预定义像素坐标的索引,仅渲染较大图像的一部分,就像它们是单独的较小图像一样。
我建议看看LibGDX的TexturePacker
。
提取物:
在OpenGL中,绑定纹理,完成一些绘制,另一个纹理 绑定,更多的绘图,等等。绑定纹理是相对的 价格昂贵,因此很适合在较大的图像上存储许多较小的图像 图像,绑定较大的纹理一次,然后绘制它的一部分很多 倍。 libgdx有一个TexturePacker类,它是一个命令行 将许多较小图像打包到较大图像上的应用程序。它 存储较小图像的位置,以便它们很容易 使用TextureAtlas类在您的应用程序中通过名称引用。
TexturePacker使用多种打包算法但最重要 基于最大矩形算法。它也使用粗暴 力量,包装与各种大小的众多启发式然后 选择最有效的结果。
请注意,这是Caching
的一般概念,类似但不相同。
在计算机编程中,缓存包括将一段内存专用于存储最近或经常使用的数据,以避免每次需要/访问时都必须重新创建/重新处理该数据。
因此,它与纹理包装的概念类似,但不一样,相反,它不是为了重新创建/重新处理图像本身,而是为了避免昂贵的复杂化/处理进一步发展。
考虑到问题的游戏背景,同样重要的是要注意另一个概念,这次更接近缓存,存在。它被称为Pooling
,包括创建一个预先创建/预处理的对象实例的缓存(在本例中称为Pool
),这些实例可能会随着时间的推移需要不同的数量, RTS游戏中的单位示例,以避免在需要时创建它们(反过来避免处理中的突然“重量”,导致FPS突然下降,或“游戏”中的“口吃”)