游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游)
游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游)
在我们的游戏开发中,在线升级是必须要解决的需求,你不可能每出一个版本,就让用户去官网下载吧。 特别是资源的更新。
假设我们的游戏由两个东西组成 game.exe res.zip
见名知意,game.exe是游戏主程序,res.zip是资源包
那,我们如何面对更新呢。
首先想到的就是,当我们的game.exe启动后,我们会去下载PATCH服务器取得更新列表,比如game.exe是否有更新,res_patch.zip包大小等信息。
拿到后,我们就进行下载,下载后的文件可以保存到 patches/目录下 (名字自己定) 比如
patches/game_v001.exe
patches/res_v001.zip
有了这个以后,首先,我们要解决的是game.exe自更新问题。由于game.exe在运行过程中,是不能进行自修改的。所以,当我们发现有game_xxx.exe等字样的时候,我们需要唤起另一个进程,这个进程可以是SHELL,也可以是写的一个 _patch.exe什么的东西。 它的作用,就是将game_v001.exe覆盖原来的game.exe,并启动game.exe
大概过程如下
game.exe检查更新
game.exe下载文件
game.exe发现自己有新版本,启动_patch.exe进程,并结束自己
_patch.exe使用game_v001.exe覆盖game.exe,并删掉game_v001.exe
_patch.exe启动game.exe,并结束自己
这样game.exe就完成了。
由于整个过程比较绕,许多游戏都是做了一个launcher.exe来专门负责这个事情。
下面来说说资源的更新
资源的更新也较为简单
直接根据新版本,强制修改res.zip内容就可以了,这个过程由launcher来负责。
上面是一个端游粗略的更新过程……。
同样的方案,我们用到手游上如何呢? 这就要求我们对手游的局限要了解
手机中,安装目录是没有写权限的,不管是IOS还是ANDROID。 其它系统不知道
因此,我们无法做到应用程序代码的自更新,也无法直接修改安装包中的资源
动态库的方案也无法做到代码自更新,因为IOS审核不过。 我们就没有必要为一个游戏搞两套方案了。
因此,如果代码出现了更新,就只能让用户去APPSTORE上重新下载了。
但是,我们依然要面临资源的更新,逻辑的更新问题。 如果小改一个BUG,或者小修一个图片,都要让用户重新下载。 这流失率估计就能上100%了。
面对逻辑更新问题,大部分团队选择了脚本作为纯逻辑开发,普通的C++,JAVA,OC代码,仅是做一些层底支持。这样一来,所有的问题,都折射到了资源更新上。
刚刚说了,我们无法修改安装包中的数据。 那,我们自己新开一个拥有可写权限的目录不就可以了么。
在IOS和ANDROID下面,都可以取得writablePath,或者cachePath来使用。
随之而来的问题,就是资源加载。比如,在安装包中,有一个 res/logo.jpg 现在,我在更新目录下也有res/logo.jpg文件。
如何加载呢。最直接的方法,就是记录一下,哪个资源,在哪个路径下。但这个功能,如果做在上层的话,那每一次取资源,都要用 getRealPath等字样来包装。 如果做到底层去的话,又觉得这个功能确实不太适合放到底层。
像cocos2dx这个引擎,你就得手工修改资源加载处的代码了。
对于这样的方案,我们可以使用引擎中较为常见的一个功能,就是引擎的路径系统。
路径系统允许用户设置多个路径,当加载一个资源时,它会按对应路径逐个匹配,直到找到它为止。 因此,如果你加载 一个图片 1.jpg 如果多个目录下有,且这些目录都被添加到路径系统中了的话,那处于最前面的路径会优先匹配,后面的文件夹永远没有机会被访问到。除非之前的路径被删除……
基于这一特性,我们可以制定出手游上的资源更新方案
在引擎中,我们可以规划两个路径,一个是UPDATE的存放路径,一个是安装目录的路径
每次加载资源,优先搜索UPDATE
像cocos2dx,irrlicht等引擎,都有这样的路径搜索机制,只需添加好就可以了。
至于具体的资源更新,就是下载一个列表,然后根据列表进行文件下载和替换就可以了。
对于手机游戏的资源要不要ZIP,这个根据个人需求。
值得一说的是,目前手机存储卡均采用闪存或者SSD,读写速度比PC硬盘快多了。文件分离,做累加更新,是非常方便的。 当然,如果你坚持使用端游的逐版本更新机制,也是没有任何问题的。
游戏开发:通过路径搜索优先级来进行补丁升级(从端游到手游)相关推荐
- 从萌新玩家到游戏开发,IEG首位女专家的升级之路
我们为什么叫「递归」 "递归" (recursion) 是一种在程序设计语言中被广泛使用的算法.它有两大特点,一是调用自己,二是化繁为简.我们当中那些优秀的技术人又何尝不是如此?他 ...
- 游戏开发之路之“复刻或升级游戏”---地球末日生存
复刻之路-第一周.第二周 〇. 初始游戏计划 1. 人员安排 2. 内容安排 3. 计划安排 初期: 中期: 一. 开发进度 1. 第一周 - 学习背包系统和成就系统原理 - 画万能Sprite 2. ...
- 无敌破坏王2口碑爆棚,从街游到手游你最爱哪款游戏呢?
<无敌破坏王2>11月23日中国首映,时隔6年,拉尔夫带着云妮洛普再次回到观众视野,对于95年历史的迪士尼工作室第一部续集动画电影,带来了新的冲击和感动,看完后我只想说,迪士尼真的从来不会 ...
- 三七互娱 Java游戏开发工程师 面试(两轮技术+HR面)
(2020春招补招,已拿到offer) 抱着投着试试看的心态去的 自己还是不太了解游戏开发 框架啊这些都没怎么问 比较重视基础知识,面的也基本都是基础知识 所以面完才发现自己太基础的知识反而一问三不知 ...
- 【论坛】游戏开发大板上线公告
尊敬的CSDN用户: 根据板块的访问量和用户需求,将[游戏开发]板块从原来小板升级为大板,并将大板调整至[硬件/嵌入式开发]大板下.下面是游戏开发板块导航树. 游戏开发 Cocos2d-x Uni ...
- live2dmesh渲染优先级_Cocos引擎_游戏开发引擎
大家好,引擎组经过了近半年的努力,终于带来了 Cocos Creator 3.0 预览版.Cocos Creator 3.0 集成了原有 2D 和 3D 两套产品的所有功能,带来了诸多重大更新,将做为 ...
- 游戏开发中常用的数据结构和算法
转载Loving_初衷 前言 时间流逝,物是人非,就好像涌动的河流,永无终焉,幼稚的心智将变得高尚,青年的爱慕将变得深刻,清澈之水折射着成长. ----------<塞尔塔传说> PS:为 ...
- 游戏开发中的数据结构
一.游戏程序的灵魂--算法 本系列文章的主题是网络游戏的程序开发,那么,程序是什么呢?一条著名的公式给了我们答案: 程序=数据结构+算法 程序语言(如C++)是一种工具,而算法是程序的灵魂. 数据结构 ...
- Unity3D游戏开发之网络游戏服务器架构设计培训
下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...
最新文章
- 2022-2028年中国轻型输送带行业市场发展规模及市场分析预测报告
- 【Pandas库】(4) 索引操作--重新生成索引
- npm 发布包填坑指南
- C# 制作开机自动启动程序
- python判断sqlite连接状态_python3 自动识别usb连接状态,即对usb重连的判断方法
- gradle工作流程
- 《科学》公布2018十大科学突破技术
- 双向循环链表:鸿蒙轻内核中数据的“驿站”
- ~~二维差分(附模板题)
- 中图分类号,文献标识码,文章编号
- php rrd graph,使用lvs-rrd工具监控存储lvs状态信息
- led大屏按实际尺寸设计画面_新手必知LED显示屏尺寸规格及计算方法
- 开发者百度地图的使用,做一个小demo,ak秘钥,
- SuperSet连接mysql设置
- 十多个巨头App上可跑智能小程序了
- 飞机躲子弹小游戏案例
- 计算机教案三年级冀教版,冀教版小学三年级信息技术教案lbrack;画美丽的早晨rsqb;...
- CTF MISC在我眼里各种奇奇怪怪的题学习思路总结(持续更新)
- Flutter:Dialog弹窗设置点击空白处不关闭弹窗
- 写文本到txt文件的Sub过程
热门文章
- banq修复_banq的U盘如何?相比闪迪还有三星哪个最好?都是USB3.0
- 实现8086汇编编译器(三)——jmp指令的翻译
- 瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置
- python 期货交易接口_量化交易 – 期货CTP接口与程序化(量化交易)的对接 1
- 可引导的MP3(U盘)
- 数据结构单链表实现班级考勤管理系统
- 如何判断集成墙面适不适合家庭装修?
- 小米5_2015201 2015618 2015628_官方线刷包_救砖包_解账户锁
- jetson agx xavier:从亮机到yolov5下tensorrt加速
- ARIMA预测未来的人口数量变化