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

2019 - COSCUP - 復活一個 Browser Game - Unlight 開源事件

2019 - COSCUP - 復活一個 Browser Game - Unlight 開源事件

蒼時弦や

August 18, 2019
Tweet

More Decks by 蒼時弦や

Other Decks in Programming

Transcript

  1. Revive a Browser Game Server
    The Open Unlight Project
    Photo by Artem Labunsky on Unsplash

    View Slide

  2. WEB DEVELOPER
    GAME DEVELOPER


    ݭ໵
    @elct9620

    View Slide

  3. View Slide

  4. View Slide

  5. Ruby + ActionScript 3

    View Slide

  6. View Slide

  7. Adobe Flash IDE is unavailable!

    View Slide

  8. mxmlc src/Unlight.mxml

    View Slide

  9. Unlight can be compiled
    by Flex SDK 3.x

    View Slide

  10. Failed because missing files

    View Slide

  11. View Slide

  12. Setup environment takes much time

    View Slide

  13. The source code always become dirty

    View Slide

  14. View Slide

  15. •Always reset client compile environment
    •Patches / Rework
    •Customizable Server/Client
    •Adjustable Docker compose configure

    View Slide

  16. View Slide

  17. Secure Remote Password
    not matched!

    View Slide

  18. View Slide

  19. http://srp.stanford.edu/design.html

    View Slide

  20. http://srp.stanford.edu/design.html
    Step 1. Client create PublicKey A

    View Slide

  21. http://srp.stanford.edu/design.html
    Step 2. Server create PublicKey B and send it with Salt to user

    View Slide

  22. http://srp.stanford.edu/design.html
    Step 3~. Compute SessionKey and verify other's Matcher

    View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. View Slide

  33. (/‵Д′)/~ ╧╧

    View Slide

  34. View Slide

  35. View Slide

  36. 24 Core CPU
    24G RAM
    98K IOPS SSD
    300M/100M FTTH
    Sponsor by Poka

    View Slide

  37. Feel "LAG" after 500 online
    players

    View Slide

  38. View Slide

  39. View Slide

  40. (0.214518s)
    SELECT *
    FROM `card_inventories`
    WHERE (
    `card_inventories`.
    `chara_card_deck_id` = 2971)

    View Slide

  41. src/model/card_inventory.rb

    View Slide

  42. View Slide

  43. ALTER TABLE
    card_inventories
    ADD INDEX
    chara_card_deck_id
    (chara_card_deck_id)

    View Slide

  44. View Slide

  45. About 100x faster

    View Slide

  46. View Slide

  47. About 1000 online players
    without "LAG"

    View Slide

  48. •Adjust Cpuset to fix database on specify cores
    •Adjust Swappiness to prevent use disk
    •Adjust Full Table Index to cache small table

    View Slide

  49. •Move Database outside Docker
    •Enable SR-IOV to use physics network card
    •Add partition to database

    View Slide

  50. Estimate capability > 3000
    online players

    View Slide

  51. •DAU about 500 online players
    •Rows grow fast

    Only two weeks we have 10M ~ 20M rows
    •1 Developer

    1 DevOps

    1 Player Support

    View Slide

  52. But how to hosting this game?

    View Slide

  53. Add CloudWatch to analytic online players

    View Slide

  54. Open Unlight's
    Reword/Customize

    View Slide

  55. View Slide

  56. View Slide

  57. Open Unlight's
    Allow add customize gems

    View Slide

  58. Tricks to allow Docker add optional files

    View Slide

  59. customize/server/src/authentication.rb

    View Slide

  60. customize/server/src/payment.ru

    View Slide

  61. View Slide

  62. Use Rack to implement
    API server

    View Slide

  63. View Slide

  64. Extend CLI to serve in docker

    View Slide

  65. View Slide

  66. View Slide

  67. Hosting a game have to support
    players resolve problems

    View Slide

  68. SmartLook can replay player session to debug

    View Slide

  69. ZenDesk can help players in one central system

    View Slide

  70. •ZenDesk - Player support
    •SmartLook - Client Debug (for HTML5)
    •Asana - Issue Tracking
    •AWS - CDN/Monitoring
    •Discord - Co-working

    View Slide

  71. The HTML5 version?

    View Slide

  72. Flash will be removed
    at 2020 in Chrome

    View Slide

  73. The Unlight client is Flash

    View Slide

  74. But no one knows CPA will
    maintenance or not

    View Slide

  75. From TCPSocket to WebSocket

    View Slide

  76. Client Server
    Packet
    The TCPSocket send packet directly

    View Slide

  77. Client Server
    Packet
    The WebSocket send packet with WebSocket wrapper
    WebSocket

    View Slide

  78. Unlight use EventMachine
    handles connection

    View Slide

  79. Comment out all EventMachine connection

    View Slide

  80. Implement a Rack middleware with WebSocket gem

    View Slide

  81. Add Rack's .ru and it can be served by Puma or Unicorn

    View Slide

  82. We already
    migrated 90% server to
    WebSocket

    View Slide

  83. How the client communicates
    with the server?

    View Slide

  84. It convert data to a command

    View Slide

  85. Each packet should have a header to describe command

    View Slide

  86. JavaScript can create 2 byte
    struct?

    View Slide

  87. new Int8Array([0x00, 0x03, 0x00, 0x01,
    0x00, 0x0a])

    View Slide

  88. (/‵Д′)/~ ╧╧

    View Slide

  89. You can learn how
    the C programmer think
    by Unlight's Ruby source code

    View Slide

  90. From Golang to WebAssembly

    View Slide

  91. func AuthCmd(name string) []byte {
    buffer := new(bytes.Buffer)
    binary.Write(buffer, binary.BigEndian, uint16(1))
    binary.Write(buffer, binary.BigEndian,
    []byte(name))
    return buffer.Bytes()
    }

    View Slide

  92. GOOS=js GOARCH=wasm
    go build -o libul.go

    View Slide

  93. Convert Unlight to
    HTML5 is possible!

    View Slide

  94. What the next?

    View Slide

  95. Test! Test! Test!

    View Slide

  96. We are trying to learn to host a
    game server as a programmer

    View Slide

  97. And last ...

    View Slide

  98. New security problem is coming!

    View Slide

  99. Thanks

    View Slide