Upgrade to Pro — share decks privately, control downloads, hide ads and more …

『ドラゴンクエストウォーク』から学ぶ位置情報の扱い方

 『ドラゴンクエストウォーク』から学ぶ位置情報の扱い方

\積極的に技術発信を行なっております/

▽ Twitter/COLOPL_Tech
https://twitter.com/colopl_tech

▽ connpassページ
http://colopl.connpass.com

▽ COLOPL Tech Blog
http://blog.colopl.dev

COLOPL Inc.

June 30, 2023
Tweet

More Decks by COLOPL Inc.

Other Decks in Technology

Transcript

  1. サーバーサイドエンジニア T.T.
    ドラゴンクエストウォーク
    から学ぶ位置情報の扱い方

    View Slide

  2. 発表内容
    ● ドラゴンクエストウォークについて
    ● 位置情報ゲームについて
    ● 一般的なゲームと位置情報ゲームとの違い
    ● POIについて
    ● POIの検索
    ● ジオコードについて
    ● キャッシュの仕方
    ● まとめ
    2

    View Slide

  3. ドラゴンクエストウォーク
    ● スクウェア・エニックス社のIPと
    コロプラの位置情報ゲームに関する
    知見を活かしたタイトル
    ● 現在運用4年目
    (2019年9月12日リリース)
    ● 歩くことでモンスターと戦ったりクエストをクリアしたりなど
    実際にドラゴンクエストの世界を冒険しているような体験が可能
    ● 全国各地に存在するランドマークではゲーム内のおみやげを入手して
    旅の思い出を集めることもできる
    3
    ドラゴンクエストウォークについて

    View Slide

  4. 位置情報ゲーム
    ● 端末の位置情報を利用して現実世界での行動をゲームにも反映
    ● 現実世界とゲームが融合した新しい体験
    ● アイデア次第で様々な体験をつくりだすことができる
    コロプラではユーザーがプレイできない
    システム停止を伴うメンテナンスなく運用するノーメンテナンス運用
    位置情報ゲームとノーメンテナンス運用は非常に相性が良い
    ● メンテナンス時間がないためライフサイクルに合わせたプレイが可能
    ● せっかく遠くに行ったのにメンテナンス中だったという機会損失がない
    4
    位置情報ゲームについて

    View Slide

  5. 一般的なゲーム
    ● ユーザーデータ (動的データ)
    ○ キャラクターの状態、イベントの進行状況、所持アイテム等
    ● マスターデータ (静的データ)
    ○ イベント、アイテム等の設定
    + 位置情報ゲームに必要なもの
    ● POIデータ
    ○ コンテンツを現実世界に配置するためのデータ
    ○ イベントや機能ごとに全国分のデータを作成するのはコストが高いため
    共通のプールから各機能に割り当てる
    5
    一般的なゲームと位置情報ゲームの違い

    View Slide

  6. POI (Point of Interest)とは
    誰かが便利、あるいは興味のある所と思った特定の場所*
    簡単に言えば「どこに」「なにが」あるのかを紐づけたデータ
    ● どこに: 座標(緯度経度など)
    ● なにが: 観光地、動物園、レストランなど
    位置情報ゲームでは実際に移動してプレイするため
    コンテンツを不規則に配置するよりも
    実際に何かがある場所に配置した方が体験が良くなる
    6
    POIとは
    * 引用: Wikipedia https://ja.wikipedia.org/wiki/Point_of_interest

    View Slide

  7. 7
    POIについて(例)

    レストラン コンビニ 民家
    空き地 民家
    役所
    アイテムがあるからここに行こう
    ついでに食事もしよう
    (となるかもしれない)
    POI

    View Slide

  8. 8
    POIの使用例
    マスターデータ (アイテム)
    ●スポット1
    ▲スポット2
    POIデータ (座標)
    X
    1
    , Y
    1
    X
    2
    , Y
    2
    X
    3
    , Y
    3
    X
    4
    , Y
    4
    X
    5
    , Y
    5
    「どこに」「何が」あるのかを割り当てる
    マスターデータ (敵)
    ■スポット1
    ◆スポット2
    各機能で異なる 各機能で共通

    View Slide

  9. POIの使用例
    POIデータ (座標)
    X
    1
    , Y
    1
    X
    2
    , Y
    2
    X
    3
    , Y
    3
    X
    4
    , Y
    4
    X
    5
    , Y
    5
    各機能で異なる 各機能で共通
    「どこに」「何が」あるのかを割り当てる
    マスターデータ (アイテム)
    ●スポット1
    ▲スポット2
    マスターデータ (敵)
    ■スポット1
    ◆スポット2

    View Slide

  10. 10
    POIの使用例
    POIデータ (座標)
    X
    1
    , Y
    1
    X
    2
    , Y
    2
    X
    3
    , Y
    3
    X
    4
    , Y
    4
    X
    5
    , Y
    5
    各機能で異なる 各機能で共通





    現実世界
    「どこに」「何が」あるのかを割り当てる
    マスターデータ (アイテム)
    ●スポット1
    ▲スポット2
    マスターデータ (敵)
    ■スポット1
    ◆スポット2

    View Slide

  11. 位置に基づいたコンテンツの提供
    ● 緯度 Y
    a
    , 経度 X
    a
    に〇〇を表示
    ● 緯度 Y
    b
    , 経度 X
    b
    に〇〇を表示
    ● 緯度 Y
    c
    , 経度 X
    c
    に〇〇を表示
    どのように検索する?
    11




    POIの検索における課題
    SELECT * FROM POIデータ
    WHERE ???



    View Slide





  12. 位置に基づいたコンテンツの提供
    ● 緯度 Y
    a
    , 経度 X
    a
    に〇〇を表示
    ● 緯度 Y
    b
    , 経度 X
    b
    に〇〇を表示
    ● 緯度 Y
    c
    , 経度 X
    c
    に〇〇を表示
    どのように検索する?
    12
    POIの検索における課題
    SELECT * FROM POIデータ
    WHERE 緯度 BETWEEN Y
    1
    AND Y
    2
    AND 経度 BETWEEN X
    1
    AND X
    2
    X
    1
    X
    2
    Y
    2
    Y
    1
    緯度経度に複合インデックスを張る
    ● キャッシュが効きにくい
    ● 境界を含む?含まない?
    → もっと良い方法はないだろうか?



    View Slide





  13. 位置に基づいたコンテンツの提供
    ● 緯度 Y
    a
    , 経度 X
    a
    に〇〇を表示
    ● 緯度 Y
    b
    , 経度 X
    b
    に〇〇を表示
    ● 緯度 Y
    c
    , 経度 X
    c
    に〇〇を表示
    どのように検索する?
    13
    POIの検索方法
    SELECT * FROM POIデータ
    WHERE エリア IN (A, B, C, D)



    分割した領域に対してindexを張る
    ● キャッシュしやすい
    ● カラムとして持つため
    どこに属しているかは一意
    (境界が明確)
    A
    C D
    B

    View Slide

  14. 特定の領域に一意な識別子(名前)を割り当てる
    この識別子をジオコードという
    例えば以下のようなものがある
    ● 地域メッシュ (矩形)
    ● GeoHex (六角形)
    ● H3 (六角形)
    ● S2 (菱形)
    ● what3words (矩形)
    ● 都道府県や住所 など
    これらを用途に応じて使い分ける
    14
    ジオコードについて

    View Slide

  15. 緯度経度に沿った直線で碁盤目状の矩形に分割する
    特徴
    ● 矩形のため直感的で隣接するグリッドの探索も容易
    ● 実際の地球は球状(回転楕円体)のため
    地図(メルカトル図法)を緯度経度に沿って直線で区切ると
    赤道から離れるほど1マス当たりの面積が小さくなっていく
    ● 日本国内でも北海道と沖縄で1マスあたりの面積にある程度誤差が生じる
    → 面積や方向があまり重要でないときに使用
    → バッチ処理などで地域ごとにある程度分割したいときなどに有効
    15
    地域メッシュ
    A B
    C D

    View Slide

  16. 六角形(Hex)の組み合わせで地球を表現する
    特徴
    ● 六角形のため探索がやや複雑
    ● 赤道から離れたときの誤差が矩形よりも小さい
    ● 中心から端までの距離がほぼ均一のため扱いやすく
    隣接するマスまでの距離も一定
    ● 六角形の組み合わせで円を近似できる = 視界を表現できる
    → どの地域でも均一に処理したいときに使用
    → 方向の影響を受けにくいため画面表示物の制御などにも有効
    16
    GeoHex
    B
    C
    D
    A
    E G
    F

    View Slide

  17. 使用目的に応じて最適なものは変わるため
    それぞれの特徴を理解して要件に適しているかを検討することが重要
    ● 地域メッシュ (矩形) → 面積が重要でない
    ● GeoHex (六角形) → どの地域でも均一
    ● H3 (六角形) → どの地域でも均一
    ● S2 (菱形) → 歪みが少なくデータ量も小さい
    ● what3words (矩形) → 地点を直感的に指し示すことができる
    ● 都道府県や住所 など → 日常生活に近い
    17
    ジオコードの選び方

    View Slide

  18. 18
    POIデータの特徴と負荷対策
    位置情報ゲームならではの課題が存在
    データ量が非常に多い
    ● 現実世界での位置に応じて投げるクエリが変わる
    ● できればキャッシュしたいが
    データ量が膨大なためすべてのクエリをキャッシュするのはほぼ不可能
    → キャッシュに工夫が必要
    ユーザーデータが肥大化しやすい
    ● 例えば訪れた場所(消化済みのコンテンツ)を記録しておくなどすると
    最大で ユーザー数 × POIの数 のレコードが作られる
    → 定期的に不要なデータを削除 (データに期限を設ける)

    View Slide

  19. 19
    キャッシュの仕方
    データ数が多くすべてをキャッシュするのは難しい
    基本方針はヒットしやすいものに絞ってキャッシュする
    移動は連続的 (ワープはしない)
    ● 参照したデータは引き続き参照される可能性が高い
    → 短期間のみのキャッシュが効果的
    人口によって参照されるデータに偏りがある
    ● 都市部は必然的に人口が多いためアクセス頻度が高い
    ● 逆に山間部や離島などは相対的にアクセス頻度が低い
    → 人口が多い都市部に限定してキャッシュすると効果的

    View Slide

  20. 20
    まとめ
    ● 位置情報ゲームではPOIを使用して現実世界にコンテンツを配置する
    ● どこになにがあるのかを紐づけたデータであるPOIの検索は非常に重要
    ● POIを効率的に検索するためには工夫が必要
    ○ ジオコードを用いたインデックスを張ると検索や管理がしやすい
    ○ 目的に合わせて使用するジオコードを選択する
    ● データ数が多いためすべてをキャッシュするのは難しい
    ○ データの特性に着目すると効率的にキャッシュできる
    ○ 連続的な移動を考慮して短期間のみキャッシュする
    ○ 人口密度などを考慮して一部の場所だけキャッシュする

    View Slide