• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            白云哥

            身披半件長工衣,懷揣一顆地主心

             

            2010年8月12日

            C++中遍歷容器對(duì)象時(shí)需要注意的問題

            假設(shè)有這樣一個(gè)管理對(duì)象的窗口 ActorManager,其實(shí)現(xiàn)大概為

            class Actor;
            class ActorManager
            {
            public:
            void update()
            {
            for (actors_t::const_iterator itr = m_actors.begin(); itr != m_actors.end(); ++itr)
            {
            Actir* actor = itr->second;
            actor->update();
            }
            }

            void add(Actor* actor)
            {
            m_actors[actor->get_id()] = actor;
            }

            void remove(Actor* actor)
            {
            m_actors.erase(actor->get_id());
            }

            private:
            typedef std::map<int, Actor*> actors_t;
            actors_t m_actors;
            };

             

            而Actor類的實(shí)現(xiàn)是這樣:

            class Actor
            {
            public:
            void update()
            {
            // ...

            }

            有一天,在給Actor添加邏輯的時(shí)候,update函數(shù)變成了這樣

            void update()
            {
            // ...

            update_buff_effect();

            // ...
            }

             

            再往下

             

            class Actor
            {
            // ...

            private:
            void update_buff_effect()
            {
            // ...

            apply_hp(-100);
            if (get_hp() <= 0)
            {
            die();
            return;
            }

            // ...
            }

             

            然后……

             

            private:
            void die()
            {
            // ...

            ActorManager::getInstance().remove(this);

            // ...
            }
            在寫下ActorManager的時(shí)候并沒有想到會(huì)在update循環(huán)里刪除對(duì)象,而實(shí)際上卻有幾次遇到類似的問題。
            有些問題沒有這么明顯,但也都是出在遍歷容器對(duì)象的過程中,某個(gè)執(zhí)行函數(shù)刪除了窗口里的對(duì)象,從而導(dǎo)致迭代器失效。
             
            修改的方法很簡單,給ActorManager添加一個(gè)待刪除對(duì)象列表
            在remove方法中并不真正刪除對(duì)象,而是等到update中循環(huán)結(jié)束后再刪除對(duì)象。
            代碼看起來會(huì)是這樣:
            class Actor;
            class ActorManager
            {
            public:
            void update()
            {
            m_is_looping = true;
            for (actors_t::const_iterator itr = m_actors.begin(); itr != m_actors.end(); ++itr)
            {
            Actir* actor = itr->second;
            actor->update();
            }
            m_is_looping = false;

            if (!m_removed_actors.empty())
            {
            for (removed_actors_t::const_iterator itr = m_removed_actors.begin();
            itr != m_removed_actors.end(); ++itr)
            {
            Actor* actor = *itr;
            m_actors.erase(actor->get_id());
            }
            m_removed_actors.clear();
            }
            }

            void add(Actor* actor)
            {
            m_actors[actor->get_id()] = actor;
            }

            void remove(Actor* actor)
            {
            if (!m_is_looping)
            m_actors.erase(actor->get_id());
            else
            m_removed_actors.push_back(actor);
            }

            private:
            typedef std::map<int, Actor*> actors_t;
            actors_t m_actors;

            typedef std::vector<Actor*> removed_actors_t;
            removed_actors_t m_removed_actors;
            bool m_is_looping;
            };

             

            沒有給add也加保護(hù)的原因是,不會(huì)在update函數(shù)內(nèi)向ActorManager添加新對(duì)象。

            當(dāng)然,有可能在其他地方會(huì)有這樣的需求,同樣也做類似的保護(hù)即可。

             

             

            問題雖然不大,但是幾次碰到類似的錯(cuò)誤了。記錄之,并強(qiáng)制要求自己,

            在遇到會(huì)對(duì)容器內(nèi)的對(duì)象做for…處理時(shí),一定要謹(jǐn)慎的檢查一下remove接口。

            posted @ 2010-08-12 23:02 白云哥 閱讀(2984) | 評(píng)論 (15)編輯 收藏

            2010年8月8日

            SmartFoxServer項(xiàng)目完成總結(jié)

             

                總體來說,如果是想做一個(gè)比較簡單的虛擬現(xiàn)實(shí)服務(wù),拿sfs來做還是很方便的,省去了前期構(gòu)造服務(wù)器網(wǎng)絡(luò),實(shí)現(xiàn)數(shù)據(jù)庫接口,數(shù)據(jù)同步等等一些基礎(chǔ)功能的時(shí)間,可以一上來就直奔主題,開發(fā)自己項(xiàng)目相關(guān)的功能.

             

                Sfs的接口封裝也比較簡單,基本上看到接口名就能知道是做什么用的,參數(shù)是什么意義,而且他的文檔也比較詳細(xì),對(duì)于非服務(wù)器開發(fā)專業(yè)人員也比較方便.sfs的定義也主要在此,比如他最早支持的flash客戶端api.

             

                而隨著sfs的成功,也開始將目標(biāo)轉(zhuǎn)向了目前新興的iphone, android, sillverlight, unity等 客戶端.這次使用c# client api做了一個(gè)winform測試程序,使用起來也是非常的方便.

             

             

                第一次拿sfs做商業(yè)項(xiàng)目,也還是遇到了一些問題,總結(jié)一下,另外還有一些未完善的地方,后面再花時(shí)間繼續(xù)實(shí)現(xiàn).

             

             

                CustomLogin的處理在zone extension里,必須先join room才能使用xt message.所以需要先寫一個(gè)zone extension,在這里處理登錄驗(yàn)證,注意驗(yàn)證成功后需要向客戶端發(fā)送room list, 客戶端必須收到room list消息才能做后面的操作,這是sfs限制死了的.

             

            本來我想在extension里讓客戶端驗(yàn)證成功后直接join room,未果,調(diào)試良久才發(fā)現(xiàn),客戶端未收到room list,不能join room.

             

             

                Sfs的user variables只支持bool, integer, string類型,其他類型的數(shù)據(jù)不能同步.這個(gè)問題困擾了我差不多一個(gè)小時(shí),最后在客戶端一步步跟蹤屬性同步過程時(shí)才發(fā)現(xiàn),其他類型的variable都被忽略掉了.

             

                于是,為了同步float坐標(biāo)數(shù)據(jù),我不得不加上了float.toString(),數(shù)據(jù)量又大了不少.

             

             

                Sfs消息定義的方式,不要像sample里那樣,直接寫字符串名字,改用枚舉或者常量定義.每個(gè)extension name和command name都只有一個(gè)字節(jié),在枚舉中也可以定義出128個(gè),完全夠用.

             

                這樣可以省不少帶寬占用量,可以在client上開啟debug message開關(guān),看一下一個(gè)簡單的消息發(fā)送會(huì)占多少字節(jié).

             

             

                如果想同時(shí)在eclipse和netbeans下對(duì)一個(gè)項(xiàng)目進(jìn)行開發(fā),注意文件編碼的問題.eclipse下創(chuàng)建的文件默認(rèn)編碼為gbk,netbeans下創(chuàng)建的文件默認(rèn)為utf-8,而在eclipse下導(dǎo)入文件時(shí)他并不會(huì)自動(dòng)檢測文件的編碼,所以,你需要在文件的屬性里手動(dòng)設(shè)置一下編碼方式.另外,netbeans下要在文件中顯示中文字符只能使用utf-8,使用gbk會(huì)出亂碼,如果出現(xiàn)此類錯(cuò)誤,修改一下文件編碼方式以及指定新的編碼即可.

             

             

                要關(guān)于利用IDE編譯環(huán)境.在項(xiàng)目最開始的一周里,我使用trace來進(jìn)行調(diào)試,一次次的通過trace打印出中間變量,然后再修改代碼,再啟動(dòng)服務(wù)器,再看trace信息……在我快要陷入崩潰絕望之時(shí),終于,決定建一個(gè)好用的集成調(diào)試環(huán)境.在嘗試eclipse失敗后,我成功的在netbeans中打下了斷點(diǎn),單kh步跟蹤,于是,整個(gè)世界變得清靜多了……

             

                關(guān)于如何在netbeans中調(diào)試extension,可以參考我之前的一篇文章

             

             

                sfs中服務(wù)器與客戶關(guān)通信的協(xié)議有三種:xml,json和raw string,使用json會(huì)比xml節(jié)省不少字節(jié),但其仍然占用比較大的帶寬開銷.如果是數(shù)據(jù)交互量比較小的應(yīng)用,這個(gè)問題不會(huì)太大,但對(duì)于即時(shí)戰(zhàn)斗類MMO來說,可能會(huì)成為一個(gè)比較大的問題.嘗試了一下使用raw string的方式傳遞結(jié)構(gòu)體,但是沒找到比較好的方法,以后有機(jī)會(huì)再繼續(xù),如果可能的話,結(jié)合google proto buffer和raw string方式,將會(huì)是一個(gè)比較好的方案.

             

             

                在處理extension message時(shí),按照示例所提供的方法,先取出cmd,然后使用equal的方式一個(gè)個(gè)進(jìn)行比較,然后轉(zhuǎn)到對(duì)應(yīng)的處理函數(shù).對(duì)于消息種類比較小的應(yīng)用來說還沒發(fā)現(xiàn)問題,但是對(duì)于有大量自定義消息的應(yīng)用,這里就需要修改一下了.

             

             

                Sfs的db extension目前看起來只能在當(dāng)前線程中處理,并且是阻塞式的,暫時(shí)沒有嘗試使用多個(gè)線程操作數(shù)據(jù)庫,也沒有把數(shù)據(jù)庫操作改為異步操作.這也是未來需要進(jìn)一步改進(jìn)的地方.

             

             

                暫時(shí)不清楚SFS是否會(huì)為每個(gè)room開啟一個(gè)單獨(dú)的線程,或者是每個(gè)extension一個(gè)線程.如果zone里房間數(shù)比較多的話,分多個(gè)線程處理也是需要的,未來也需要繼續(xù)考慮一下多線程的問題.

             

             

                Sfs的實(shí)現(xiàn)是把一個(gè)room當(dāng)成了一個(gè)廣播單元,這對(duì)于開房間類的游戲來說沒有問題,但是如果相用它來做MMO就需要注意一下,因?yàn)閡ser variables的同步是以整個(gè)room為單位的,也就是當(dāng)一個(gè)房間里人數(shù)達(dá)到幾百人甚至幾千人的時(shí)候,某個(gè)玩家的進(jìn)入和退出房間消息,屬性修改消息的廣播量都會(huì)是巨大的.但是在沒有源碼的情況下想要修改這個(gè)不大容易,也就是限制了sfs的應(yīng)用環(huán)境.

            posted @ 2010-08-08 14:16 白云哥 閱讀(10308) | 評(píng)論 (0)編輯 收藏

            2010年8月7日

            Framework Design Guidelines讀書筆記

            這本書雖然是講述.net框架設(shè)計(jì)的一些規(guī)范,不過仍然有一些通用的設(shè)計(jì)準(zhǔn)則可以參考

             

            命名規(guī)范:

            這些只有在用于公開暴露給外界的API時(shí)才是必需的

             

            標(biāo)識(shí)符大小寫規(guī)則:

            1.要把PascalCasing用于由多個(gè)單詞構(gòu)成的名字空間,類型以及成員的名字

            2.要把camelCasing用于參數(shù)的名字

            3.不要把閉合形式的復(fù)合詞中每個(gè)單詞的首字母大寫,比如 callback, endpoint 等等,可以查閱英語詞典來確定復(fù)合詞是不是閉合的

            4.不要使用匈牙利命名法。原因有幾點(diǎn),一是發(fā)明它的ms公司都已經(jīng)明確要求在新的庫在不要使用這種命名法,二是變量名前加類型標(biāo)識(shí)符是個(gè)很不好的習(xí)慣,在開發(fā)過程中有可能會(huì)隨時(shí)修改這些變量的類型定義,三是新的編輯器中不需要用m_前綴來確定其類型,不過對(duì)于內(nèi)部實(shí)現(xiàn)的變量來說,用一個(gè)前綴也許會(huì)讓變量的查找更方便,比如用一個(gè)_前綴

            5.不要使用未被廣泛接受的首字母縮寫詞,如何確定某個(gè)縮寫詞是否眾所周知有個(gè)好方法,到google上搜索一下,如果前幾條都是你所期望的內(nèi)容,那么它就是眾所周知的了

             

            關(guān)于命名:

            1.要用名詞或名詞短語來給類和結(jié)構(gòu)體命名,使用PascalCasing的大小寫風(fēng)格,類名字不要加 C,但是接口前需要加 I,這是個(gè)特例

            2.用形容詞短語來給接口命名,在少數(shù)情況下也可以使用名詞或名詞短語

            3.考慮在派生類的末尾使用基類的名字,比如 class FileStream : public Stream

            4.用動(dòng)詞或動(dòng)詞短語來命名方法,比如 int CompareTo();

            5.要用肯定性的短語(CanSeek而不是CantSeek)來命名布爾屬性,可以加Is,Can,Has等前綴,要確保使用時(shí)的測試語句讀起來通順,比如

            if (collection.Contains(item)) 就比 if (collection.IsContained(item)) 要通順得多

            此外,要優(yōu)先選擇主動(dòng)語態(tài)而不是被動(dòng)語態(tài),比如

            if (stream.CanSeek()) 就比 if (steam.IsSeekable()) 要強(qiáng)得多

            6.要用現(xiàn)在時(shí)和過去時(shí)來賦予事件名以之前和之后的概念,不要用Before或After這樣的前后綴,比如 Closing, Closed而不是AfterClose

             

            使用規(guī)范:

            1.優(yōu)先使用集合,避免使用數(shù)組

            2.考慮使用不規(guī)則數(shù)組,而不要使用多維數(shù)組,也就是優(yōu)先使用int [][] jagedArray這樣的數(shù)組,避免使用 int [,] multiDimArray這樣的類型

            3.要用最泛的類型來作為參數(shù)類型,大多數(shù)以集合為參數(shù)的成員都使用IEnumerable<T> 接口

            posted @ 2010-08-07 00:19 白云哥 閱讀(347) | 評(píng)論 (0)編輯 收藏

            2010年8月6日

            讓Bada的GlesCube11 Sample跑起來

                困擾了兩天的問題終于解決,原因只是我的顯卡驅(qū)動(dòng)太老,安裝最新的驅(qū)動(dòng)就一切OK了,汗

             

             

                如果你也遇到了同樣的問題,不防也試試最新的顯卡驅(qū)動(dòng),也許可以省下兩天的郁悶時(shí)間 微笑

             

                一個(gè)是在InitEGL中調(diào)用eglMakeCurrent時(shí),會(huì)報(bào)告EGL_DEVICE_LOST錯(cuò)誤,我嘗試著將這個(gè)消息忽略掉之后沒有任何問題 微笑

                另一個(gè)是在Draw中調(diào)用glGetIntegerv(GL_VIEWPORT, (GLint*)&viewPort);時(shí)返回的viewPort值是個(gè)錯(cuò)誤值,我又嘗試著為viewPort直接再賦一次值,{0,0,480,800},又OK了 微笑

             

                不過這只是部分OK,Sample跑起來后我只能看到變化的背景色,cube們哪去了?

             

                翻遍了bada的forum也沒有遇到同樣的問題,只是看到幾個(gè)同樣說EGL_DEVICE_LOST錯(cuò)誤的,也同樣沒有找到解決方法

             

                忽然間,我想會(huì)不會(huì)跟顯卡有關(guān),我這新裝的win7系統(tǒng)還沒有裝過顯卡驅(qū)動(dòng),用的是自帶的。于是,下載,安裝,再打開bada IDE,于是,這個(gè)困擾了我兩天的問題就這么神奇般的消失了……

             

                最后,貼張運(yùn)行效果圖以示紀(jì)念,雖然只是Sample的效果圖,沒有我的半行代碼,不過這也困擾了我兩天,不是么 悲傷

             

            bg

            posted @ 2010-08-06 21:30 白云哥 閱讀(345) | 評(píng)論 (0)編輯 收藏

            2010年7月22日

            使用NetBeans調(diào)試SmartFoxServer的Extension

            結(jié)束了兩個(gè)星期的用trace進(jìn)行SmartFoxserver Extension調(diào)試的痛苦歷史之后,我決定再來嘗試一下怎么在IED環(huán)境下進(jìn)行遠(yuǎn)程調(diào)試。

            上一次打算在Eclipse下進(jìn)行,不知道哪一個(gè)環(huán)節(jié)出錯(cuò),沒能成功,這次改用NetBeans吧,正好趕上NetBeans新版本發(fā)布,來試用一次。

             

            按照這里描述的方法,很快把Eclipse下創(chuàng)建的工程導(dǎo)入到了NetBeans下,不過遇到了點(diǎn)小問題,一堆的亂碼。檢查了下發(fā)現(xiàn),Eclipse下創(chuàng)建的文件編碼為ANSI,在NetBeans下不識(shí)別其中的中文注釋,把文件改成UTF-8后問題解決,可后來我再試圖在Eclipse下打開這些文件時(shí)問題又出現(xiàn)了,Eclipse只識(shí)別ANSI編碼的文件?似乎不大可能吧,不過一時(shí)也沒找到解決方法,暫時(shí)放棄,改用NetBeans吧。

             

            按照論壇上的方法做就行,不過可能因?yàn)榘姹靖碌脑颍瑢?shí)際做的時(shí)候還是有點(diǎn)差別

             

            Step 1
            Download the
            Netbeans IDE for java development. (47mb SE version should be fine!)

            這一步就是這樣了


            Step 2
            Install and open Netbeans. Create a project from existing java source pointing to where your extensions are. Should be placed in src subfolder to be nice.
            (I for sure could not make it work if the source was not in a subfolder)
            Right click on project and choose properties->libraries. Add all jar files from your smartfox installation lib dir.

            在NetBeans下導(dǎo)入原來Eclipse創(chuàng)建的文件,只需要src目錄即可

            導(dǎo)入libraries時(shí)注意,按照這里的方法,只需要導(dǎo)入3個(gè)jar文件,就是這樣

            nb5


            Step 3
            Goto Files tab. Expand nbbuild.xml. Click on -post-compile target.
            Copy and paste the following code: (Note: adjust todir to point to your smartfox program extension directory)
            <copy todir="C:\Programmer\SmartFoxServerPRO_1.6.6\Server\javaExtensions">
            <fileset dir="${build.dir}/classes/"/>
            </copy>

            我的NetBeans下沒有nbbuild.xml,倒是有一個(gè)build.xml,不過里面沒內(nèi)容 悲傷

            再看了下,原來引用的build-impl.xml,上面有個(gè)簡單的介紹,在build.xml里添加如下內(nèi)容即可:

            <target name="-post-compile">
                    <copy todir="D:\SmartFoxServer\Server\javaExtensions">
                        <fileset dir="${build.dir}/classes/"/>
                    </copy>
            </target>

            根據(jù)你的SmartFoxServer安裝目錄進(jìn)行修改即可


            Step 4
            Create a new batchfile called SmartFoxDebug?.bat
            Copy and paste the following content into it: (Again adjust to your installation directory)
            C:\Programmer\SmartFoxServerPRO_1.6.6\Server\wrapper.exe -c "C:\Programmer\SmartFoxServerPRO_1.6.6\Server\conf\wrapper.conf"

            這一步不需要,在我安裝的目錄下直接有個(gè)smarfoxService.bat批處理文件,用它就行了


            Step 5
            Add the following lines to your wrapper.conf

            Code:

            # runtimedebug
            wrapper.java.additional.3=-Xdebug
            wrapper.java.additional.4=-Xnoagent
            wrapper.java.additional.5=-Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n

            這里的意思是要在SmartFoxServer里開戶遠(yuǎn)程調(diào)試的監(jiān)聽,在我安裝的SFS版本里原來比這多了一項(xiàng)配置,所以最終是這樣的:

            # Java Additional Parameters
            wrapper.java.additional.1=-server
            wrapper.java.additional.2=-Dfile.encoding=UTF-8
            wrapper.java.additional.3=-Djava.util.logging.config.file=logging.properties
            wrapper.java.additional.4=-Xdebug
            wrapper.java.additional.5=-Xnoagent
            wrapper.java.additional.6=-Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n

             

            Step 6
            Choose Run->Build main project (F11) in Netbeans.
            If build is ok, click the batch file. Now select debug->attach debugger and choose port 8888. Debugger console should say "User program running".
            Now you can place breakpoints and trigger your extensions normally.

            這里就是最終我們要實(shí)現(xiàn)的效果了,掛接SmartFoxServer的遠(yuǎn)程JVM進(jìn)行調(diào)試,配置項(xiàng)在 調(diào)試(D) 下的 連接調(diào)試器(A) ,如果你跟我一樣安裝的是中文版NetBeans的話 微笑

            貼張圖,就是這樣,注意端口號(hào),是上面配置的那個(gè),不是SFS對(duì)客戶端連接的監(jiān)聽商品號(hào)9393哦

            config

             

             

            好了,先啟動(dòng)SFS,用上面說的那個(gè)批處理文件,你會(huì)看到一行提示信息,JVM遠(yuǎn)程調(diào)試的監(jiān)聽已打開

            然后連接調(diào)試器

            在NetBeans里打個(gè)斷點(diǎn)看看,O了



            posted @ 2010-07-22 08:12 白云哥 閱讀(1998) | 評(píng)論 (0)編輯 收藏

            2010年7月21日

            Android的無邊界程序設(shè)計(jì)理念

                無邊界程序設(shè)計(jì)理念這個(gè)提法來自于這里

                “Android的應(yīng)用只是一個(gè)虛的概念,并沒有實(shí)際的入口,這個(gè)不像Window平臺(tái)上的應(yīng)用程序的概念,Android更多的是提供組件(Components)的概念。突出請(qǐng)求和服務(wù),突出組件個(gè)體,弱化邊界,系統(tǒng)的各個(gè)組件可以自由的無邊界的交流,服務(wù)請(qǐng)求者直接發(fā)出請(qǐng)求,不論這個(gè)對(duì)象在何處和屬于誰的,組件是自由獨(dú)立的個(gè)體,一個(gè)應(yīng)用程序可以直接請(qǐng)求使用其他的應(yīng)用的的組件,這個(gè)是Android應(yīng)用框架設(shè)計(jì)的核心理念,其他的一切都是在為這個(gè)核心理念服務(wù)。”

                “讓程序員忽略應(yīng)用的概念,甚至徹底的拋棄進(jìn)程這樣的概念,程序員看到的就是一個(gè)一個(gè)的組件,應(yīng)用程序員利用這些組件來架構(gòu)成一個(gè)所謂的應(yīng)用,那么設(shè)計(jì)者首先要考慮的是什么呢?我想應(yīng)該是一個(gè)抽象的應(yīng)用模型,在這個(gè)模型下產(chǎn)生概念和接口。”

                “Android中你可以開始一個(gè)Activity,但是沒有權(quán)利消滅一個(gè)Activity,這是個(gè)體權(quán)利的體現(xiàn),個(gè)體的消滅是由系統(tǒng)決定的,這個(gè)就是Android中Activity蘊(yùn)含的人文意義。”

             

                這段總結(jié)說的非常好,從我近期對(duì)Android開發(fā)的一些基本了解來看,也確實(shí)是這樣。在Android平臺(tái)下開發(fā),你不需要從頭開始構(gòu)建一個(gè)應(yīng)用,你可以使用系統(tǒng)提供好的一些功能,或者是別人的應(yīng)用程序中已實(shí)現(xiàn)的部分功能,拿來組裝自己的應(yīng)用,當(dāng)然,你做好的應(yīng)用也可以把部分功能暴露給別人來使用。具體說來,就是Activity與Intent的使用。

             

                基于這樣一種模式,Android開發(fā)更像是堆積木,當(dāng)然,這是理想狀態(tài)下的。Google最近不是就推出了一款通過web上的組件拖拽就能生成一個(gè)自定義的應(yīng)用程序的工具么,當(dāng)然,我只看了下介紹,還沒有機(jī)會(huì)親自體驗(yàn),不過,這終將是未來的趨勢。

                當(dāng)然,這對(duì)于開發(fā)人員來說是好事,你可以更加快速的把自己的想法變成現(xiàn)實(shí),你不用親力親為的去做每一件細(xì)小的事情。

                對(duì)于手機(jī)使用者來說,這同樣是好事。使用統(tǒng)一的Activity構(gòu)建出來的應(yīng)用,不論是外觀還是使用方式上都是完全統(tǒng)一的,用戶拿到一個(gè)新應(yīng)用時(shí)基本上不會(huì)有太大的使用方面的成本。

                而對(duì)于Google來說,這當(dāng)然也是好事。Google可以把他的云計(jì)算服務(wù)都做成一個(gè)個(gè)的組件,應(yīng)用開發(fā)者們可以隨意組合上自己的應(yīng)用中,這對(duì)于Google推廣自己的服務(wù)將會(huì)是一件非常有益的事。

             

                當(dāng)然,目前來說,組件的提供還并不算完美,現(xiàn)在來開發(fā)一個(gè)應(yīng)用,還是需要自己做很多工作,僅有少部分服務(wù)可以直接調(diào)用Google提供的Intent,而調(diào)用別人的Activity很難得到保證,比如對(duì)別人的應(yīng)用的依賴,比如接口的保證,等等。另外,目前各手機(jī)廠商在定制Android時(shí)都提供了自己的UI sence,而各家也都不一樣,再加上Android原生的,這也使得UI的統(tǒng)一越發(fā)的難,不知道未來將會(huì)如何處理。

            posted @ 2010-07-21 08:27 白云哥 閱讀(1758) | 評(píng)論 (1)編輯 收藏

            2010年6月29日

            移動(dòng)互聯(lián)網(wǎng)的明天

                明天一定是屬于移動(dòng)互聯(lián)網(wǎng)的,這點(diǎn)已越來越不容否定。

                在移動(dòng)互聯(lián)網(wǎng)到來的時(shí)候,能夠做點(diǎn)什么呢?一點(diǎn)不成熟的想法,簡單記錄之。

                門戶,讓每個(gè)用移動(dòng)終端設(shè)備的人,不論是iphone,android這樣的智能手機(jī),還是ipad,平板,抑或是WebOS,Google,MeGoo的上網(wǎng)本,他們打開設(shè)備后第一個(gè)運(yùn)行的軟件,門戶軟件。

                從這里,他們可以使用移動(dòng)互聯(lián)網(wǎng)的絕大多數(shù)服務(wù),比如說,查找本地信息,瀏覽感興趣的新聞和博客,看看好友們的最新動(dòng)向,等等。他們不需要打開瀏覽器,不需要記住一個(gè)個(gè)煩人的網(wǎng)址,也不需要在Google或是Baidu輸入一些精挑細(xì)選的關(guān)鍵字,他們所要做的僅僅只是打開這個(gè)門戶軟件,然后,一切盡在眼前,而且,你使用這個(gè)軟件的次數(shù)越多,他越能了解你的脾性,越來越能猜到你想干什么。

                UCWeb在這方面已經(jīng)先走了很大一步。現(xiàn)在的ucweb已不再只是一個(gè)單一的瀏覽器,打開UC,你已能如我前面描述的那樣,完成大部分想做的事,包括新聞聚合,包括博客訂閱,包括生活信息查詢,當(dāng)然也包括QQ,MSN等聊天工具的整合以及校內(nèi),開心網(wǎng)等入口。

                基于地理位置的信息提供,可以與娛樂相結(jié)合,做成一個(gè)集社交、生活于一身的休閑應(yīng)用,你可以在這里找到你感興趣的一些信息,而且,是根據(jù)真實(shí)位置過濾好的,也就是說,你看到的絕大多數(shù)信息都會(huì)是你感興趣的。

                在機(jī)鋒上,找到一個(gè)叫幫飄信的軟件,有那么一點(diǎn)意思。

                還有,完全娛樂化的社區(qū)平臺(tái),可以利益于移動(dòng)互聯(lián)網(wǎng)的優(yōu)異特性,隨時(shí)隨地都可以接入,不用花太多時(shí)間,與認(rèn)識(shí)的不認(rèn)識(shí)的朋友有那么一點(diǎn)交互,比如在地鐵上,臨睡前,辦公室開小差的時(shí)候,都可以。內(nèi)容簡單但不失樂趣的娛樂小應(yīng)用。

                人人網(wǎng),開心網(wǎng),白社會(huì),F(xiàn)acebook,或者是摩爾莊園,浪漫莊園,再或者是各類三國web game,其實(shí),這些本身都可以從智能終端設(shè)備接入,當(dāng)然,除了iphone以外。不過,這些專為pc設(shè)計(jì)的娛樂平臺(tái)到了手機(jī)上還是會(huì)有些問題,包括視覺效果的問題,交互性的問題。我覺得,做一個(gè)專為移動(dòng)終端平臺(tái)設(shè)計(jì)的摩爾莊園,嗯,挺有點(diǎn)意思。

            posted @ 2010-06-29 22:11 白云哥 閱讀(322) | 評(píng)論 (0)編輯 收藏

            2010年6月22日

            Android Tab Layout (TabHost) Tutorial的Force Close錯(cuò)誤

                想搗騰一下Android開發(fā),結(jié)果第一個(gè)問題就糾纏了好久。

                關(guān)于TabHost的大多數(shù)例子里都是把所有的Tab頁設(shè)置到了同一個(gè)Activity,而實(shí)際制作中我們希望為每個(gè)Tab頁使用一個(gè)不同的xml布局,正好Android Tutorials中有一個(gè)Tab Layout的例子,可是Google的人漏掉了很重要的一個(gè)步驟。

                例子在android-sdk目錄下 docs/resources/tutorials/views/hello-tabwidget.html

             

                按照Tutorial做完后,始終無法正確運(yùn)行,嘗試著不斷修改,當(dāng)把TabContent指定為xml中配置的view時(shí)就不會(huì)有問題,但我希望每個(gè)Tab頁是一個(gè)單獨(dú)的單元,有自己的xml布局,有自己的Activity類實(shí)現(xiàn)。終于,在繼續(xù)求助于Google之后找到了問題所在:需要為每個(gè)自己定義的Activity到AndroidManifest.xml中聲明一下,具體就是這樣:

            <activity android:name=".ArtistsActivity"></activity>
            <activity android:name=".AlbumsActivity"></activity>
            <activity android:name=".SongsActivity"></activity>

                上面的name是自己聲明的Android類名,做相應(yīng)的修改即可。

             

             

                這里有一個(gè)詳細(xì)的說明:

            http://stackoverflow.com/questions/2209406/issues-with-android-tabhost-example

                Google Code上也有人貼出了這個(gè)issue,并且有解決方法:

            http://code.google.com/p/android/issues/detail?id=4183

             

              也許你也遇到了這個(gè)同樣的問題,希望能少走點(diǎn)彎路 :)

            posted @ 2010-06-22 08:06 白云哥 閱讀(2398) | 評(píng)論 (2)編輯 收藏

            2010年4月21日

            DOOM啟世錄的啟示

            “游戲分兩種,一種是生活中玩的,另一種是生活在其中的”這是DOOM啟世錄的第一句話。

             

            “約翰。羅梅洛,王牌程序員”羅梅洛的第一個(gè)稱號(hào),雖然是他自封的,但絕不過譽(yù)。當(dāng)然,在他遇上卡馬克后他也會(huì)變得謙虛起來。

            卡馬克,一個(gè)進(jìn)過少管所,也呆過天才班的神奇小子兼只上過兩個(gè)學(xué)期大學(xué)的火箭科學(xué)家。

             

            天才程序員:

            羅梅洛在他還是孩子時(shí),就給自己的公司取好了名字:頂級(jí)思想軟件 Capital Ideas。雷恩,另外一個(gè)聽著重金屬,看著地下漫畫,玩著游戲長大的叛逆程序員,一樣有他的公司,不過與羅梅洛一樣,也是公司里的光桿司令,他的公司叫藍(lán)山科技 Blue Mountain。

            當(dāng)他們倆相遇的時(shí)候,兩個(gè)光桿司令合并成了一家新公司:深思軟件 Ideas from the Deep,也就是ID的前身。

             

            羅梅洛,卡馬克,雷恩,這三個(gè)程序員在軟盤雜志社相遇的那一天,也同樣開始了PC游戲史上的一段傳奇歷史。很快,王牌程序員就領(lǐng)教了天才小子的厲害。天才小子也欣賞王牌程序員身上的藝術(shù)氣質(zhì),還有他的設(shè)計(jì)創(chuàng)意。 

            湯姆,二十五歲的程序員,與羅梅洛一樣,也是個(gè)喜劇演員,同時(shí)也是一個(gè)優(yōu)秀的游戲設(shè)計(jì)師,還是一個(gè)不錯(cuò)的超現(xiàn)實(shí)主義漫畫家。

            艾德里安,一個(gè)黑色主題藝術(shù)家,他其實(shí)只想在軟盤雜志社做個(gè)兼職美術(shù)師,賺著比其他地方稍多點(diǎn)的薪水,直到他遇到了羅梅洛跟卡馬克。

            機(jī)會(huì)永遠(yuǎn)只會(huì)留給有所準(zhǔn)備的人,這話一點(diǎn)不假。

            翻一翻他們的履歷,也就不會(huì)憎惡上帝太過于眷顧這群小伙子。

             

            走出第一步:

            在那個(gè)晚上,湯姆與卡馬克山寨了超級(jí)馬里奧,卡馬克的天才技術(shù)讓另外兩位程序員不得不嘆服。

            “羅梅洛被這突如其來的驚喜驚呆了,他動(dòng)彈不得,甚至站都站不起來。直到幾個(gè)小時(shí)后卡馬克回到辦公室,他才有力氣說話。他只有一件事要告訴他這個(gè)朋友,這個(gè)編程天才,這個(gè)絕配般的搭檔:

            ‘不用想了,我們走人’”

            當(dāng)然,這只是羅梅洛的一句沖動(dòng)話,就像他以前經(jīng)常有過的那樣,不時(shí)的會(huì)沖動(dòng)。

            可這一次,羅梅洛的沖動(dòng)開始當(dāng)真了。

            “1990年9月20號(hào)這個(gè)宿命的早晨,這個(gè)早晨對(duì)他們倆都是一個(gè)意義重要的時(shí)刻。卡馬克用他非凡的專注解決了一個(gè)迫切緊要的挑戰(zhàn),羅梅洛則預(yù)見了這成果可能帶來的一切。就仿佛,卡馬克制作好調(diào)色板,然后羅梅洛用這調(diào)色板描繪出一個(gè)未來。”

            “他們已經(jīng)有了一個(gè)夢幻團(tuán)隊(duì):卡馬克,天才小子和圖像領(lǐng)域的領(lǐng)頭羊;羅梅洛,游戲制作的多面手和公司的啦啦隊(duì)長;艾德里安,沉迷于黑暗主題的藝術(shù)家;湯姆,游戲設(shè)計(jì)師和超現(xiàn)實(shí)主義漫畫家;還有雷恩,雖然不那么令人滿意,但也還是個(gè)不錯(cuò)的程序員。”

            不過沖動(dòng)歸沖動(dòng),生活還要繼續(xù)。

            天才小子們的價(jià)值在還沒有被認(rèn)可之前,他們也一樣要打工掙錢買盒飯。

            所以,與很多的創(chuàng)業(yè)團(tuán)隊(duì)一樣,他們“借”用著公司的資源,做著自己的事。在那個(gè)時(shí)刻,PC機(jī)是奢侈品,想要回家自己干都是一件非常困難的事,于是,他們便在周末把公司的電腦“搬”回家去干。

            終于,指揮官基恩在他們手下誕生了。

            不過,這還只是邁出了第一步,一小步而已。這時(shí)可不能輕舉妄動(dòng)。

            有句話說的好,

            公司的事再大也是小事,

            自己的事再小也是大事。

            為未來的機(jī)會(huì)作好準(zhǔn)備,怎么去做?

            當(dāng)然不是說在公司里拿著薪水卻干著自己的私事,但是,每天八小時(shí)之外的時(shí)間,有沒有好好利用起來,這也就決定了人生不同的走向。

            找對(duì)好搭檔:

            羅梅洛,卡馬克與艾德里安,可以稱作是ID的鐵三角。

            而羅梅洛與卡馬克二人又是這鐵三角里的重心所在,也是游戲合伙人搭檔的典范。

            “羅梅洛和卡馬克在性格上有個(gè)很顯著的不同,那就是他們對(duì)待時(shí)光的態(tài)度,正是這種內(nèi)在秉性的差異,使他們成為最佳拍檔,也使他們無可挽回的決裂。

            卡馬克只活在當(dāng)前時(shí)刻。專注,是他力量的源泉。

            羅梅洛則完全相反,他沉浸在所有時(shí)光里:過去,現(xiàn)在,將來。他不止是充滿激情,他還付諸行動(dòng)。”

            這一靜一動(dòng)的關(guān)系正好互補(bǔ)。

            不僅如此,卡馬克的技術(shù)與羅梅洛的創(chuàng)意更是天才搭檔。

            手術(shù)師約翰,被看作是地球上有史以來最牛B的程序員。

            引擎師約翰,被譽(yù)為搖滾之神,這當(dāng)然不是因?yàn)樗膿u滾樂。

            當(dāng)卡馬克創(chuàng)造出了新的技術(shù),羅梅洛總能發(fā)現(xiàn)這技術(shù)的應(yīng)用之處,并能把他的潛力挖掘到最深。而當(dāng)后來羅梅洛離開ID之后,卡馬克只能失望于他所創(chuàng)作出來的史上最強(qiáng)大的引擎,卻沒有人能來推動(dòng)他。

            “盡管卡馬克從未公開表示過他懷念過去的ID,懷念羅梅洛那令人眼花繚亂的構(gòu)思和設(shè)計(jì),但卡馬克清楚地知道,現(xiàn)在的ID已不再是從前的ID,現(xiàn)在的ID已經(jīng)沒有了自發(fā)的動(dòng)力。”

            不過,太大的性格差異最終也會(huì)產(chǎn)生問題,

            “羅梅洛想要建立一個(gè)帝國,而我只想安靜的寫程序。”許多年以后,當(dāng)卡馬克回憶他與羅梅洛的分離時(shí),他這樣說道。

             

            我們所看到的,所傳誦的,永遠(yuǎn)只是天才的故事。

            自己不是羅梅洛,當(dāng)然不敢奢望能與卡馬克這樣的天才合作。

            自己也不是卡馬克,于是也找不到羅梅洛這樣的偉大設(shè)計(jì)師。

            但是,在尋找搭檔的時(shí)候,一個(gè)與自己能夠優(yōu)勢互補(bǔ)的人會(huì)更合適。

            另外,性格上有一些差異也能讓團(tuán)隊(duì)未來不至于走向一個(gè)死胡同,至于最終的決裂,這個(gè)可以進(jìn)行控制。

            一定會(huì)有挫折:

            與所有充滿激情的創(chuàng)業(yè)團(tuán)隊(duì)一樣,他們的第一次也遭遇了挫折。當(dāng)他們借用公司的機(jī)器,經(jīng)過幾個(gè)周末的通宵努力,把PC版的馬里奧寄給任天堂時(shí),得到的答復(fù)卻是:小伙子們,干的不錯(cuò),但我們對(duì)PC機(jī)沒有任何興趣。

             

            沒關(guān)系,機(jī)會(huì)一定會(huì)降臨到那些有所準(zhǔn)備的人身上。

            雖然任天堂拒絕了這幾個(gè)天才小子的熱情,但終有人能看出這群天才們的價(jià)值。

            米勒主動(dòng)聯(lián)系上了羅梅洛,并向他展示了共享軟件市場的美好前景,并且給羅梅洛開出了35%的高比例分成,而且還提前為他們支付了訂金。

            把游戲按照共享軟件的模式去賣,先出一個(gè)免費(fèi)的關(guān)卡,如果還想繼續(xù)玩后面的內(nèi)容,那么,付錢。這種模式在現(xiàn)在仍然還流行著。

            由此,繼續(xù)在周末借用著公司的電腦,指揮官基恩誕生了,這是他們的第一筆收入。

            當(dāng)然,在他們“借”用公司電腦的同時(shí),他們也沒有忘了給公司做一些東西,以對(duì)得起拿的薪水,還有不引起老板的注意。也在此時(shí),第一次出現(xiàn)了有人離開,雷恩,已經(jīng)多次掉隊(duì)的成員,羅梅洛沒有顯示更多的寬容。

            當(dāng)指揮官基恩上市以后,ID每月的收入為一萬到兩萬美元,這是在1991年,而那一年,卡馬克二十歲,羅梅洛二十三。

            最終,ID有了三位創(chuàng)始人:羅梅洛,卡馬克和艾德里安。

            在遇到重大選擇的時(shí)候,每個(gè)人都有自己的出發(fā)點(diǎn),自己的判斷標(biāo)準(zhǔn),應(yīng)該尊重這些不同之處。雖然湯姆和杰伊一開始沒有走出來,但他們?nèi)匀皇桥笥眩芎玫呐笥眩總€(gè)周末仍會(huì)來ID玩玩龍與地下城。以后的日子里,他們還會(huì)走到一起。

             

            培養(yǎng)出默契:

            在ID正式成立后的第一個(gè)項(xiàng)目,德軍總部3D開發(fā)的日子里,卡馬克與羅梅洛的默契正式開始建立。

            “卡馬克不是一個(gè)多愁善感的人,他的記憶里沒有多少感情方面的東西,但他記住了這個(gè)畫面,記住了這不同尋常的一刻,以后的日子里,他愿意回想起:在一個(gè)暴雨滂沱的夜晚,羅梅洛淌過齊腰深的河水,只為了趕回來工作”

            搭檔之間的默契,正是通過這樣的小事,通過并肩作戰(zhàn)培養(yǎng)出來的。

            當(dāng)然,默契也不代表任何時(shí)候都能夠統(tǒng)一。

            在制作德軍總部3D的過程中,ID的人第一次在游戲設(shè)計(jì)上發(fā)生了的分歧。湯姆試圖游說卡馬克給場景中添加可以縮進(jìn)去的墻,而卡馬克以破壞軟件設(shè)計(jì)為由拒絕添加。當(dāng)羅梅洛也試圖再次說服時(shí),卡馬克的回應(yīng)是:這件事提都不用提!

            是的,在ID這樣的夢幻團(tuán)隊(duì)里,在天才程序員卡馬克那里,依然也有程序員不能做,或者不愿意做的事。程序員都是固執(zhí)的,有時(shí)候帶有很明顯的偏見。

            不過,如果你能讓他自己認(rèn)識(shí)到這事是應(yīng)該做的,他也很樂于被你說服。最終,卡馬克在某個(gè)晚上主動(dòng)做好了一個(gè)可以縮進(jìn)去的墻。

             

            讓合適的人做合適的事:

            在指揮官基恩占據(jù)共享軟件排行榜首位一年之后,瑞恩來到了ID,并告訴他們,卡馬克的技術(shù)在業(yè)界是首屈一指的,公司應(yīng)該有人來徹底發(fā)掘這技術(shù)的價(jià)值。最終,瑞恩成為了ID的經(jīng)理。

            讓合適的人做合適的事。

            王牌程序員羅梅洛雖然是一個(gè)充滿激情的多面手,但他最在行的還是游戲業(yè)務(wù),還是設(shè)計(jì)師,還是程序員,關(guān)于怎么打理生意,當(dāng)然需要更合適的人。

            卡馬克,永遠(yuǎn)只愛寫他的程序,永遠(yuǎn)不在意生意那攤子爛事。

            湯姆,這時(shí)湯姆終于加入了進(jìn)來,他那源源不斷的奇思妙想,使其當(dāng)之無愧的成為了ID的主設(shè)計(jì)師。他也有他最重要的事要做。

            所以,找一個(gè)CEO,ID不止一次找過CEO。

            “就像所有藝術(shù)家和程序員一樣,他們不喜歡為生意上的事情煩心,他們更樂于專注于自己的領(lǐng)域。而且,他們?cè)酵度胗螒蛑谱鳎麄兙驮絽挓┠切┒逊e如山的例行公事。公司需要有個(gè)新的負(fù)責(zé)人,這次,他們又主動(dòng)去給自己找CEO了。他們的老朋友,杰伊,以5%的股分加入了ID。”

            理性人的思考應(yīng)該是以利益最大化為目標(biāo),讓合適的人做合適的事顯然能讓利益最大化。

            當(dāng)然,每一個(gè)有心做事的人,或多或少的都有一些野心,有那么一些控制欲,如何協(xié)調(diào)好這個(gè)關(guān)系,需要費(fèi)點(diǎn)心思。

             

            每個(gè)人都是舵手:

            指揮官基恩,出自湯姆的設(shè)計(jì),包括故事的背景,人物的形象,還有那些游戲特性。這時(shí),卡馬克與羅梅洛忠實(shí)的做著手術(shù)師:程序員,讓湯姆的奇思妙想得以實(shí)現(xiàn)。

            而下一次,ID的舵手轉(zhuǎn)移到了羅梅洛身上。

            德軍總部3D,可以說是早期主視角3D游戲的最有影響力的代表作之一,這一切的靈感都來自于羅梅洛,而這天才的實(shí)現(xiàn)則出自卡馬克,在這個(gè)最激動(dòng)人心的時(shí)刻,他們只有四個(gè)人,羅梅洛,卡馬克,湯姆和艾德里安。是的,很多名字已經(jīng)成為了歷史。

            德軍總部3D的巨大成功讓ID正式獨(dú)立出來,成為一家完全獨(dú)立的工作室,自己負(fù)責(zé)從開發(fā)到發(fā)行的所有事務(wù)。但工作室成員還是那么幾位。

            到下一次,DOOM的時(shí)代,公司的重心轉(zhuǎn)到了卡馬克。

            每一個(gè)游戲制作人大概都會(huì)有一個(gè)理想中最完美的游戲,讓每個(gè)人都能實(shí)現(xiàn)自己的理想也許不大現(xiàn)實(shí),但是,讓每個(gè)人都能充當(dāng)一回舵手,帶著大家向自己指引的方向前進(jìn)一段時(shí)間,這將會(huì)讓每個(gè)人都覺得自己的人生更有意義。

            但是,每個(gè)人做事的風(fēng)格不一樣,這里面也會(huì)有問題。

            卡馬克的固執(zhí)會(huì)把主設(shè)計(jì)師的設(shè)計(jì)文檔罵得一無是處:“游戲的故事背景,就好比色情片里的情節(jié),雖然要有,但根本不是關(guān)鍵”,也可以隨意更改目標(biāo),讓湯姆的設(shè)計(jì)文檔變成廢紙。

            但是,羅梅洛卻能很好的找到自己的位置,充分發(fā)揮著天才程序員創(chuàng)造出來的東西,試驗(yàn)著新引擎的特性,挖掘其潛能。

            終于,沒過多久,卡馬克向羅梅洛建議解雇湯姆,這意味著,公司將第一次出現(xiàn)創(chuàng)始人的離開。

            一個(gè)合理的保護(hù)制度:

            早在ID成立之初,他們就坐在一起討論過,所有人都誠心地同意,ID的命運(yùn),而不是他們?nèi)魏稳说拿\(yùn),才是最重要的。無謂的內(nèi)耗會(huì)給公司帶來多么致命的傷害,他們不希望ID毀于這樣的事情。

            他們達(dá)成兩點(diǎn)協(xié)議:首先,解雇一個(gè)持股人需要公司其他持股人的一致同意,那時(shí),艾德里安,羅梅洛,湯姆,卡馬克是最主要的持股人,凱文和杰伊也有少量股分。其次,一旦被解雇,這個(gè)人就失去他所有的股分,公司的未來和他再?zèng)]有任何關(guān)系。

            羅梅洛希望能再給湯姆一次機(jī)會(huì),他說服了卡馬克。可是,沒有人再能忍受湯姆,所有人都要求馬上解雇湯姆。羅梅洛只好同意。

            在全體持股人付方上,湯姆走進(jìn)去的時(shí)候,大家都低頭坐在桌邊。卡馬克開口說到,公司顯然不能再這樣下去了,我們要求你離職。

            湯姆的離開需要一個(gè)繼任者,37歲的桑迪來到了ID。他接手羅梅洛的事,成了ID的游戲設(shè)計(jì)師,羅梅洛又回到了程序員,兼音效師,兼打理生意。

             

            什么時(shí)候能夠收手:

            DOOM的成功讓ID成就了事業(yè)上的輝煌,但也造成了羅梅洛與卡馬克的分離。羅梅洛不僅想把公司做大,他還有其他動(dòng)機(jī),樂趣。羅梅洛熱愛游戲,他活著就是為了玩游戲,他現(xiàn)在的生活就是DOOM的世界。

            卡馬克看著屏幕上閃爍的光標(biāo),沉默不語。曾經(jīng)有多少個(gè)夜晚,羅梅洛就坐在他身邊,和他一起完善引擎,和他一起調(diào)試排錯(cuò),直到東方漸白。今夜,卡馬克目送著那印有“制作者”的背影消失在門口。

            創(chuàng)業(yè)什么時(shí)候是個(gè)頭,什么時(shí)候能夠坐享成果。畢竟這么努力是為了有更好的生活,不是每個(gè)人都能做苦行僧,當(dāng)團(tuán)隊(duì)有了一定的成果時(shí),應(yīng)該允許大家選擇新的生活方式,不應(yīng)該太過于苛責(zé)。

            在羅梅洛離開ID后曾經(jīng)評(píng)價(jià)過卡馬克,說他是苦行僧。雖然這時(shí)他的言論帶有一些偏見,但也能反應(yīng)一些事實(shí)。

            “在公司有錢以后,依然把公司弄的非常簡陋,依然不懂得享受,還是日夜達(dá)旦的在那里寫他的程序,最要命的是,依然還要求別人也如他一樣。”

            應(yīng)該清楚,辛苦努力的目標(biāo)是什么。

            不是每個(gè)人都能讓自己的一生滿是辛苦,我想,大多數(shù)人愿意這么辛苦的根本目的還是希望能夠在不久的將來不需要再辛苦,所以,什么時(shí)候收手,這也是值得討論的。

             

            分開不一定是壞事:

            在羅梅洛忙于死亡競賽的時(shí)候,卡以克為ID擴(kuò)充了兩位新人:圖形學(xué)泰斗亞伯拉什和關(guān)卡設(shè)計(jì)師麥基。

            卡馬克的苛責(zé)終于讓設(shè)計(jì)師們不堪忍受,羅梅洛撥通了好朋友湯姆的電話,打算創(chuàng)立一家以設(shè)計(jì)為主導(dǎo)的公司。麥基,也不再是神童麥基,而是孤獨(dú)者麥基。

            Quake剛結(jié)束,羅梅洛在ID的日子即將結(jié)束,卡馬克覺得他沒有盡到他的工作。雖然艾德里安試圖反對(duì),但誰讓卡馬克才是ID的價(jià)值核心呢。如果卡馬克離開,那么ID將不復(fù)存在。

             

            卡馬克與羅梅洛之間的分歧太大了,對(duì)于什么是制作游戲以及游戲應(yīng)該如何制作,他們都有各自的觀點(diǎn);卡馬克認(rèn)為羅梅洛已不再是程序員,羅梅洛認(rèn)為卡馬克不再是玩家;卡馬克只想有一個(gè)小公司,而羅梅洛想做大。

            當(dāng)卡馬克看著羅梅洛毅然轉(zhuǎn)身離去時(shí),他沒有看到一絲留戀或悲傷,相反,他覺得這對(duì)羅梅洛是一種解脫。卡馬克相, 羅梅洛又踏上了新的征程。

            也許,每個(gè)人都有他自己對(duì)未來的期望,每個(gè)人都有他對(duì)如何做好一件事的看法,不一定能夠獲得完全的認(rèn)同,求同存異,當(dāng)差異實(shí)在太大時(shí),分開其實(shí)對(duì)每個(gè)人都是最好的選擇。

            兩天后,羅梅洛在ID的辦公室告訴世界,我已決定離開ID軟件,成立一家有著不同目標(biāo)的游戲公司,我不會(huì)從ID帶走任何人。

            第二天,卡馬克更新了他的日志,羅梅洛已離開ID,我會(huì)竭盡全力。

            一場死亡競賽曲終人散。

            posted @ 2010-04-21 22:50 白云哥 閱讀(501) | 評(píng)論 (1)編輯 收藏

            2010年4月19日

            如何處理好合伙之之間的關(guān)系

            Dharmesh Shah的文章原文我沒有找到,不過GameLook上的幾點(diǎn)精華歸納也足夠了,很值得參考。另外,這篇文章再次提到了合伙人章程這本書,可惜dangdang上依然缺貨 :(

            游戲目前已經(jīng)不是個(gè)人英雄能夠全盤搞定的項(xiàng)目,所以,合作是必然的。當(dāng)然,如果有足夠的魅力,憑著自己的個(gè)人品牌價(jià)值,或者足夠打動(dòng)投資人的策劃案,直接拉來投資,然后雇傭其他人來干活,這樣就不用考慮創(chuàng)始人合作的問題。但是,對(duì)于絕大多數(shù)的技術(shù)創(chuàng)業(yè)人員來說,這還不是那么的靠譜,還是需要與合伙人一道從零開始努力。

            合伙人之間面臨的第一個(gè)問題,也是最重要,最根本的問題是如何分配利益。

            當(dāng)然,你可以很容易的說,根據(jù)付出來分配收益。可事實(shí)上,這個(gè)的可操作性并不強(qiáng),付出如何衡量,每個(gè)人的重要性如何界定,這都是很難量化評(píng)價(jià)的。很多時(shí)候,這大概也只能靠大家來協(xié)調(diào),來讓每個(gè)人都能基本滿意吧。或者,有那么一兩個(gè)有魅力的合伙人,來給大家算上一筆明白賬,并且讓大家能夠相信這個(gè)未來確實(shí)是美好的。

            至少,很多人的建議都是,平均分配不是一個(gè)好主意。

            如何分配利益,我有過一個(gè)粗淺的想法。

            每個(gè)有意合作的人,拿出一個(gè)對(duì)未來三年后的最低利益期望,這個(gè)期望值要比自己在目前工作情況下,所能獲得的最大收益要高,具體高多少那就是自己的預(yù)期,另外再有一個(gè)稍高一些的期望值。我想,如果是誠心合作做事的人,這個(gè)期望值的提出不會(huì)太離譜。我也認(rèn)為,有可能在這些人的期望值之間獲得一個(gè)平衡。當(dāng)然,這需要協(xié)調(diào)者做比較大的努力,也許在這個(gè)過程中會(huì)有人因?yàn)椴粷M意而退出,但從一開始達(dá)成平衡要比將來再扯皮要好得多。

            第二個(gè)問題,如何做決策的問題。

            先不考慮在引入投資人后的投票權(quán)問題,單單只說合伙人之間。最樂觀的期望是讓每個(gè)人都能參與到?jīng)Q策的過程中來,讓每個(gè)人都真切的感受到自己在創(chuàng)業(yè)的核心里。但實(shí)際上,這實(shí)行起來可能也是不大可能,或者效率會(huì)很低下,或者引發(fā)的矛盾會(huì)更多。

            也許,一兩個(gè)強(qiáng)有力的決策者能讓這個(gè)過程更順暢,但是,這個(gè)決策絕對(duì)不能影響到其他每個(gè)人的利益。

            也許,找對(duì)了人,這并不會(huì)是多大的一個(gè)問題。

            然后是成員離開的問題。

            看到這一點(diǎn),我又想起了DOOM啟示錄。這本書也是一本好書,我認(rèn)真的翻過兩遍。如果失去了做游戲的激情,那就看看這本書吧。看看那一伙充滿激情的年輕人是怎樣走到一起,怎樣通力合作,怎樣創(chuàng)造出一個(gè)又一個(gè)奇跡,當(dāng)然,也要看看最終他們是遇到了怎樣的問題而不得不分道揚(yáng)鑣的故事。

            對(duì)于每一個(gè)合伙人,即使有一天不能再一起合作,不能同時(shí)走到最后,那也依然還是非常好的朋友。至少,當(dāng)初是因?yàn)橄嗷バ湃危泄餐睦硐肱c目標(biāo)才走到一起的。羅梅洛和卡馬克在很多年后不也還是共同走進(jìn)了那個(gè)會(huì)場么。當(dāng)然,這個(gè)期望也可能太過于理想化,看看業(yè)內(nèi)的情況大概就能知道,一旦離開,基本就成了對(duì)手,這還是比較好的情況。不過,期望總是美好的。

            如果真的很不幸,有人必須要離開,不管是出于怎樣的原因,主動(dòng)的還是被動(dòng)的,當(dāng)然要保證留下來的人和留下來的項(xiàng)目不受損害。不論離開的這個(gè)人是誰。羅梅洛從id的離開其實(shí)也是很友好的,甚至可以說是多贏的。這種方法也未嘗不可以借鑒。

            有關(guān)每個(gè)人投入的問題。

            這個(gè)可能會(huì)比較棘手一些。尤其是當(dāng)合伙人中有人面臨比較大的生活壓力時(shí),比如有家族,有小孩。這個(gè)又涉及到另外一個(gè)問題,什么樣的人適合創(chuàng)業(yè)的問題。

            并不是每一個(gè)想法的實(shí)現(xiàn)都能一帆風(fēng)順,也許這個(gè)努力奮斗的過程會(huì)相當(dāng)艱難,也許在很長的一段時(shí)間里大家都只能靠在別的地方打工來生活,這時(shí),如何去衡量每個(gè)人的付出,如何去評(píng)價(jià)每個(gè)人有多投入,會(huì)是一個(gè)更大的問題。也許,這還會(huì)給未來的利益分配埋下爭執(zhí)隱患,也許,這也會(huì)成為一些人離開的直接或間接原因。但是,這也可能是一部分創(chuàng)業(yè)團(tuán)隊(duì)的必經(jīng)之路吧。

            posted @ 2010-04-19 00:46 白云哥 閱讀(559) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題  下一頁

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            相冊(cè)

            我的鏈接

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            草草久久久无码国产专区| 亚洲乱码日产精品a级毛片久久| 亚洲精品乱码久久久久久蜜桃不卡 | 伊人久久亚洲综合影院| 久久久久久久久久久久久久 | 性做久久久久久免费观看 | 一本伊大人香蕉久久网手机| 久久综合九色欧美综合狠狠 | 国产Av激情久久无码天堂| 激情五月综合综合久久69| 日韩精品久久久久久免费| 九九久久精品无码专区| 亚洲AV日韩精品久久久久| 美女久久久久久| 久久中文娱乐网| 亚洲精品国产美女久久久| 国产—久久香蕉国产线看观看| 亚洲狠狠婷婷综合久久蜜芽| 久久99热这里只有精品国产| 狠狠88综合久久久久综合网| 久久人人爽人人人人爽AV| 久久高潮一级毛片免费| 国产午夜精品理论片久久影视| 久久久久久久波多野结衣高潮| 久久久精品人妻无码专区不卡 | 久久99国产精品久久99| 无码日韩人妻精品久久蜜桃| 欧美成a人片免费看久久| 久久久综合九色合综国产| 久久久久亚洲AV无码永不| 久久精品国产亚洲av麻豆图片| 色综合久久久久综合99| 精品无码久久久久久久久久| 国产成人AV综合久久| 久久99精品国产99久久| 久久精品www人人爽人人| 亚洲国产另类久久久精品 | 久久99精品久久久久久不卡| 久久久久久久综合日本亚洲| 久久亚洲综合色一区二区三区| 精品国产福利久久久|