$30 off During Our Annual Pro Sale. View Details »

ゲームタイトル開発側と サーバー基盤の連携事例の紹介

COLOPL Inc.
September 28, 2023

ゲームタイトル開発側と サーバー基盤の連携事例の紹介

COLOPL Inc.

September 28, 2023
Tweet

More Decks by COLOPL Inc.

Other Decks in Technology

Transcript

  1. ゲームタイトル開発側と
    サーバー基盤の連携事例の紹介
    薮智仁

    View Slide

  2. 2
    経歴
    1. 2019年:新卒入社
    2. 運用ゲームタイトル2年
    3. 新規ゲームタイトルローンチ + 運用移行
    4. 新規ゲームタイトル開発2年 ← Now !
    氏名 :
    職種 :
    所属 :
    薮 智仁
    サーバーサイドエンジニア
    技術基盤本部
    第3バックエンドエンジニア部
    マネージャー補佐
    自己紹介

    View Slide

  3. 3
    お話しすること
    ゲームタイトル開発側とサーバー基盤の
    過去の相談や連携事例を3つご紹介

    View Slide

  4. 4
    〜 ① Slack 相談編 〜

    View Slide

  5. 5
    ① Slack 相談編
    〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

    View Slide

  6. 6
    ① Slack 相談編
    〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

    View Slide

  7. 7
    ① Slack 相談編
    〜とあるゲームタイトルのエンジニア Slack チャンネルにて〜

    View Slide

  8. 8
    Slack ならではの
    気軽な流れでサーバー基盤チームに相談できる!
    ① Slack 相談編

    View Slide

  9. 9
    〜 ②コントリビュート編 〜

    View Slide

  10. 10
    ②コントリビュート編
    〜GitLab の issue にて提案してコントリビュート〜

    View Slide

  11. 11
    ②コントリビュート編
    〜GitLab の issue にて提案してコントリビュート〜

    View Slide

  12. 12
    ②コントリビュート編
    問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた
    $user->push();
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2);
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5);
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3;
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4;

    View Slide

  13. 13
    ②コントリビュート編
    問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた
    $user->push();
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2);
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5);
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3;
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4;
    対応:複数モデルを一括で保存するよう Model::push() の中身をオーバーライド
    $user->push();
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2), ('user1', 2, 5);
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId IN (3, 4);

    View Slide

  14. 14
    ②コントリビュート編
    問題:Model::push() の標準実装がループで Model::save() を呼んでおりN+1クエリになっていた
    $user->push();
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2);
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 2, 5);
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 3;
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId = 4;
    対応:複数モデルを一括で保存するよう Model::push() の中身をオーバーライド
    $user->push();
    // INSERT INTO UserItem (userId, itemId, amount) VALUES ('user1', 1, 2), ('user1', 2, 5);
    // UPDATE UserItem SET amount = 10 WHERE userId = 'user1' AND itemId IN (3, 4);
    ゲームタイトルのコードはそのままでDB負荷を軽減! 🥳

    View Slide

  15. 15
    OSSへのコントリビュートより
    ハードルが低いので練習として最適!
    ②コントリビュート編

    View Slide

  16. 16
    〜 ③他タイトルとの議論編 〜

    View Slide

  17. 17
    ③他タイトルとの議論編

    View Slide

  18. 18
    ③他タイトルとの議論編
    他ゲームタイトルのエンジニアからも意見が!

    View Slide

  19. 19
    ③他タイトルとの議論編
    意見も反映した上でマージリクエストを作ってみる
    テストコードの実装 + メンテがかなり楽に! 🥳

    View Slide

  20. 20
    まとめ
    ゲームタイトル開発側とサーバー基盤で
    連携することにより
    ゲームの開発効率を向上していっています!

    View Slide