Yoshino:轻量级的 Minecraft 皮肤站

Author Avatar
黎明余光 2月10日
  • 在其它设备中阅读本文章

自己挖的坑说什么都要填完系列

回顾

大概在 2017.8.7,我发布了 辣鸡的 dawn-skin-server,由于代码烂到我都不想看的级别,所以成功地在一个月内弃坑,目前它已作为黑历史封存(

开坑

我花了一周时间,使用 XPHP 1.0.6 将所有代码以及前端重写了一遍,并更名为 Yoshino,性能以及易用性都有了相当大的提升
你问我为什么用这个 框架Framework?因为我至少是个挂名开发者啊(

Features (bugs)

更棒的 AJAX

依靠现学一点辣鸡 JavaScript 和 MDU.JQ 的文档把大部分操作使用 AJAX 实现了,所以现在有一堆 bug 和极不优雅的代码

将皮肤存储至数据库

这是个脑洞,方便没有写入权限的 WebHosting 之类的,原理就是简单地将皮肤 base64 后扔进数据库,调用时解码一下

优化的材质哈希算法

本来是打算照着 authlib-injector 的标准写的,结果发现 智商太低 看不懂这文档,然后就瞎鸡儿实现了一个算法

创建一个字符串,写入材质的宽和高,然后逐列遍历像素的 RGB 值,追加到字符串后面,返回字符串的 SHA-256
PHP 实现示例

function skinHash($tmp_name) {
    $skin = ImageCreateFromPng($tmp_name);
    list($width, $height) = getimagesize($tmp_name);
    $string = "";
    $string .= $width . $height;
    for ($w = 0; $w < $width; $w++) {
        for ($h = 0; $h < $height; $h++) {
        $rgb = ImageColorAt($skin, $w, $h);
        $i["r"] = ($rgb >> 16) & 0xFF;
        $i["g"] = ($rgb >> 8) & 0xFF;
        $i["b"] = $rgb & 0xFF;
        $string .= $i["r"] . $i["g"] . $i["b"];
        }
    }
    return hash("sha256", $string);
}

大幅改进的性能

测试于腾讯云广州四区 1C1G 小鸡,服务器环境:

  • CentOS 7.4
  • PHP 7.1.9 + MySQL 5.5
  • 开启 Opcache

Loader.io 压测 150 并发的情况下 CPU 占用不到 70%,(相较于 Blessing Skin Server)可以说是相当高性能了(逃

最后

DEMO:https://skin.lim-light.com
你猜猜这坑多久能填完?
(头图从 Wallper Engine 找的,侵删)

本文链接:https://blog.lim-light.com/archives/yoshino-minecraft-skin-server.html
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可