Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

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

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

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

▽ 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. ドラゴンクエストウォーク • スクウェア・エニックス社のIPと コロプラの位置情報ゲームに関する 知見を活かしたタイトル • 現在運用4年目 (2019年9月12日リリース) • 歩くことでモンスターと戦ったりクエストをクリアしたりなど

    実際にドラゴンクエストの世界を冒険しているような体験が可能 • 全国各地に存在するランドマークではゲーム内のおみやげを入手して 旅の思い出を集めることもできる 3 ドラゴンクエストウォークについて
  2. 一般的なゲーム • ユーザーデータ (動的データ) ◦ キャラクターの状態、イベントの進行状況、所持アイテム等 • マスターデータ (静的データ) ◦

    イベント、アイテム等の設定 + 位置情報ゲームに必要なもの • POIデータ ◦ コンテンツを現実世界に配置するためのデータ ◦ イベントや機能ごとに全国分のデータを作成するのはコストが高いため 共通のプールから各機能に割り当てる 5 一般的なゲームと位置情報ゲームの違い
  3. POI (Point of Interest)とは 誰かが便利、あるいは興味のある所と思った特定の場所* 簡単に言えば「どこに」「なにが」あるのかを紐づけたデータ • どこに: 座標(緯度経度など) •

    なにが: 観光地、動物園、レストランなど 位置情報ゲームでは実際に移動してプレイするため コンテンツを不規則に配置するよりも 実際に何かがある場所に配置した方が体験が良くなる 6 POIとは * 引用: Wikipedia https://ja.wikipedia.org/wiki/Point_of_interest
  4. 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 各機能で異なる 各機能で共通
  5. 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
  6. 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
  7. 位置に基づいたコンテンツの提供 • 緯度 Y a , 経度 X a に〇〇を表示

    • 緯度 Y b , 経度 X b に〇〇を表示 • 緯度 Y c , 経度 X c に〇〇を表示 どのように検索する? 11 ▪ ▪ ▪ ▪ POIの検索における課題 SELECT * FROM POIデータ WHERE ??? ▪ ▪ ▪
  8. ▪ ▪ ▪ ▪ 位置に基づいたコンテンツの提供 • 緯度 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 緯度経度に複合インデックスを張る • キャッシュが効きにくい • 境界を含む?含まない? → もっと良い方法はないだろうか? ▪ ▪ ▪
  9. ▪ ▪ ▪ ▪ 位置に基づいたコンテンツの提供 • 緯度 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
  10. 特定の領域に一意な識別子(名前)を割り当てる この識別子をジオコードという 例えば以下のようなものがある • 地域メッシュ (矩形) • GeoHex (六角形) •

    H3 (六角形) • S2 (菱形) • what3words (矩形) • 都道府県や住所 など これらを用途に応じて使い分ける 14 ジオコードについて
  11. 六角形(Hex)の組み合わせで地球を表現する 特徴 • 六角形のため探索がやや複雑 • 赤道から離れたときの誤差が矩形よりも小さい • 中心から端までの距離がほぼ均一のため扱いやすく 隣接するマスまでの距離も一定 •

    六角形の組み合わせで円を近似できる = 視界を表現できる → どの地域でも均一に処理したいときに使用 → 方向の影響を受けにくいため画面表示物の制御などにも有効 16 GeoHex B C D A E G F
  12. 使用目的に応じて最適なものは変わるため それぞれの特徴を理解して要件に適しているかを検討することが重要 • 地域メッシュ (矩形) → 面積が重要でない • GeoHex (六角形)

    → どの地域でも均一 • H3 (六角形) → どの地域でも均一 • S2 (菱形) → 歪みが少なくデータ量も小さい • what3words (矩形) → 地点を直感的に指し示すことができる • 都道府県や住所 など → 日常生活に近い 17 ジオコードの選び方
  13. 18 POIデータの特徴と負荷対策 位置情報ゲームならではの課題が存在 データ量が非常に多い • 現実世界での位置に応じて投げるクエリが変わる • できればキャッシュしたいが データ量が膨大なためすべてのクエリをキャッシュするのはほぼ不可能 →

    キャッシュに工夫が必要 ユーザーデータが肥大化しやすい • 例えば訪れた場所(消化済みのコンテンツ)を記録しておくなどすると 最大で ユーザー数 × POIの数 のレコードが作られる → 定期的に不要なデータを削除 (データに期限を設ける)
  14. 19 キャッシュの仕方 データ数が多くすべてをキャッシュするのは難しい 基本方針はヒットしやすいものに絞ってキャッシュする 移動は連続的 (ワープはしない) • 参照したデータは引き続き参照される可能性が高い → 短期間のみのキャッシュが効果的

    人口によって参照されるデータに偏りがある • 都市部は必然的に人口が多いためアクセス頻度が高い • 逆に山間部や離島などは相対的にアクセス頻度が低い → 人口が多い都市部に限定してキャッシュすると効果的
  15. 20 まとめ • 位置情報ゲームではPOIを使用して現実世界にコンテンツを配置する • どこになにがあるのかを紐づけたデータであるPOIの検索は非常に重要 • POIを効率的に検索するためには工夫が必要 ◦ ジオコードを用いたインデックスを張ると検索や管理がしやすい

    ◦ 目的に合わせて使用するジオコードを選択する • データ数が多いためすべてをキャッシュするのは難しい ◦ データの特性に着目すると効率的にキャッシュできる ◦ 連続的な移動を考慮して短期間のみキャッシュする ◦ 人口密度などを考慮して一部の場所だけキャッシュする