最初做《金X》使用silverlight是因为看了深蓝色的右手的silverlight游戏开发教程,这里赞一下,教程写的非常好!做游戏的基础思想均涵盖了,能够给游戏开发的新手提供很多思维方式上的引导。
但是在我个人开发、发布金X的过程中,陆续发现有一些silverlight的大坑,这里给大家分享一下,防止大家犯重复错误。
1、DateTime数据结构的处理
在游戏中,如果想使用DateTime数据结果来存时间的话,一定要慎用DateTime.ToString和DateTime.Parse方法。在不同的windows机器下,很可能出来的结果不是预想的那样。原因是每台windows的机器的时间格式是可以配置的,那么ToString和Parse方法默认使用的时间格式是与操作系统设置相关的。而有一些恶心的所谓操作系统优化程序,把操作系统时间格式从标准的yyyy-mm-dd hh:MM:ss改为了如“星期X”这样。
导致的问题就是,调用DateTime.ToString()后,转出来会把年月日时分秒信息全部丢掉,而只剩下“星期X”的数据,之后再调用Parse这个字符串的时候就完蛋了。导致的客户端现象就是直接白屏,整个silverlight应用程序崩掉。
所以在使用 DateTime的时候,务必需要指定时间格式。使用DateTime.ToString("{时间格式}") 和DateTime.ParseExact方法。
2、Button等控件的IsTabStop属性
如果在游戏中使用各种silverlight原生控件,然后有一堆界面使用Visibility来实现隐藏和展示的话。建议将所有控件默认的IsTabStop属性给干掉,否则会出现的问题是,一个界面隐藏掉了,玩家按空格或者回车等键的时候,会触发Button的Click事件或者其他控件的各种响应事件,出现不必要的逻辑。
3、字体、字体库
不要以为使用默认字体就会万事大吉。
silverlight的默认字体会使用Lucida Sans Unicode,而在很多盗版或者阉割下的windows下,这个字库都被删了,导致的问题是直接白屏,应用程序崩溃。目前我的应用程序使用的默认字体是SimHei,会稍微少见缺字库的问题。如果应用程序包的大小不敏感,还是可以默认把字库带到XAP包里。
4、关于Dispatcher.BeginInvoke
新手会用上瘾,原因是可以解决非UI线程操作UI的问题。所以新手会不管三七二十一,所有地方需要涉及操控UI控件的的都用。
实际上需要理解一下这个函数的原理,实际上我对它的理解就是把一段代码托管到下一帧渲染的回调来运行,所以这里会有一帧的延迟。那么在你的游戏逻辑里,可能导致的现象会是屏幕闪烁,或者会导致游戏逻辑不必要的错误。
比如你写物品栏的逻辑,当用户点击一个物品时,隐藏物品栏并且使用该物品。如果你把隐藏物品栏的逻辑放到BeginInvoke里,那么可能导致的错误是用户在这一帧结束前疯狂点击这个物品,那么会触发许多次使用物品……诸如此类错误,均需要注意。
你应该只在非UI线程操作UI的时候使用这个函数,切忌乱用。
5、代码安全
不做任何安全的XAP包是完全裸体呈现给玩家的,出于安全考虑,你需要做代码混淆。
目前算好用的一个工具是 SmartAssembly(出Reflector的公司出的),但是它可能会有致命问题:加密后的XAP包在某些windows机器下会访问出错!客户端看到的现象是莫名其妙的说SmartAssembly加密过期了。(也可能是我用的破解版,但是付费的话,实在不是有特别好的渠道啊,而且好像也不便宜。)
6、资源文件安全
不要以为将资源文件封装到dll里(Resource方式)就安全了,用Reflector照样一览无余。需要你自己写加密!
7、存档文件安全
在IsolatedStorage中,不管是自己创建的文件还是ApplicationSettings,都是不加密的。被篡改的风险很大,你需要自己做验证机制。
而且现在给silverlight用户最大的困扰是,360等清理缓存默认是将silverlight应用程序空间给勾上的,而现在大部分的用户都喜欢直接点默认清理缓存,会导致将你的IstolatedStorage下的东东全部清理,你需要务必给你的用户说明白这点,让他们将360里的设置勾给去掉。
silverlight开发游戏中的大坑,布布扣,bubuko.com