2

以下は、pygletを使用してレンダリングされる2Dアイソメタイルのマップの部分的なクラス定義です。

class Map(object):

    origin = 0
    drytile = tile.dry
    wettile = tile.wet

    def __init__(self, left=8, right=8):
        self.grid = np.array(([None] * left, [None] * right), dtype=object)
        self._setup_grid()

    def __iter__(self):
        """return tiles in the order in which they should be rendered"""
        # get number of diagonals
        ndiags = (np.max(self.grid.shape) * 2) -\
                 (1 + (np.max(self.grid.shape) - np.min(self.grid.shape)))

        # get iterator to go through diagonals in back-to-front order
        offsets = xrange(-(ndiags / 2), ndiags / 2 + 1)

        # iterate in render order
        for off in offsets:
            for tile in np.flipud(self.grid).diagonal(off)[::-1]:
                yield tile

これらのタイルは、次の図のように、後ろから前にレンダリングする必要があります。

タイルのレンダリング順序。 原点は上隅にあります

私のクラス定義では、原点は最上位のタイル(tile a)を参照しているためleft、クラスで定義されている次元はに沿ったベクトル[a b d g]であり、 right次元はに沿ったベクトル[a c f j]です。

多数のタイルをレンダリングするつもりなので、これは私のアプリケーションの速度が重要な部分です。指定された順序でタイルを反復処理するより速い方法はありますか?ネストされたループのヘルプを削除できますか?

どうもありがとう!

4

1 に答える 1

0

最初にデータ構造を注文します。ベクトルを注文すると、反復処理が速くなります。

一般に、順序付けられたデータ構造を使用することは、この種のことには適しています。

何らかの理由で構造を操作している場合は、「順序付き挿入」または削除を実行する必要がありますが、これは時間がかかります。順序付けられたデータ構造を使用することのトレードオフは、挿入と削除です。ボードはあまり変更されるべきではないため、順序付けられたデータ構造でのみ使用できるように見えます。

于 2013-02-10T04:14:57.123 に答える