1

我需要一些帮助来实现更快的方法来对二维数组进行完全移位。

我的问题是我有一个包含游戏地图数据的二维数组。这个游戏有点像几何冲刺,但在 Game Boy Advance 上。到目前为止,我有一张看起来像这样的地图:

int map1[9][40] = {
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0 },
    {0, 0, 0, 0, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0 },
    {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0 },
    {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
};

但是要阅读这张地图,我必须遍历每一个元素,看看它是否应该被绘制到屏幕上(x >= 0 && x <= screen_width)。

考虑一下,我认为我应该使用双向链表。这样,我可以通过将标题节点移动到拖车来移动列表,然后只绘制前 15 个节点的(左右)数据。与循环遍历 2D 数组中的每个元素相比,这是否会提高性能?虽然循环不一定是破坏游戏的性能缺陷,但我确实想优化它。

如果是这样,我将如何实现这个双向链表以包含与二维数组相同的数据?

4

1 回答 1

1

首先使用双向链表会使性能更差。你目前的方法是我现在想到的最快的方法。首先,您需要了解数组和链表如何在幕后工作。对于数组,我强烈建议您观看5 分钟的视频,因为用文字解释这一点需要太长时间。在了解了数组的工作原理之后,您需要将其与链表进行比较。当访问数组中的元素时,计算机所做的一切只是将内存地址增加索引乘以数组类型的大小,然后取消引用该地址。当访问或更好地说循环通过链表时,你会做更多的事情。首先,您将取消引用该项目,然后处理数据,然后查看下一项是否为 NULL,然后跳转到下一项,取消引用该项目,依此类推。

简而言之,经验法则是:如果您不知道数组的长度,则仅使用链表。

现在回答你的问题。如果你想实现这样一个二维链表,你的结构将如下所示:

struct LinkedList {
    struct LinkedList* data;
    struct LinkedList* prev;
    struct LinkedList* next;

prev并且next只是指向上一个和下一个项目的指针。数据将是实际数据。

这是一张图表,希望能解释我的意思: 在此处输入图像描述

所以总而言之,你的解析方法比链表好。但是我认为最快的解析将是动态解析。

于 2020-08-15T21:16:27.903 回答