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
计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...
随机推荐
- Angular js 之动态传数据到下一个页面和动态通过ng-click进入不同的页面
+关于Angular js中一些千篇一律的后台获取数据 首先在services.js里面把服务写好 然后在controller里面把数据给打印出来 (首先需要把数据注入) +关于Angular js中 ...
- Poj1743 (后缀数组)
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using ...
- Repository - Service
- Bootstrap<基础三> 排版
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...
- GDAL C# 开发出现的异常
在使用开发C#下的GDAL时,编译时正确. 在执行 Gdal.AllRegister(); 出现异常:OSGeo.GDAL.GdalPINVOKE”的类型初始值设定项引发异常. 解决方案: 编译正常, ...
- 场景7 Data Guard
场景7 Data Guard 官方文档 :Oracle Data Guard Concepts and Administration 用于数据容灾,通过主备库同步(主库将redo日志传送到备库,一个 ...
- is a 、like a、has a
has a 代表的是对象和它的成员的从属关系.可以分为组合与聚合两种. 组合:表示两个对象是整体与部分的关系为强关系 聚合:表示两个对象是整体与部分的关系为弱关系 is a 它是类继承关系,只是覆盖了 ...
- my vim
set nu set cindent set smartindent set cursorline set showcmd set completeopt=preview,menu set autow ...
- 【转】输入/输出流 - 深入理解Java中的流 (Stream)
基于流的数据读写,太抽象了,什么叫基于流,什么是流?Hadoop是Java语言写的,所以想理解好Hadoop的Streaming Data Access,还得从Java流机制入手.流机制也是JAVA及 ...
- 关于升级xcode8
升级xcode8已是必然,升级ios10的用户不能说大有人在,应该也不会少,如果不升级xcode8,上架最新的包,那么可能应用在ios10 上是不支持的.so,这些xcode8的新特性,你应该了解!! ...