最近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要从第一天开始计划的更多相关文章

  1. 学习之学习--混沌大学商学院--第一课--HHR计划

    <学习之学习> 第一课:混沌初开 李善友 1,课程目标:建立个人的多元思维模型,帮助企业找到创新驱动的增长战略. 2,创新:第二曲线创新,创新理论之父熊彼特. 3,核心课:第二曲线,非连续 ...

  2. Qt 学习第一步 做计划和确定目标

    接下来開始一步步深入学习Qt. 学习的第一步是整理资料,也就是找书和sample. 逛了一些论坛,推荐以下3本书 1> C++ GUI programming with Qt 4(2nd Edi ...

  3. 《创业者技能树》--创业课--14天复盘第一课candy2--HHR计划

    1,厉害的人是如何分析问题的?

  4. 谈一谈SQL Server中的执行计划缓存(上)

    简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询 ...

  5. linux系统的任务计划crontab使用详解

    linux系统的任务计划crontab使用详解 其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助linux的cron功能了. 关于cron任务计划 ...

  6. Oracle 11g 执行计划管理1

    1. 执行计划管理的工作原理 1.1控制执行计划的稳定性 11g之前,可以使用存储大纲(stored outline)和SQL Profile来固定某条SQL语句的执行计划,防止由于执行计划发生变化而 ...

  7. sql2008 计划自动创建数据库分区【转】

    本文转自:http://jingyan.baidu.com/article/6b97984d9a26ec1ca3b0bf77.html sql2008 计划自动创建数据库分区 固定增量的数据,自动创建 ...

  8. SpirngMVC入门第一天

                                         SpringMVC第一天 1.   计划 第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a ...

  9. Linux计划任务及压缩归档(week2_day1)--技术流ken

    计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...

随机推荐

  1. Install Atom editor in ubuntu 14.04

    Step 1: Add repository sudo add-apt-repository ppa:webupd8team/atom Step 2: Update the repository su ...

  2. 忠告初学者学习Linux系统的8点建议

    导读 新手或者说即将要入坑的小伙伴们,常常在QQ群或者在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的.例如:如何给添加的用户归属用户组,复制整个文件到另一个目录下面,磁盘合理划分,甚至 ...

  3. .NET截取指定长度汉字超出部分以"..."代替

    /// <summary> /// 将指定字符串按指定长度进行剪切, /// </summary> /// <param name= "oldStr " ...

  4. algorithm -- 插入排序

    插入排序是<算法导论>中第一个介绍的算法,详细分析了插入排序的原理,执行过程,证明了算法的正确性.同时也引出了算法分析和算法分析常用的方法. 此文对原文作个转述,检验学到的知识. 文中使用 ...

  5. thunkify 模块

    function thunkify(fn){ assert('function' == typeof fn, 'function required'); return function(){ var ...

  6. NPOI 导出Excel2007版本时出现流已关闭问题

    NPOI生产.xlsx文件件时,在使用book.Write(ms);后,会关闭流,这样导致再次使用Respons输出流的时候就出错了. 我看到一些网友提供的解决办法是: public class NP ...

  7. Codeforces Round #383 (Div. 2) 解题报告

    本来是打算所有半夜进行的CF都不参加的,但看到这次比赛22:35就开始,还是没有忍住orz--晚上总是不够清醒,做题思维不如白天活跃,低级错误常常出现.出的比较早的C因为一个书写错误有点小bug,在比 ...

  8. iOS UISearchBar 设置取消按钮,回收键盘,并修改cancel为“取消”

    继承协议: UISearchBarDelegate 在代理方法中设置: #pragma mark --- 搜索框开始编辑 --- - (void)searchBarTextDidBeginEditin ...

  9. DevExpress VGridControl 行宽自动调整

    1. 让列的宽度自动填充 如果VGridControl的LayoutStyle属性为BandsView或SingleRecordView,那么把VGridControl的OptionsView.Aut ...

  10. C++ 基础算法之二分查找

    前提: 有序数组! int binary_search(int* a, int len, int goal) { ; ; while(low <= high) { ; if(a[middle] ...