阅读视图

发现新文章,点击刷新页面。

光图片就300多M,微信小游戏给再大的分包也难啊!

点击上方亿元程序员+关注和★星标

引言

哈喽大家好,有小伙伴说他们公司的游戏项目,光图片资源就高达300M,最近正在考虑上架微信小游戏。

但是,如此庞大的游戏资源,想通过分包的形式肯定是不行的,只能放到服务器上,通过CDN让玩家下载。

笔者还是很好奇,什么样的资源如此巨大,通过对小伙伴的深入了解

惊讶发现,他们的图片资源居然没有压缩!且不说图片是否过于精致、美术手笔是否过于奔放,不压缩实在是太难受了!

言归正传,本期将带小伙伴们一起来看下,在Cocos游戏开发中,如何省心省力地压缩图片,330M能压缩到多少。

本文源工程可在文末获取,小伙伴们自行前往。

图片压缩

图片压缩是一种在尽可能保持图片质量的前提下,减小PNG文件大小的技术。

游戏开发中常用的图片压缩工具有TinyPNGpngquantCompressor.io等等。

pngquant是一款用于PNG图像有损压缩的命令行工具和函数库。

该转换工具能显著减小文件大小(通常高达70%),同时保持完整的Alpha通道透明度。生成的图像兼容所有主流网页浏览器和操作系统。

常用的参数包括:

  • quality min-max:质量,使用满足或超过“最大质量”所需的最少颜色数量。若转换后的质量低于“最低质量”要求,图像将不会被保存。
  • speed N:速度,从1(暴力)到10(最快)。默认为3。速度10的质量降低5%,但比默认速度快8倍。

图片压缩实例

下面一起来看下,在Cocos游戏开发中,如何通过插件集成到项目,使其构建后自动压缩图片。

1.资源准备

先准备一张PNG图片,原图大小0.97M,用来确认压缩是否成功,压缩质量如何。

2.创建扩展

新建一个项目,通过菜单扩展->创建扩展打开扩展创建面板。

我们选择构建插件,这是官方自定义构建插件的一个简单示例,点击创建扩展,我们直接在上面扩展我们的自动压缩。

3.启用扩展

通过菜单扩展->扩展管理器打开扩展管理器,在已安装扩展中找到我们新建的插件,将其改成开启状态。

4.扩展界面

首先我们删掉我们不需要的asset-handlers.tspanel.ts·,在builder.ts中只保留hooks配置。

接下来我们给构建面板加上一组配置,用来控制压缩是否开启、压缩的质量以及压缩的速度:

代码整理如下:

  • 启用复选框(ui-checkbox):默认不开启。
  • 最小质量滑块(ui-slider):0-100,默认65,步进1
  • 最大质量滑块(ui-slider):0-100,默认80,步进1
  • 速度滑块(ui-slider):1-10,默认3,步进1
  • 校验最大质量>=最小质量:

最后通过npm installnpm run build编译即可。

打开构建面板就可以看到我们添加的内容:

5.构建后压缩

界面控制添加完之后,我们需要把pngquant压缩植入到构建完成的钩子(onAfterBuild)里,使其构建完成后自动按照配置的参数进行压缩。

代码整理如下:

  • 检查是否启用了质量控制:
  • 提前准备好压缩的工具,这里包括winmac的,并且根据系统选择:
  • 在构建后目录递归查找所有图片文件:
  • 组装命令开始逐个压缩

6.测试

编译代码后,打开我们的构建面板,开始进行构建,构建完成后可以点开日志查看:

从日志可以看出原文件大小: 1002.9KB, 压缩后大小: 179.6KB, 压缩了82.1%,提示压缩成功。

打开构建好的目录,找到我们的资源,可以看到已经压缩完成:

图片压缩进阶

1.过滤

通常游戏中会有一些图片为了避免模糊,例如主界面,会通过配置的或者特殊文件名开头的形式进行过滤,不进行压缩,小伙伴们在面板或者文件配置,然后压缩前过滤即可。

2.记录

图片比较多,每次构建耗时比较长的话,可以把压缩提前到构建之前,并通过MD5记录表示图片已经压缩,直接跳过该文件,避免重复压缩。

结语

通过压缩,小伙伴的图片资源从330M降到了273M,压缩了18%。感觉剩余资源还是比较大,建议从其他方式进行检查和处理,例如查找没依赖的资源删除找美术重造等等。

不知道小伙伴们有没有其他更好的办法呢?

本文源工程可通过私信发送 PngExtension 获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个爱心!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方灰色按钮+关注。

你的游戏没有这个怎么能够顺利出海?

点击上方亿元程序员+关注和★星标

引言

哈喽大家好,不知道小伙伴们最近有没有发现,如今的游戏出海,已经不是从前的粗放买量靠堆砌素材喂算法了,现在都在拼长线运营或者AI了。

其中Supercell的《荒野乱斗》就是最好的例子,上线五年了,如今成功逆袭。

笔者想起,八年前就已经参与过游戏的多语言版本了,那时候的主流是港台(繁体)、东南亚(英文)、韩国(韩文)。

除去接入对应的SDK外,最为深刻的就是翻译和本地化,那时候不需要很高端的操作,就是把游戏内所有的中文整理出来,给到专门负责翻译的人,完成后导回到游戏即可。

其中最头疼的就是英文,两个字能变10多个字母,很容易导致超框,以上的处理有个“国际化”的简称,叫i18n

言归正传,今天我们就来聊聊i18n

什么是i18n?

先简单科普一下

i18n是国际化的简称,来源是英文单词internationalization的首末字符in18为单词中间的字符数。

在资讯领域,国际化(i18n)可以让产品无需做大的改变,就能够满足不同语言和地区的需要。

i18n的优势是什么?

对程序来说,在不修改内部代码的情况下,就能根据不同语言及地区切换相应的语言界面。

正如笔者引言所说,把文本交给翻译人员,回来后原路返回即可。

最开始就制定严格的规范,所有的文本都需要通过i18n,这样能够减少后期提取文本和导回文本的麻烦操作。

一起来看个例子

既然i18n如此重要,那么我们一起来看看它在Cocos游戏开发中如何使用。

1.安装插件

首先Store找到i18n多语言化插件,选择添加到项目即可。

添加完成之后,就可以在资源管理器看到插件对应的脚本,分别对应数据、Label管理和Sprite管理。

2.添加语言

首先通过菜单扩展->I18n Setting打开本地化控制面板。

简单添加8个语言,从下到上分别为中文、俄语、韩语、日语、法语、西班牙语、英语和德语(首字母排序)。

为什么8个?因为可以和别人说你“精通”八国语言(你好,世界)。

编辑完成后,插件会自动在resources\i18n目录生成对应的Ts配置文件。

3.编辑中文

zh.ts中添加你好,世界,作为示例。

4.翻译其他7种语言

完成的所有中文内容,交给专业的翻译人员进行翻译,获得其余7种语言,我们这里简单示例就找搭子就行。

还是非常靠谱的。

5.LocalizedLabel组件

插件生成的LocalizedLabel组件,就是对Label的简单封装,根据key和语言配置获取对应的文本。

直接挂到Label组件上,配置对应的文本的key即可。

6.效果演示

我们通过点击本地化编辑面板中不同语言的“小眼睛”,即可完成语言的切换,并且看到切换语言后的效果。

上面只是编辑器演示,实际需要修改默认语言,可以在脚本中修改。

7.进阶

如果一个包体内有多种语言,想要支持动态切换语言,可以通过import * as i18n from 'db://i18n/LanguageData';导入i18n,并通过i18n.init('en');进行语言切换,最后通过i18n.updateSceneRenderers();刷新即可。

此外LocalizedSprite组件也是同理,对Sprite的简单封装。

结语

当然了,并非所有的项目都需要使用这套插件,国际化的逻辑还是简单的,一般公司项目都有自己的技术积累,有自己的实现。

其实最主要是一个规范的问题,通过语言包的限制,避免文本到处都是。但是也使得配置表比较难以配置,这个需要小伙伴们自己权衡了。

你们使用的是什么方案?

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个爱心!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方灰色按钮+关注。

你支持游戏内显示电量、信号或时间吗?

点击上方亿元程序员+关注和★星标

素材源于网络

引言

哈喽大家好,周末的时候,我看到了一个非常有趣的话题,就是我们的游戏里面,应该/不应该显示电量、信号或时间?

不知道大家在玩王者荣耀的时候有没有这样类似的经历:当你打得正起劲的时候,勇冠三军,即将超神,突然间被一个弹框秒了。

素材源于网络

没错,这个弹框就是天下苦iOS久矣的电池电量不足弹框。

还剩10%的电量

这个和显不显示电量有什么关系,难道王者荣耀没有显示电量吗?--的确没什么关系,只是吐槽一下这个电量不足的弹框。

硬要说有关系的话,那就是电量没有显示数值,没办法提前预防弹框。

言归正传,今天一起来聊一聊游戏内应该/不应该显示电量、信号或时间?

本文源工程可在文末获取,小伙伴们自行前往。

沉浸式的体验

首先,我们来看看反对方(游戏内不应该显示电量、信号或时间)的观点:

1.游戏的核心价值在于提供沉浸式的体验

经常做游戏的小伙伴都知道,我们做游戏的目的,很多时候就是为了让玩家能够“沉迷”进去游戏,产生共鸣。

可以理解,玩家们为了得到放松,会暂时逃离现实世界,进入到游戏世界中,上演一个不一样的自己。

但是,游戏内的电量、信号或时间,这些现实中的元素就会不断提醒玩家还在现实,没办法沉浸式代入游戏。

2.时间焦虑、电量焦虑

图片由AI生成

往往游戏内不显示时间、电池的目的为了避免玩家不必要心理干扰和焦虑。

时间的显示,会让人产生“我玩了多久了?”的焦虑;电量的显示则会引发“我还能玩多久?”的担忧。

这些与游戏没太大关联的焦虑和担忧,很容易让玩家分心,送人头。

游戏应该是放松和享受的,而不是另一个焦虑的来源。

3.多此一举

如果玩家实在是想看看电池电量、当前时间或者网络信号,顶部轻轻下滑就能看到,何必多此一举的优化呢?

笔者的想法

我觉得游戏内显示电量、信号或时间挺好的:

1.提醒玩家

游戏内显示时间,目的就是为了方便提醒玩家。例如活动的开始和结束时间,某个Boss刷新的时间,或者副本的剩余时间,这些都是比较有效和玩家乐意收到的提醒。

2.转移压力

网络信号信息,当玩家,网络状态见红,或者高延迟时,那么玩家能够意识到自己的网络环境可能不太好,假如没有这个显示,那么玩家可能就对游戏开喷了,这是一种常见的转移压力手段。

素材源于网络

3.心理预防

正如开篇的例子,假如游戏内有电池电量预防,那么我会在将要没电的时候去充电,或者避免一些重要的操作,因电量不足造成损失。例如“等等再开团,等我先充个电!

聊着聊着又要上例子了

既然如此,我们在Cocos游戏开发中,如何显示电量、信号和时间信息呢?下面一起来看个例子。

1.相关API

  • 获取网络类型:常用于优化弱网体验以及网络调优,通过接口我们可以判断当前是是否连接wifi,是否是弱网环境。 来源于微信官方文档

  • 获取设备电池信息:常用于获取设备电池信息,通过接口我们可以获取当前电量,是否正在充电,是否处于省电模式。 来源于微信官方文档

2.资源准备

老规矩,先找AI搭子搞几个Wifi4G信号、电池资源。

然后在场景中简单拼接一下。

3.写代码

首先创建一个Main脚本,因为本次演示环境是微信小游戏,所以我们声明一下declare const wx: any; 使用微信的API

定时获取信息。

设置时间。

设置网络状态,由于延迟数据的判断涉及服务端,小伙伴们可以通过心跳包等方式计算,笔者这里不做详细演示。

甚至可以使用Math.random,简单快捷,建议不要学

设置电池信息。

4.效果演示

Wifi:

4G:

正在充电:

不在充电:

结语

看到这里的小伙伴们,你们支持游戏内显示电量、信号或时间吗?

本文源工程可通过私信发送 TopBar 获取。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《打螺丝闯关》《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》《方块掌机经典》大家可以自行点击搜索体验。

实不相瞒,想要个爱心!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

知识付费专栏

你知道和不知道的微信小游戏常用API整理,赶紧收藏用起来~

100个Cocos实例

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

点击下方绿色按钮+关注。

❌