桌宠素材外置实践:用 OBS + CDN 托管 31 张透明 PNG

举报
yd_285894438 发表于 2026/10/24 16:29:51 2026/10/24
【摘要】 把 31 张 768×832 的透明 PNG 打进 APK,包体直接涨到 16 MB,换一张立绘还得重新发版。这篇记录一次把桌宠素材搬到华为云 OBS、前面挂 CDN 的改造过程:目录怎么切、缓存头怎么设、客户端怎么按需拉取并做完整性校验。

一、为什么要外置

桌宠的立绘是整帧 PNG,单张 200~600 KB,31 张加上动画帧很容易把安装包推到 16 MB 以上。更麻烦的是素材迭代:换一套表情就要重新打包、签名、发版,用户还得再下一次整包。把素材放到对象存储、客户端按需下载,包体可以压到 3 MB 左右,换图只改远端目录。

二、桶与目录规划

不要把所有图平铺在一个目录里。按版本切前缀,客户端只认一个 manifest,回滚时把 manifest 指回旧版本即可:

pet-assets/
  manifest.json
  v3/frame-neutral.png
  v3/frame-blink.png
  v3/frame-sleep.png

manifest 里记录版本号、每张图的 SHA-256 和文件大小,客户端先拉它,再决定哪些帧需要更新。

三、上传脚本

用 OBS 的 Python SDK 并发上传,同时把 Content-Type 和 Cache-Control 写对。这两项如果交给控制台默认值,CDN 边缘经常缓存不住:

import os
from obs import ObsClient

client = ObsClient(
    access_key_id=AK,
    secret_access_key=SK,
    server="https://obs.cn-north-4.myhuaweicloud.com",
)

for name in os.listdir("frames"):
    path = os.path.join("frames", name)
    client.putFile(
        "pet-assets",
        f"v3/{name}",
        path,
        headers={
            "Content-Type": "image/png",
            "Cache-Control": "public, max-age=31536000, immutable",
        },
    )

四、缓存策略

版本化路径天然适合长缓存:v3/ 下面的文件内容不会变,直接给一年 immutable;manifest.json 相反,必须 no-cache,否则客户端永远看不到新版本。CDN 侧只对 /v*/* 做缓存,manifest 回源。

五、客户端按需加载

Android 侧用 OkHttp 拉取,落盘前校验哈希,避免半截文件导致花屏:

val manifest = api.get("$base/manifest.json")
val file = File(cacheDir, "frame-$name.png")
if (!file.exists() || sha256(file) != manifest.hashes[name]) {
    val body = okhttp.newCall(
        Request.Builder().url("$base/${manifest.version}/frame-$name.png").build()
    ).execute().body!!
    body.byteStream().use { input ->
        file.outputStream().use { out -> input.copyTo(out) }
    }
}

首次启动只下待机、眨眼、点击三帧,其余在空闲时预取;弱网下先用包内自带的兜底图,不要让桌宠开天窗。

六、成本与踩坑

透明 PNG 不要用有损量化压,alpha 边缘会出现灰边,改用 oxipng 做无损压缩,通常还能再小 15%。CDN 回源带宽按量计费,发布前先预热 v3/ 目录;另外记得给桶配防盗链或签名 URL,素材虽然不敏感,但被别的站直接引用会白烧流量。

七、小结

外置素材带来的收益不只是包体:素材热更新、A/B 两套立绘、按设备分辨率下发不同尺寸都变得简单。代价是要多维护一份 manifest 和一套校验逻辑,但对桌宠这种高频迭代的产品,这笔账是划算的。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。