September 30, 2008

一只n00b的两个月ActionScript开发经验 (3)

续上文
  • 用Flex来做Profiling

    在AS2的时代有一只叫ASProf的插件来分析AS代码的效率...到了AS3时代,Adobe的Flex 自带Profile SWF的工具...而且还是Run-time的哦...(Adobe 官方的介绍 )

    你要做的就是如下几步

    1. 在Flash中的SWF的Publish Setting里把Permit Debugging勾上
    2. Publish一只SWF
    3. 把Flex切换到Profiler模式
    4. 选择Profile External SWF...
    5. 选到那只SWF,然后Run之,你马上就会看到的是即时的Memory Overhead
    6. 对偶来说Memory不是很关键...然后点Reset Performance Data,让他跑一会,再点Capture Performance Snapshot, 看到的就是在这段时间内,你的所有Function call的次数和time cost...非常有用

    很后悔Flex的这个功能直到很后面才发现...之前都一直是用trace(getTimer());的方法来做的...效率极其低下...
  • 用SafelyRemove来代替removeChild

    刚开始总是碰到的一个问题就是DisplayList的维护经常出岔子...因为removeChild的指令几乎没有容错度,如果那个obj不存在也会报错,如果那个obj不是child也会报错...如果有耐心的同学就应该修掉每一个bug...如果像偶这样没有耐心的就可以用下面这个safelyRemove来忽略一切细节...

    ActionScript 3语言: safelyRemove
    public function safelyRemove(obj, objContainer = "this"){
          if (objContainer == "this")
               var container = this;
          else
               container = objContainer;
          if (obj!=null)
               if (container.contains(obj))
                     container.removeChild(obj);
    }

  • DrawOrder的处理

    和寻路一样...DrawOrder总是很麻烦的...当场景上有几百个object的时候,让他们的遮罩关系时刻保持正确总是一件很麻烦的事情...

    下面是偶的做法:

    • 能用DisplayList的不同层次来解决的就用DisplayList来解决。在GameVisual中建几个不同的空Sprite Object来放那些显然不是同一个Layer的东西,例如UI,GPE,Background,不管怎样,他们之间的遮盖关系总是一定的...

    • 排序的算法:每个obj都有一个用来排序的index值,每次某个obj移动的时候就更新他的index,然后再在调整DrawOrder的时候来对index值排序,然后把obj set到相应的childIndex上

    • 最开始很容易想到的就是每一帧对每一个object做DrawOrder的排序...不过后来就会发现效率跟不上,因为对600个物体做一次排序,然后再做setChildIndex就要大概 4ms 的时间...

      改进的算法是总是维护排好序的{obj,index}数组,每次有一个obj的index值发生改变的时候先确认他是不是需要重新排序,如果需要则把它从数组中删掉,然后找到他的新的位置...然后把他更新到相应的childIndex...
本系列到此完结...之前的内容:

September 18, 2008

从Steam说起...

下午和冲哥聊了下Google收购Valve的那只Rumor...(当然Valve已经矢口否认了...)

PC游戏...特别是PC单机游戏的确已经病入膏肓了...PC游戏商的解释往往有以下几点:
  1. 盗版
  2. Console游戏的挤压
  3. 硬件更新太快,市面上的配置参差不齐...
其实最大的问题还是一从PC游戏诞生开始就百年不变的渠道问题...要打一个PC游戏...作为正版用户...你需要
  1. 在周二到商店排队
  2. 拿回家花半小时安装
  3. 对付各种配置问题带来的麻烦(这点视厂商而定...但大多数厂商做的不好)
  4. 如果碰到像EA这样的DRM爱好者,还会有更多的麻烦...
  5. 你终于进游戏了...但是Patch/设置...还会有更多的东西让你头疼
作为盗版用户甚至可能会有更棒的用户体验...
  • 你可以直接到BT站搜索下载,用Daemon模拟
  • Crack版的游戏会绕过大多数的DRM,让你更快地玩上...
回到主题...群众并不是不想消费PC游戏,而是消费的过程实在是过于痛苦,以至于和游戏本身的质量相比并不相称...

解决方案之一是iTunes Store(App Store)类似的自由市场模式...
  • 对于用户来说,他需要
    • 一站式的浏览/购买/使用体验
    • 无缝的升级
    • 大量的软件源
  • 而对于厂商来说,他需要
    • 一个“中立“的平台 (这点上和Apple的iTunes store不大一样)
    • 低廉的分销费用
    • 更大的客户群(尤其对于小开发商甚至个人作品更有利)
当然其实在现在这样PC游戏以Windows平台占绝对比重的市场,微软本身应该会想去做这件事情...可能这个东西也在他的Games for Windows的远景规划之列...只是360的业务以及Vista的拓展不力拖了后腿...

Valve有这个野心,但是Half-life 系列是很棒的游戏...但Valve本身并不是一个举足轻重的平台开发商...尽管Steam本身经营的非常不错,但除了少部分厂商之外,大多数的出版商还是仅仅把它用来作为老游戏的潜力挖掘地...

而Google则非常适合来做这件事情
  • 他是个坚定的平台商
  • 对于游戏业来说,他是中立的...(不过关键问题在于如何分赃)
  • 他总能在一潭死水的市场找到新的盈利模式...(不仅仅是in-game ads,可以想象一下YouTube for Games)
  • (我总感觉游戏会和其他应用软件一样,慢慢走到云端去,可以想象一下Flash游戏或者网页游戏的复杂度会突破一个界限,让群众觉得表现力已经足够,甚至可以和Console相提并论..."安装"可能都是一个已经逝去的名词...)
当然这些都只是YY而已啦... 不过现在我要说在这方面...国人远远的走在了洋人的前头...网络游戏一般都有比较无缝的试玩体验过程,而且在设计上也都注重满足人性,碰到问题也都能及时更新...不过这是后话了...

September 17, 2008

Force Unleashed for iPhone

其实是个挺有诚意的游戏...原因如下...

  • 手绘背景+3D人物很有Art Feeling...也掩饰了技术力的不足
  • 尽管被群众们斥为电子小说,但还算Original的战斗系统
  • 极高的Tolerance让群众玩的压力全无
  • 横屏/竖屏转换支持...相信我,对于一个游戏来说这不仅仅是call一个transition...
  • 不错的Control Scheme...笔笔划划迅速上手...
不过要期待Console版本的质量或者Gameplay,那就是苛求了...

September 15, 2008

XP网络安装向导

之前一直是用家里的老本本来Down片子share着,用Xbox在电视上看的...今天一个片子看到一半...莫名其妙就连接失败...结果搞了一个多钟头,把一堆的Service开开关关,重启了几次...还是没搞定...

后来奋力Google了一把...原来问题是出在XP是Home Edition上,按照微软官方的说法...的确有时候会出现这个问题...解决方案很简单...就是运行下网络连接向导就可以...恩... 这不是么...就是你的网络需要连接一下么...

September 12, 2008

iMac还是MBP

  • iMac
    + 大屏幕
    + 性能略好
    + 选20'的话略便宜
    - 下次Refresh要11月
  • MacBook Pro
    + 便携...方便应对变化
    + 10/14 Refresh
    + 新外观
    + 有港行,性价比高
    - 可能要再买个外接显示器
    - 发热

一只n00b的两个月ActionScript开发经验 (2)

续上文
  • 矢量还是Bitmap
    • Flash处理矢量自然比较方便,可以比较容易的做关键帧动画效果...不过在有多层遮罩计算的情况下,复杂矢量图形的遮罩会大大拖慢Render的速度。在Flash IDE的stage上的object可以勾上cacheAsBitmap的勾,这样只要那个object不做scale/rotate,Flash Player就会先生成一个bitmap的cache来提高效率...在我碰到的一个例子里,300个物体大概可以提高50%的帧数。不过对于动态加到Scene上的Library Class,就要手动设这个flag,用法是 DisplayObject.cacheAsBitMap = true; 
      而在不需要关键帧动画的情况下...不带alpha的bitmap+mask可能是最快的...不过后来偷懒,一直没有把png的alpha层改成mask...
    •  动画
      • 尽量少用关键帧动画...因为用Flash IDE做的动画修改起来往往比较麻烦...特别是如果要重用到另外的Symbol上的话...解决方法是把动画导出成XML,用Copy Motion as ActionScript 3.0... 而对于简单的不需人工干预的移动旋转Fade in/Out特效,用enterFrame来写费时费力...其实可以用fl.transitions.Tween类一次性解决,其实就是对于MovieClip的某一个属性做渐变...轻松易用...
      • FPS
        • Fps一定要在项目开始就定下来...否则日后要调整所有Timeline相关动画的帧率...非常麻烦...如果交互性很强,例如RTS/Action Game的话,20是比较合适的...如果是Puzzle或者Adventure Game的话,甚至12也足够了...只要帧率稳定,玩家完全没有感觉...
        • TimeLine Code
        • 尽量不要用Timeline代码...因为Debug起来非常麻烦...我唯一用到的可能就是一些stop();啊之类的命令...不过其实也是多余的...因为如果call的时候就是gotoAndStop();的话根本就没有问题
        待续...

        September 9, 2008

        一只n00b的两个月ActionScript开发经验 (1)

        ActionScript是Flash的Script语言,以下内容基于ActionScript3,即Flash CS3 +
        内容基本上都是两个月过程中碰到过的林林总总的问题...如果群众们也有兴趣做做Flash小游戏的话,可能会有帮助。
        • Singleton Mode
          即单态模式,通常似乎都是Design Pattern的第一章的内容...其实就是对于那些在整个游戏进程中只有一个实例的Class,用单态模式会相当程度的简化各个组件间的互相访问...偶的Prototype里大多数的Class都是Singleton Mode
        ActionScript 3语言: Singleton Mode
        package {
        public class Singleton{

              public static var instance:Singleton;

              public function Singleton(){
              }

              public static function getInstance():Singleton{
                    if (instance == null){
                          instance = new Singleton();
                          return instance;
                    }
                    else
                          return instance;
              }        
        }
        }
        • 尽量不要用Timer类
          很多UI或者逻辑的Behavior,最直观的想法就是用Time Event来实现...但是首先Timer多了很难Manage,因为如果要有Pause Game或者有新的状态打断Timer的话就需要很多代码来维护每一个Timer...还有一个问题就是Flash的Timer不是一个精确的Timer,他的每次CallBack其实是Timer的时间+其他Function累积的时间...在极端情况下甚至一个100ms * 50次的Timer会需要10秒钟才能爬完...因此...正确的做法是只使用一个update Timer,其他的都用累积dT时间来处理...
        • 带FPS补偿的Global Update做法...
          其实就是调整每次update的Timer...会使各种逻辑上的update顺畅很多...
        ActionScript 3语言: Global Update Loop
        private function init(){
               updateTimer = new Timer(gameLogic.UPDATE_INTERVAL,1);   //inifinite Loop
               updateTimer.addEventListener(TimerEvent.TIMER_COMPLETE, update);
               lastUpdatedTime = getTimer();             
          }

          private function update(e:TimerEvent){
               //Update Logic
               //Blablabla
             
               //New Timer
               var currentTime:Number = getTimer();
               var newTimeInterval = gameLogic.UPDATE_INTERVAL - (currentTime - lastUpdatedTime - gameLogic.UPDATE_INTERVAL);
               lastUpdatedTime = currentTime;
               if (newTimeInterval <= 0)
                     newTimeInterval = 5;
               updateTimer = new Timer(newTimeInterval,1);    //inifinite Loop
               updateTimer.start();
               updateTimer.addEventListener(TimerEvent.TIMER_COMPLETE, update);
        }
        待续...

        September 3, 2008

        Google Chrome

        首先批评一下Google,这次Google Chrome的Installer有很大的问题

        • 安装程序是用Google Installer打包,然后在线安装的,然而installer居然对公司里IE中已经设置过的Proxy置若罔闻,进度条老是不走...后来弄了离线版的才搞定... 不过看到Google Code里已经有这个Issue报了...想必应该很快就会修掉吧
        • 在家里安装的时候Firefox的设置导入总是有问题...导入窗口会自行消失,但是安装程序的首次设置总还在那里继续等待...于是只能手动杀掉...
        不过总的来说...一旦安装完毕,这个东东还是非常赞的
        • 飞快,尽管最近浏览器一个比一个快...Safari 3比FF2快,FF3又比Safari快,不过这次Chrome的确感觉更快了...
        • Minimum UI,甚至比Safari更进一步,把书签栏和新Tab绑定的设计非常聪明
        • OmniBar,同行提示的Feature和Safari一样,Search History的功能则和Firefox一样,不过可以秒间取得Google Suggest以及Search结果非常赞
        • Feel Polished,尽管还是0.2版,但是UI上已经有很多其实可有可无的特效,感觉制作精良,例如像Safari一样的把Tab拖出来成为窗口,开关书签栏的动画...还有Tab开关/拖动的动画...
        唯一的问题是估计在很长的一段时间内都还是没有插件支持...不过用起来的确很舒服...作为第一个版本已经足够好了