惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
W
WeLiveSecurity
Cyberwarzone
Cyberwarzone
H
Help Net Security
Spread Privacy
Spread Privacy
Jina AI
Jina AI
G
GRAHAM CLULEY
Project Zero
Project Zero
aimingoo的专栏
aimingoo的专栏
P
Palo Alto Networks Blog
云风的 BLOG
云风的 BLOG
B
Blog RSS Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
A
Arctic Wolf
L
LangChain Blog
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
人人都是产品经理
人人都是产品经理
罗磊的独立博客
量子位
Microsoft Security Blog
Microsoft Security Blog
The Register - Security
The Register - Security
B
Blog
Microsoft Azure Blog
Microsoft Azure Blog
G
Google Developers Blog
小众软件
小众软件
Vercel News
Vercel News
V
Visual Studio Blog
IT之家
IT之家
C
Cisco Blogs
博客园 - 聂微东
Cisco Talos Blog
Cisco Talos Blog
Help Net Security
Help Net Security
S
Schneier on Security
PCI Perspectives
PCI Perspectives
C
Check Point Blog
V
Vulnerabilities – Threatpost
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
SecWiki News
SecWiki News
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Tenable Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recorded Future
Recorded Future

Yesterday17's Blog

2026 新年解密红包 / Melody Flag | Yesterday17's Blog 谈谈 Iori 的设计思路(二):如何实现一个 Showroom 录制工具? | Yesterday17's Blog 谈谈 Iori 的设计思路(一):从 Nico Timeshift 说起 | Yesterday17's Blog Iori Minyami 0.1.0 发布 | Yesterday17's Blog 2025 新年解密红包 / Melody Flag | Yesterday17's Blog 使用 Cloudflare Warp 解决罗森票务的海外登录问题 | Yesterday17's Blog How To Blog 04: The Astro v5 Era | Yesterday17's Blog 谈谈 tokio::select! 的公平性 | Yesterday17's Blog Learning Pingora 05 - Connect with TLS | Yesterday17's Blog Leaving Bytedance | Yesterday17's Blog 大橋彩香 AsiaTour「Reflection」上海公演 个人向记录 & Repo | Yesterday17's Blog Recoving from burnout - What happened? | Yesterday17 Yubikey 重建手册 | Yesterday17's Blog How To Blog 03: Heimus | Yesterday17's Blog 🪧 Blog Migration Accouncement | Yesterday17's Blog Learn Your IDE - VSCode 是如何仅重启插件的? | Yesterday17's Blog How To Blog 02: Astro❤️Password | Yesterday17's Blog How To Blog 01: Why, How, and the Future | Yesterday17's Blog Learning Pingora 04 - Establish L4 Connection | Yesterday17's Blog Learning Pingora 03 - Upstreams and Peers | Yesterday17's Blog Learning Pingora 02 - A Simple HTTP Server | Yesterday17's Blog Learning Pingora 01 - Getting Started | Yesterday17's Blog 2024 新年解密红包 / Melody Flag | Yesterday17's Blog 向新的一年飞驰——记录 2023 | Yesterday17's Blog 「サクラノ刻」对话选摘(2) | Yesterday17's Blog PGP Key Revocation 注销声明 | Yesterday17's Blog 「サクラノ刻」对话选摘(1) | Yesterday17's Blog 2023 新年解密红包 / Melody Flag | Yesterday17's Blog 『蒼の彼方のフォーリズム』通关感想 | Yesterday17's Blog 单显卡直通教程 | Yesterday17's Blog 对博客与笔记的思考 | Yesterday17's Blog Project Anni 之旅(3)自动化 Flutter 应用 CI/CD 上架流程 | Yesterday17's Blog AsobiStage 直接播放链接 | Yesterday17 如何在后分P时代进行投稿——sswa使用详解 | Yesterday17's Blog JSON RPC 与 LSP 协议基础 | Yesterday17's Blog Grajapa Shueisha / BookEnd 加密方式调查 | Yesterday17's Blog 【2022篇+WriteUp】如何再收一个新年红包? | Yesterday17's Blog 如何将良心云的良心功能清理干净 | Yesterday17's Blog 【油猴脚本】bilibili 投稿页面返回旧版+旧版页面强制允许分P上传 | Yesterday17's Blog Cloudr1v1 授权方式分析 | Yesterday17 Typora 1.0.2 逆向实录 | Yesterday17's Blog Project Anni 之旅(2)ValueAfterTable——toml-rs的实现与限制 | Yesterday17's Blog IPv4透明代理+IPv6 Passthrough——树莓派单臂软路由折腾记 | Yesterday17's Blog Chaos; Child 汉化补丁 神秘编码探索 | Yesterday17's Blog 镣铐与舞蹈——个性与共性之迷思 | Yesterday17's Blog Go 学习笔记 02 - 找准 io 之道 | Yesterday17's Blog NAT Slipstreaming v1 原理浅析 | Yesterday17's Blog 绕过「9-nine-」的 CDKEY 验证——KrkrPlugin 正(?)向实录 | Yesterday17's Blog 静流的青春纪念册——「サクラノ刻 -櫻の森の下を歩む-」体验版感言 | Yesterday17's Blog Project Anni 之旅 01 - 从 clap-builder 到 derive | Yesterday17's Blog [Google CTF 2021] CPP WriteUp | Yesterday17's Blog 获取 アソビステージ 的实际播放链接 | Yesterday17's Blog 90 行 Rust 代码实现 AsyncTeeReader | Yesterday17's Blog 或许还算有价值一读的文章列表 | Yesterday17's Blog 从零开始的 Seedbox 之旅 | Yesterday17's Blog [随笔]技术型博客行文迷思(1) | Yesterday17's Blog 浅谈 git fetch 的工作方式 | Yesterday17's Blog 『ソーサレス*アライヴ! ~the World's End Fallen Star~』通关感想" | Yesterday17's Blog Rust std::fmt 格式语法简述 | Yesterday17's Blog 日亚修改居住国的解决方案 | Yesterday17's Blog [Windows/Linux] GC553 的 Switch 完美采集之路 | Yesterday17's Blog 【翻译】Subtyping and Variance / 子类型与变型 | Yesterday17's Blog Berd's Red Envelope 2021 WriteUp | Yesterday17's Blog 【中英对照】ALSA 音频 API 使用教程/A Tutorial on Using the ALSA Audio API | Yesterday17's Blog 从 cue_scanner.l 看 CUE Sheet 的词法单元 | Yesterday17's Blog Postman 历史记录导出的解决方案 | Yesterday17's Blog 《恋爱绮谭 不存在的夏天》通关感想 | Yesterday17's Blog [微机实验/TD-PITE] 微机接口综合实验 | Yesterday17's Blog [微机实验/TD-PITE] 键盘扫描及数码管显示实验 | Yesterday17's Blog [微机实验/TD-PITE] 数码管显示实验 | Yesterday17's Blog Airsonic Advanced+Google Drive+Caddy 部署纪实 | Yesterday17's Blog X-NUCA 2020 - hellowasm 题解 | Yesterday17's Blog [微机实验/TD-PITE] 8251 串行接口实验 | Yesterday17's Blog Node.js child_process.fork 与 env 污染 RCE | Yesterday17's Blog EP.01 「夜の向日葵」 | Yesterday17's Blog [微机实验/TD-PITE] 8254 定时/计数器实验+选做实验 | Yesterday17's Blog [JLU CTF/2020] babywasm WriteUp | Yesterday17's Blog PHP 反序列化与经典利用 | Yesterday17's Blog WebAssembly 逆向简述 | Yesterday17's Blog 『彼女、お借りします』一期完结点评 | Yesterday17's Blog [微机实验/TD-PITE] D/A 转换实验+选做实验 | Yesterday17's Blog [微机实验/TD-PITE] A/D 转换实验+选做实验 | Yesterday17's Blog 开源项目申请 JetBrains Open Source License 简单流程 | Yesterday17's Blog 微软拼音与 JetBrains 搜索快捷键冲突的解决方案 | Yesterday17's Blog [微机实验/TD-PITE] 8259 中断优先级实验+选做实验 | Yesterday17's Blog IFTTT 测试(续) | Yesterday17 IFTTT 测试 | Yesterday17's Blog [微机实验/TD-PITE] 存储器扩展实验+选做实验 | Yesterday17's Blog 新版 GCC 针对 -fdump-translation-unit 的替代方案 | Yesterday17's Blog 一次 HSTS 策略配置的排错之旅 | Yesterday17's Blog YukiNative 踩坑记——Windows 的消息队列 | Yesterday17's Blog 我是我自己——论获取 HTTPS 证书时的验证步骤 | Yesterday17's Blog 【设计文档】对 PUG 的大规模设计修订(1.1) | Yesterday17's Blog GS65 折腾记(2)加装固态,分区,Grub2 引导 Manjaro LiveCD | Yesterday17's Blog 「さくら、もゆ。」的空白字体列表——一次逆向问题定位过程实录 | Yesterday17's Blog GSuite 探索篇(1)使用 Service Account 向 Google Drive 传输文件 | Yesterday17's Blog 『サクラノ詩 -櫻の森の上を舞う-』通关感想 | Yesterday17's Blog 《ATRI -My Dear Moments-》通关感想 | Yesterday17's Blog [工具][VSCode 扩展] AegiKit——方便 Aegisub 使用的工具箱 | Yesterday17's Blog 贝塞尔曲线、字体矢量化与曲线运算 | Yesterday17's Blog
Shinym@s 初探 07.5 - 官方「作り方」中透露出的技术信息 | Yesterday17's Blog
Yesterday17 · 2020-05-26 · via Yesterday17's Blog

⚠️ 水文警告
本文无实质性内容,仅供作者自娱自乐。文中内容或许能对你有所帮助,但大概率没有帮助,望周知。

大家好,好久不见,我是某昨。

之前无聊在网上瞎搜,没想到居然找到了一篇官方的技术报告,遂分析之。虽然最终并没有分析出什么有用的,但也从侧面印证了之前逆向结果的正确性。算是强行找出了点作用吧(

ToC

  • 前言
  • 技术选型
    • 游戏引擎(ゲームエンジン)
    • 音频(サウンド)
    • 动画(アニメーション)
    • 特效(エフェクト)
    • 资源持久化
  • 开发过程中的问题
    • ITP 对用户登录状态的影响
    • 媒体文件播放相关的权衡之计
    • SafariUI 问题
    • 浏览器兼容
  • 挑战
    • Lighthouse 评分
    • 节省流量
      • M@STER API
      • gzip 的顺序
      • webp 的使用
    • 增强安全性
      • URL 难读化
      • HTTP Response 加密
  • 彩蛋

前言

本文分析的是《モバイルブラウザ上で実現させた「アイドルマスター シャイニーカラーズ」の作り方》,该演讲发布于 CEDEC 2018,从时间上来看是 SC 刚刚发布不久的时候。

下面提供一些链接:

技术选型

游戏引擎(ゲームエンジン)

游戏引擎方面,SC 采用的是 enza 的自研(?)引擎 enza-game.js。这是一款专门为 WebGL 和手机浏览器特化的游戏引擎,使用了 PIXI.js 进行绘制。

音频(サウンド)

最后 enza 选用的还是浏览器标准的 WebAudio

动画(アニメーション)

动画使用的是 Spine,使用的理由有三点,看看就行(

特效(エフェクト)

因为种种原因,某个我也不知道是什么的特效工具最后还是没用。最后使用的是 pixi-particles

最后变成了这个样子:

资源持久化

直接把 max-age 弄长了,真有你的啊,enza

开发过程中的问题

总共是有这四个问题:

ITP 对用户登录状态的影响

简单来说,ITP 就是限制 Cookie 长期驻留的手段,而由于 enza 允许非注册用户游玩,因此 Cookie 可能会被浏览器干掉,导致用户丢档。

因此,enza 采取的策略是:保证注册用户的进度不会丢失,最大程度上保证非注册用户的进度不会丢失。这不是废话吗

媒体文件播放相关的权衡之计

由于浏览器的媒体播放需要用户操作(通常是点击/触摸)之后才能进行(注:这个是很常见的浏览器限制了,包括主站BGM 播放时不时会出问题也是因为这个但我懒得修了),因此游戏也必须对此作出兼容。

以音频为例:

当且仅当在第一次触摸时,需要构建 Context。这里以 Chrome 为例举了个例子,看看就行(

以视频为例:

而正是由于这一点的影响,因此抽卡过程中的演出进行也需要用户的触摸才能正常继续了。

SafariUI 问题

Safari 显示地址栏的时候,下面的游戏界面就会变小,而且还会出现 scrollbar,总之是这样的问题(

解决方案是没有解决方案,但针对变小的游戏界面进行了一定的缩放。

你引导用户添加到桌面就行了啊 kora!

浏览器兼容

总之是各种各样的浏览器兼容问题,这里就不列举了,简单看看 PPT 就行(

挑战

Lighthouse 评分

为了改善评分,enza 做了这两项优化:

  1. 缩减字体
  2. 将一部分 asm.js 转化为 WASM

于是从 12 分提升到了 64 分可喜可贺

当时也提到了 ServiceWorkerCache API,可惜现在还没怎么用上……不愧是日企吗

节省流量

为了节省流量,使用了这三种方法:

M@STER API

您配吗,您的内容配这个名字吗

所谓 Master API,就是在不必要的时候不请求不必要的资源,在服务器侧尽可能减少不必要的内容传输,以及对 GET 请求进行缓存的系统。

您配吗,您的内容配这个名字吗

gzip 的顺序

这就是现在用的系统了,对文本内容进行 gzip 压缩以减少体积,这里的顺序指的是先压缩还是先加密的顺序。具体选用的是哪个顺序我这里留个悬念,PPT 里其实说的很明白了(笑)

webp 的使用

这个应该很清楚了吧,我就不多说了。

增强安全性

URL 难读化

如你所见,这就是现在 URL 的样子(

HTTP Response 加密

总之用的还是 asm.js,当然了,现在也有 WASM 的版本了。

彩蛋

这个说是彩蛋其实也不算,是给逆向过的人的一个惊喜吧:

具体这张图到底是什么作用,看过之前逆向 WASM 的读者应该已经能明白了(笑)