Localization要从第一天开始计划
最近E3,微软说可以在任何region玩任何语言的游戏了。换一个语言么,听起来没有那么复杂,其实操作起来还得是从软件工程初期就好好计划。
Windows在很长一段时间,你安装完了,就不能换语言了。大学的时候用Ubuntu觉得,能随时切换语言真方便,后来Mac也是。
最近遇上了一个问题,就某知名游戏因为有多种版本的英文支持,比如英国英语和美国英语,有些用户用美国英语的手机,想要玩英国英语的内容。本来没啥大不了,但是估计涉及到一些文化版权习惯的东西,IP拥有方非常执着地要增加游戏中更换语言的功能。
本来吧,游戏的开发,语言是独立于系统语言的。可是到了App时代,大家会假设很多东西,比如利用系统的语言作为游戏语言。这对于日语、韩语、德语国家可能不是个问题。但是法语分法国法语和加拿大法语,葡萄牙语也分葡萄牙葡萄牙和巴西葡萄牙,西班牙语就更种了。而且随着时代的发展,人们在全球旅游工作学习生活,完全有可能我用英文的系统,但我玩三国志这种用中文吧。所以必须要地区和语言分开才是好的解决方案。
Strings和Assets都是在load的时候根据语言选项选去的文件,其实我们就set一个状态字,然后安全的重启就行。对于windows上的应用似乎不难,可是苹果不让这么做,你app的life cycle都已经在app delegate里面定好了。
按理说,大家可以把所有的游戏update单独拿出来,做一套lifecycle,再做一个state machine转换。
不过这个游戏由于时间久远,加上来来回回添加了很多分析和追踪用户行为的组建,把整个app delegate的结构已经变得非常nasty。如果我重启了主进程,没有办法安全的重置这些store啊,tracking啊的状态字,他们在其它线程跑着。
试图删除root view然后重新建立,就发现很多游戏写的时候内存管理并特别理想。导致很多东西该handle该free的没弄干净,重建了之后指针就乱了。
这就是App时代的软件危机,首先你受制于人家定好的起承转合,只是在填满每一个框架函数里的内容。当然不管怎么样的结构,要做高质量代码,还都是得独立于app life cycle的自己的gameplay life cycle。再加上,苹果iterate的速度比所有开发者都快,今年是iOS 10,你什么都不做都会有很多classes broke。你再好的设计模式,发现接口和底层的类一直在变,也是让人抓狂。不过好的游戏,比如某赛车游戏,从PC平台移植而来,C++的部分很solid,图形引擎数学会自动scale。而对于现代游戏,有非常多的tracking,MTX store,note/alert,网络传输,UI,这些都是在每一版iOS都在变,维护起来不可能轻松。什么东西和人类end user打交道,就没法确定恒久的解决方案,这些地方就得一年一年改。
Anyway,写好代码,做好设计,考虑语言支持,得从一开始就计划!
Localization要从第一天开始计划的更多相关文章
- 学习之学习--混沌大学商学院--第一课--HHR计划
<学习之学习> 第一课:混沌初开 李善友 1,课程目标:建立个人的多元思维模型,帮助企业找到创新驱动的增长战略. 2,创新:第二曲线创新,创新理论之父熊彼特. 3,核心课:第二曲线,非连续 ...
- Qt 学习第一步 做计划和确定目标
接下来開始一步步深入学习Qt. 学习的第一步是整理资料,也就是找书和sample. 逛了一些论坛,推荐以下3本书 1> C++ GUI programming with Qt 4(2nd Edi ...
- 《创业者技能树》--创业课--14天复盘第一课candy2--HHR计划
1,厉害的人是如何分析问题的?
- 谈一谈SQL Server中的执行计划缓存(上)
简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...
- linux系统的任务计划crontab使用详解
linux系统的任务计划crontab使用详解 其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助linux的cron功能了. 关于cron任务计划 ...
- Oracle 11g 执行计划管理1
1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...
- sql2008 计划自动创建数据库分区【转】
本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...
- SpirngMVC入门第一天
SpringMVC第一天 1. 计划 第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a ...
- Linux计划任务及压缩归档(week2_day1)--技术流ken
计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...
随机推荐
- JQUERY MOBILE 中文API站 和 官方论坛
中文API站:http://www.jqmapi.com/api1.2/preview/quickstartquide.html 官方论坛:http://bbs.phonegapcn.com/foru ...
- [高斯消元] POJ 2345 Central heating
Central heating Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 614 Accepted: 286 Des ...
- Selenium的延迟等待
http://my.oschina.net/u/928852/blog/98885 Selenium的延迟等待分为 显式等待(Explicit Wait) & 隐式等待(Implicit Wa ...
- 开启Win7系统管理员Administrator账户
Win7系统凭借酷炫的界面以及简单.易用.快速.安全等特点,迅速成为全球最受用户喜爱的操作系统,如今Win7已经成为身边很多朋友生活学习工作的好伙伴.在我们使用Win7的时候,有一些软件的正常运行需要 ...
- .net版高斯模糊算法
最近挺多人找高斯算法,本人贴上一个高斯模糊算法类,希望可以帮助到大家.算法的效率还是可以接受的. #region 高斯模糊算法 /// <summary> /// 高斯模糊算法 /// & ...
- 例子:Background Transfer Service Sample
本例演示了如何使用后台传输服务来进行后台文件下载,也就是说及时App已经停止运行,同样可以通过后台代理进行文件的下载操作. 对于后台文件传输一下知识点必须注意: 1. 通过使用 BackgroundT ...
- jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常
jpa遇到的 org.hibernate.PersistentObjectException: detached entity passed to persist异常 发生这个原因是因为我们已经在实体 ...
- javascript学习之【new操作符】
首先请大家思考这么一段代码,如下: <script>var jquery=function(){ console.log(this);};jquery();new jquery() ...
- DataTable的子查询--DataTable.Select()
由于需要,在sql查询获得结果集之后,又需要对该结果再进行筛选一次,若重新从sql中查询会浪费资源,因此特地去查阅了一些资料,学会了用DataTable进行子查询. 在.Net Framework 2 ...
- Spring事务配置的五种方式(转载)
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分. DataSo ...