Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
2019 - COSCUP - 復活一個 Browser Game - Unlight 開源事件
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
蒼時弦や
August 18, 2019
Programming
820
1
Share
2019 - COSCUP - 復活一個 Browser Game - Unlight 開源事件
蒼時弦や
August 18, 2019
More Decks by 蒼時弦や
See All by 蒼時弦や
2024 - COSCUP - Clean Architecture in Rails
elct9620
2
200
2023 - RubyConfTW - Rethink Rails Architecture
elct9620
0
240
20230916 - DDDTW - 導入 Domain-Driven Design 的最佳時機
elct9620
0
470
2023 - WebConf - 選擇適合你的技能組合
elct9620
0
690
20230322 - Generative AI 小聚 ft. Happy Designer
elct9620
0
450
2022 - 默默會 - 重新學習 MVC 的 Model
elct9620
1
510
MOPCON 2022 - 從 Domain-Driven Design 看網站開發框架隱藏
elct9620
1
530
2022 - COSCUP - 我想慢慢寫程式該怎麼辦?
elct9620
0
290
2022 - COSCUP - 打造高速 Ruby 專案開發流程
elct9620
0
330
Other Decks in Programming
See All in Programming
Agentic UI beyond Chats Architecture Patterns & Open Standards @ngMunich 05/2026
manfredsteyer
PRO
0
110
Swiftのレキシカルスコープ管理
kntkymt
0
150
AI Agent と正しく分析するための環境作り
yoshyum
2
550
過去のレビュー知見をSkillsで資産化した話
pkshadeck
PRO
1
2.1k
関係性から理解する"同一性"の型用語たち
pvcresin
2
280
TSKaigi2026-静的解析への投資がAI時代のコード品質を支える ── カスタムESLintルールの設計と運用
hayatokudou
4
690
決定論 vs 確率論:Gemini 3 FlashとTF-IDFを組み合わせた「法規判定エンジン」の構築
shukob
0
170
Kubernetesを使わない環境にもCloud Nativeなデプロイを実現する / Enabling Cloud Native deployments without the complexity of Kubernetes
linyows
3
430
次世代リンターで探る、tsgo 時代における型認識カスタムルールの現実解
ytakahashii
1
640
How We Practice Exploratory Testing in Iterative Development( #scrumniigata ) / 反復開発の中で、探索的テストをどう実施しているか
teyamagu
PRO
3
1k
【ディップ|26年新卒研修資料】TDD実装演習
dip_tech
PRO
0
280
ローカルLLMでどこまでコードが書けるか / How much code can be written on a local LLM
kishida
2
380
Featured
See All Featured
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
410
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
530
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.1k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
120
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
160
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
150
Darren the Foodie - Storyboard
khoart
PRO
3
3.3k
Transcript
Revive a Browser Game Server The Open Unlight Project Photo
by Artem Labunsky on Unsplash
WEB DEVELOPER GAME DEVELOPER ࣌ ݭ @elct9620
None
None
Ruby + ActionScript 3
None
Adobe Flash IDE is unavailable!
mxmlc src/Unlight.mxml
Unlight can be compiled by Flex SDK 3.x
Failed because missing files
None
Setup environment takes much time
The source code always become dirty
None
•Always reset client compile environment •Patches / Rework •Customizable Server/Client
•Adjustable Docker compose configure
None
Secure Remote Password not matched!
None
http://srp.stanford.edu/design.html
http://srp.stanford.edu/design.html Step 1. Client create PublicKey A
http://srp.stanford.edu/design.html Step 2. Server create PublicKey B and send it
with Salt to user
http://srp.stanford.edu/design.html Step 3~. Compute SessionKey and verify other's Matcher
None
None
None
None
None
None
None
None
None
None
(/‵Д′)/~ ╧╧
None
None
24 Core CPU 24G RAM 98K IOPS SSD 300M/100M FTTH
Sponsor by Poka
Feel "LAG" after 500 online players
None
None
(0.214518s) SELECT * FROM `card_inventories` WHERE ( `card_inventories`. `chara_card_deck_id` =
2971)
src/model/card_inventory.rb
None
ALTER TABLE card_inventories ADD INDEX chara_card_deck_id (chara_card_deck_id)
None
About 100x faster
None
About 1000 online players without "LAG"
•Adjust Cpuset to fix database on specify cores •Adjust Swappiness
to prevent use disk •Adjust Full Table Index to cache small table
•Move Database outside Docker •Enable SR-IOV to use physics network
card •Add partition to database
Estimate capability > 3000 online players
•DAU about 500 online players •Rows grow fast Only two
weeks we have 10M ~ 20M rows •1 Developer 1 DevOps 1 Player Support
But how to hosting this game?
Add CloudWatch to analytic online players
Open Unlight's Reword/Customize
None
None
Open Unlight's Allow add customize gems
Tricks to allow Docker add optional files
customize/server/src/authentication.rb
customize/server/src/payment.ru
None
Use Rack to implement API server
None
Extend CLI to serve in docker
None
None
Hosting a game have to support players resolve problems
SmartLook can replay player session to debug
ZenDesk can help players in one central system
•ZenDesk - Player support •SmartLook - Client Debug (for HTML5)
•Asana - Issue Tracking •AWS - CDN/Monitoring •Discord - Co-working
The HTML5 version?
Flash will be removed at 2020 in Chrome
The Unlight client is Flash
But no one knows CPA will maintenance or not
From TCPSocket to WebSocket
Client Server Packet The TCPSocket send packet directly
Client Server Packet The WebSocket send packet with WebSocket wrapper
WebSocket
Unlight use EventMachine handles connection
Comment out all EventMachine connection
Implement a Rack middleware with WebSocket gem
Add Rack's .ru and it can be served by Puma
or Unicorn
We already migrated 90% server to WebSocket
How the client communicates with the server?
It convert data to a command
Each packet should have a header to describe command
JavaScript can create 2 byte struct?
new Int8Array([0x00, 0x03, 0x00, 0x01, 0x00, 0x0a])
(/‵Д′)/~ ╧╧
You can learn how the C programmer think by Unlight's
Ruby source code
From Golang to WebAssembly
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() }
GOOS=js GOARCH=wasm go build -o libul.go
Convert Unlight to HTML5 is possible!
What the next?
Test! Test! Test!
We are trying to learn to host a game server
as a programmer
And last ...
New security problem is coming!
Thanks