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
计划任务介绍 我们可以通过一些设置.来让电脑定时提醒我们该做什么事了.或者我们提前设置好,告诉电脑你几点做什么几点做什么,这种我们就叫它定时任务.而遇到一些需要执行的事情或任务.我们也可以通过命令来告 ...
随机推荐
- bzoj 3504: [Cqoi2014]危桥
#include<cstdio> #include<iostream> #include<cstring> #define M 100009 #define inf ...
- 中国B2B行业将进入后平台时代
中国的B2B正在进入后平台时代,我们用三个特征来诠释这个词:1.电商平台构建流程闭环服务,从电商平台向综合服务商转变:2.新流量批发策略的落地代表B2B找到了新入口:3.第三方服务的价值变现与第二波创 ...
- android 打包失败
如果在打包时提示: proguard returned with error code 1 并且在控制台中输出:'java'不是内部或外部程序或批处理文件 那么就说明你的环境变量出问题了,之前用的 ...
- WebStorm常用配置
设置 快捷键设置 可以采用多种风格,这里采用Visual Studio风格,便于习惯使用其它IDE的用户迁移. JavaScript版本设置 JavaScript的主流版本已升至ESMAScript6 ...
- Asp.net MVC 数据注解与验证
数据注解特性定义在名称空间System.ComponentModel.DataAnnotations中(有些特性定义在其他名称空间中),它们提供了服务器端验证的功能,当在模型的属性上使用这些特性时,框 ...
- Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. RANK ( ) OVER ( [query_partition_clause] order_by_clause )D ...
- 例子:Bluetooth app to device sample
本例子演示了: 判断蓝牙是否打开,是通过一个HRsult值为0x8007048F的异常来判断的 catch (Exception ex) { if ((uint)ex.HResult == 0x800 ...
- LRU Cache实现
最近在看Leveldb源码,里面用到LRU(Least Recently Used)缓存,所以自己动手来实现一下.LRU Cache通常实现方式为Hash Map + Double Linked Li ...
- 安全协议系列(五)---- IKE 与 IPSec(上)
IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全.自上个世纪末面世以来,关于这两个协议的研究.应用,已经非常成熟.协议本身,也在不断地进化.仅以 IKE 为例,其对应的 RFC 编 ...
- 自动生成数据库字典(sql2008)
每次做项目的时候都要做数据字典,这种重复的工作实在很是痛苦,于是广找资料,终于完成了自动生成数据库字典的工作,废话少说,上代码. 存储过程: SET ANSI_NULLS ON GO SET QUOT ...