• <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>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            #

            近期在寫基于go的游戲服務器框架, 在全面脫離C/C++前, 需要對老架構進行一個總結

            基于C/C++游戲服務器框架總體設計的還是不錯的, 兄弟們總體使用效果都是好評. 因為在技術上喜歡"偷懶", 所以在很多設計上, 都是力求簡單, 高效(開發效率).

            基于任務的異步DB查詢系統, 帶多重異步的同步

            代碼示例:

               1:   
               2:  void BatchQueryPlayerInfo( uint32 ClientID, const std::string& AccountName, int64 CharID )
               3:  {
               4:      GDBExecutor->Commit
               5:          (    
               6:          dynamic_cast<DBDataTask*>( (new DBQueryCharInfo(  ClientID, CharID ) ) 
               7:          ->LinkAtomTask( new DBQueryQuest( ClientID, CharID ) )
               8:          ->LinkAtomTask( new DBQuerySkill( ClientID, CharID ) )
               9:          ->LinkAtomTask( new DBQueryHero( ClientID, CharID ) )
              10:          ->LinkAtomTask( new DBQueryAccountInfo( ClientID, AccountName ) )
              11:          ->LinkAtomTask( new DBQueryEquip( ClientID, CharID ) )
              12:          ->LinkAtomTask( new DBQueryObject( ClientID ,CharID ) )
              13:          ->LinkAtomTask( new DBQueryLevel(ClientID, CharID))
              14:          ->LinkAtomTask( new DBQueryChapter(ClientID, CharID))
              15:          ->LinkAtomTask( new DBQueryActivity( ClientID, CharID ))
              16:          )
              17:          );
              18:   
              19:  }

            這段主要處理玩家在登陸時, 需要從DB查詢大量的不同分類的數據. 為了保證效率, 我讓每個Task并行執行, 然后通過一個機制, 讓所有任務完成后, 回調第一個任務的一個函數. 這樣就無需手動實現很多粘合代碼, 避免了反復調試和錯誤

            基于protobuf反射機制的語句自動合成

               1:  DBUpdateCharInfo::DBUpdateCharInfo( int64 CharID, const std::string& Buffer )
               2:  {
               3:      char buffer[256];
               4:   
               5:      sprintf( buffer, "update tb_char set $FIELD$ where charid = %lld;", CharID );
               6:          
               7:      ExecuteCommand( buffer, Buffer, dbopr::FET_Equation );
               8:  }

            這段就是一個典型的DB任務, 構造函數提供了CharID和一個由結構體序列化好的buffer, $FIELD$字段, 是通過反射根據Buffer內容, 自動填充字段

            這段例子中, $FIELD$可以填充為 hp=100, mp=100之類的. 自動填充避免了因為添加字段的到處添加代碼, 還需要調試, 容易搞錯

             

            配置系統概念

            基于同一個配置系統, 分層實現不同的需求. 更簡單的說, 解決的1個實際問題是:

            自己改了配置文件中的ip, 上傳svn后, 覆蓋了別人的配置, 很多人的解決方法都是, 本地配置不提交. 但同時問題又來了:

            當配置中有別人新加的系統配置, 怎么保證每個人都能更新到?

            上線后, 服務器交付運維, 他們會對配置有一定程度的修改, 這個時候怎么合并程序配置和運維配置?

            其實對于沖突的需求, 只要對系統進行分層就可以解決問題,我的處理方式:

            配置分為:

            全局配置: 所有服務的總體配置

            單服務配置: 本服務的配置, 涉及網絡及邏輯

            本地配置: 這個配置每個人一份, 不上傳SVN

            命令行配置: 格式和前面的一致, 這塊就可以通過運維進行配置

            總體結構其實就是OO的派生概念, 下層可以覆蓋, 修改上層的配置

             

            服務器互聯及識別框架

            基本功能: 基于一些簡單的配置就可以將多臺服務器, 同種類的不同服務器互相連接起來, 斷線自動重連.

            服務器連接后, 所有服務器可知曉并可自動按需連接

            邏輯端也很方便的進行廣播或者單獨發送等

            也就是說, 每個服務器的連接和接受端都是帶識別名稱或id的.

            后面覺得這套東西實在是做的復雜, 多整出一臺中心服務器來做. 但好歹框架穩定下來了, 也就好了.

             

            基于lua的服務器web后臺框架

            思想是很不錯的,  C++ 配合lua本身絕對是個失敗

            問題出在web處理,本身都是一個同步阻塞過程, 而這個后臺框架是異步方式來做, 所以特別別扭

            不過比起以前的本地GM系統, 這塊的設計是偉大的進步

             

            現在正在設計基于golang的服務器框架, 基本框架已經完工, 等待編寫邏輯后的實戰測試

            以上的很多思想在golang的服務器框架都有改進, 特別是golang本身做web也是優秀的, 外加martini這種牛X框架, 更是水到渠成

            如果你對服務器框架設計有特別的認識, 或者想碰撞思想, 可以加博客群 309800774或者我的qq: 20998333討論

            posted @ 2014-12-18 16:39 戰魂小筑 閱讀(8585) | 評論 (1)編輯 收藏

            推薦一個適用于Visual Studio2013/11的Google protobuf的proto文件高亮插件, 上圖

            image

            雖然沒有Eclipse插件的自動生成序號功能, 但已經很漂亮了, 還自帶有protobuf關鍵字提醒, 很不錯
            地址: https://visualstudiogallery.msdn.microsoft.com/4bc0f38c-b058-4e05-ae38-155e053c19c5

            posted @ 2014-12-16 14:06 戰魂小筑 閱讀(3045) | 評論 (0)編輯 收藏

            LiteIDE中有一個get按鈕可以模擬go get –v 的操作

            image

            但默認因為找不到git而報錯。 解決方法如下:

            http://git-scm.com/downloads下載對應平臺git

            在LiteIDE的查看->編輯環境變量中, 修改PATH, 加入git路徑。例如

            PATH=c:\mingw64\bin;%GOROOT%\bin;c:\Program Files (x86)\Git\bin;%PATH%

            再按下Get鍵, 第三方包就會自動更新了

            posted @ 2014-11-27 17:19 戰魂小筑 閱讀(5108) | 評論 (2)編輯 收藏

            Unity3D引擎開發2D游戲的介紹很少, 本文以筆記方式進行介紹

             

            工程參數設置

            image

            在創建時, 記得將最下邊的模式設為2D模式

            攝像機參數設置

            image

            這里需要設定的項:

            Z設為-10, 如果設為0, 將不可見物體

            ClearFlags設為純色, 因為是2D游戲, 所以無需默認參數的天空盒

            Projection設為正交投影(Orthographic), 這是相對于3D的透視投影的

            Size根據你的設計期分辨率的半高度來設定.比如設計期, 我們以iPhone4的分辨率(960*640)為設計分辨率, 那么Size就設為640/2=320

             

            精靈幀的導出

            U3D原生支持對紋理Atlas的切片以制作精靈幀, 是通過SpritePacker來做的, 不過介于TexturePacker的強大合并及紋理分布優化, 這里我們還是以TexturePacker來做例子.

            TexturePacker 官方網站: https://www.codeandweb.com/texturepacker

            image

            將需要合并Atlas的圖片拉入TexturePacker, 然后參考上圖, 設定描述文件格式為Unity3D. TexturePacker將為我們導出一個png的紋理及一個txt格式的文本. 這個文本內部格式是json, 描述每個精靈幀在原圖Atlas的信息

            設定紋理對應像素尺寸

            image

            點擊導入到U3D的png紋理, 在Inspector中獎Pixels To Units 設定為1

            默認這個值是100, 代表一張100寬100高的紋理在U3D中只有1個單位大小, 設為1后, 就是傳統2D引擎的, 紋理與屏幕分辨率對應模式

            轉載, 請注明http://www.shnenglu.com/sunicdavy 戰魂小筑

            轉換TexturePacker導出格式到Unity3D精靈幀格式

            https://github.com/autolame/TexturePackerExtended下載一個Unity的擴展, 并甩到工程Assets中導入

            image

            在剛才使用TexturePacker導出的txt格式文件上點擊右鍵, 選擇Process to animated Sprites

            這種導出法, 適用于以原始單圖片中, 以圖片正中心為原點的序列幀

            image

            之后, 將Atlas小箭頭展開的序列幀拉到場景中, 就可以預覽動畫了

            posted @ 2014-10-10 22:30 戰魂小筑 閱讀(4137) | 評論 (0)編輯 收藏

            最近看到一個關于vs的lua調試插件, 裝了vs2012試了下, 忍不住發此文總結下lua各種調試工具

            Decoda

                這是現今地球上調試lua5.1最方便的工具, 沒有之一. 強大的注入式調試, 性能極高.支持 掛接進程, 變量展開, 斷點等各種日常所需.

            早期的Decoda是收費工具, 因此質量非常高.

                Decoda現在已經停止開發并開源了, 調試lua5.2會crash. 源代碼可以作為一種技術參考, 很多dll注入修改技術, 灰常牛X

            image

            LuaStudio

               比較優秀的調試工具(因為收費), 可以調試lua5.1/5.2, 界面屬于vs2008類型, 土豪可以考慮買幾套試試

             

            ZeroBrane Studio

            對lua5.1支持較好, 5.2也能調但偶爾還是會crash, 基于遠程調試方式, 所以性能略低.

            RemDebug

            沒有IDE, 純命令行方式調試器, 但因為簡單, 所以可以參考后寫一個自己的程序內建調試器

            Babe Lua

            把這貨放在最后是有原因的, 還記得那句老話: 老外一開源, 我們就有自主研發了, 對的, 這貨一定是參考了Decoda的代碼后搞出個vs的插件來, 雖然不收費, 但是不提下參考對象的行為還是值得批斗的. 這貨在中文博客上說, 不支持掛接到進程(Decoda支持), 不支持64位調試(LuaStudio支持), 調試30~50次偶爾掛1到2次. 哎, 畢竟只是代碼搬運工, 不生產代碼.

            這貨裝上, 能用, 調5.2是不行的, 5.1比Decoda方便點, 畢竟vs支持懸浮顯示變量.

             

            說了那么多, 其實對于lua5.2版本的調試, 還是沒有免費的比較合適的方案, 如果實在想調試, 還是可以參考下RemDebug的原理及lua官方調試文檔, 自己通過c api調用寫一套適合自己的遠程調試工具. 其實沒有多復雜, 但總比不調試的好微笑

            posted @ 2014-09-28 15:19 戰魂小筑 閱讀(15341) | 評論 (7)編輯 收藏

            感謝這位的博客提供的解決方法

            http://www.lszhang.com/topics/git-push-%E6%97%B6%E5%87%BA%E7%8E%B0-remote-fatal-early-eof-%E9%94%99%E8%AF%AF

             

            修改 GIT 的本地 config 文件,在 core 中加入:

            compression = -1

            這里是在clone方處理

            windows git目錄在c:\Program Files (x86)\Git\etc\gitconfig中

             

            其他輔助方法參考http://git.661346.n2.nabble.com/Large-pack-causes-git-clone-failures-what-to-do-td5481488.html

            git repack --max-pack-size=100m -a -d

            posted @ 2014-05-29 14:30 戰魂小筑 閱讀(34257) | 評論 (0)編輯 收藏

            Cocos2dx的作者王哲來到公司給大家做了一場技術答疑會

            以下是我及我們項目組的一些Q&A

            1. Cocos2dx 3.0版本在引擎退出時, 會有內存泄露

            我:本來以為這個在rc1版本中發現的問題會在final版本中解決, 但實際上還是沒有解決. 本人使用的是Windows下的VLD的內存泄露檢測, 多年來這東西一直沒有誤報過, 雖然這個泄露不是很大, 但會干擾在這引擎上開發的邏輯的內存泄露查找

            王哲:Cocos2dx的內存泄露測試是在XCode下進行的, 借助mac平臺的工具來做的, 他說, 雖然操作系統會在進程結束時會自動回收, 但還是會在patch版本解決這個問題.

            2. Cocos2dx 3.0 中的getInstance設計問題

            我:3.0中的singleton是使用自動new的方式來實現的, 對象都是分配在堆上, 而不是棧上. 這種方式的特點就是在singleton為空時, 自動new出來, 從而讓上層保證使用簡單. 但是弊端就是前一個問題說過的, 如果處理不當的話, 會導致內存泄露.

            3.0中的Director在析構時, 會先刪除Configurator的一個配置類, 但是, Renderer在析構時, 又會使用到這個配置類, 調用配置類的單件, 從而導致配置類重新實例化. 之后, 就沒有管理配置類的析構, 所以發生內存泄露. 我嘗試修復這個問題. 但是因為getInstance本身的設計弊端,導致拆東墻補西墻, 東墻又倒掉的問題.

            王哲: 已經發現這個問題, 會在未來版本加以修正

            3. 為什么不自帶更新系統

            王哲: Cocos2dx引擎一開始設計是偏重于渲染器, 所以包括網絡及其他部分都是屬于附屬. 現在開發團隊只有10個人, 所以精力也是有限的

            另外, 每個公司和個人對更新系統的需求都不是一樣的. 不過引擎會在以后版本中的ResourceManager提供一些類似的功能

            4. 幀率控制器

            我: 游戲一般分為固定幀率和可變幀率兩種更新方式. 前者在早期的日本游戲中常見, 后者是3D游戲及后期的游戲中用的比較多. 在U3D中分別使用FixedUpdate和Update兩種方法來實現類似的功能. 但是在Cocos2dx中沒有實現類似的功能.

            王哲: Cocos2dx里因為要處理一些復雜的情況, 比如接聽電話之類的, 所以這里仍然使用可變幀率來做.

            我: 虛幻里有一套更新算法, 在幀率足時, 擊中處理一些垃圾回收, 內存釋放等耗時操作. 但是超過預設的閥值后, 停止占用幀更新時間, 留給邏輯足夠的更新時間. 但是沒看到Cocos2dx內使用這種算法

            (其實王哲應該沒聽懂我說的意思)

            王哲: 我嘗試在3.0的渲染器中支持多線程, 但是在某些情況會出現crash, 而且這種技術的加入會提高引擎的門檻, 所以未來會根據實際需要加入.

            5. 為什么不統一setResourceRootPath/setResourceDirectory 的接口?

            這是我們項目的一個兄弟做下載更新時, 碰到的2.0中的一個問題. 王哲表示3.0已經做了1年半, 2.0的東西都忘記了, 但是在3.0中是統一的接口.

            6. 如何看待云風噴cocos2dx?

            這是我們項目的一知乎粉提的問題. 王哲說, 云風對C++很反感, 所以自己的代碼及項目大部分都是C. 因此對cocos2dx這種C++引擎肯定會有些反感. 但是cocos2dx的使用率很高, 不能因為一兩個大佬的意見而改變cocos2dx本身的一些優勢

            7. SpriteFrame和紋理的釋放問題, 為什么不使用智能指針?

            王哲: 我做過一個測試, 智能指針在移動設備上跑的速度肯定是要慢于retain/release這種手動方式, 所以依然在3.0中采用retain/release方式.

            我: 我們有某些資源需要常駐內存, 但是全局方式的SpriteFrameCache和TextureCache會導致這個問題很難解決. 能否提供分組資源管理概念

            王哲: 這個修改其實沒什么難度, 論壇里也有很多建議, 我們會考慮在新版本支持這些功能

            8. Scene的接口不統一, 用錯還會crash

            王哲: 這個問題確實存在, 我們會加以修正

            9. 為什么要對STL進行一些包裝, 而不是直接使用?

            王哲: 因為要適用于retain/release模式( 此時, 我終于發現我們為什么會出現第七個問題了)

            10. string為什么需要一種垃圾回收機制來進行回收, 而不是直接用string?

            王哲: 這是一個歷史遺留問題, 為了兼容objc版本的移植及風格

             

            其他的一些信息

            CocoStudio是使用WPF寫的, 底層使用P/Invoke與C++引擎層進行交互. 有人提出這個編輯器要開源么, 作者表示后期會考慮的, 但是因為代碼很亂, 所以一開始沒有考慮開源

            本人感受, 微軟的一切開發工具及代碼的東西都是按商業模式做的, 根本不考慮開發者的利益. DX7到DX11, 說好的COM兼容, 最后改的一塌糊涂. MFC那么老掉牙的東西, 到VS2013都還在更新, 這不是禍害群主么. XNA退不起來, Silverlight干不過Flash. 更別說亂的一塌糊涂的WP, WindowsRT, WinPhone. 對于VisualStudio來說, 這是地球上做的最好的編輯器, 保留這個足矣, 但是也別太依賴即可. 擁抱開源, 珍惜生命, 遠離微軟

            WP版的Cocos2dx支持是微軟設在西雅圖的一個叫OpenTech的公司來做的, 并非王哲團隊做的. 而且DirectX現在變成小眾API, 因此這公司采用AngleProject來用OpenGL模擬DirectX的接口, 當然性能上肯定有很大的損失

            最后附上王哲團隊的照片以鑒真偽

            image

            posted @ 2014-04-25 18:35 戰魂小筑 閱讀(6729) | 評論 (5)編輯 收藏

            lua5.2后, 官方建議大家放棄module/package機制, 這套機制對于使用者來說是方便的, 對于module的編寫者簡直要抓狂, 所有module后的函數對_G均不可見, 還要一個個手動在module前轉成local調用. 相當反人類. 官方建議大家手動實現package機制. 本博客之前有實現過, 參考http://www.shnenglu.com/sunicdavy/archive/2013/12/10/204696.html

            由于要使用protoc-gen-lua, 這東西生成出來的lua依然使用官方的module/package機制. 對于游戲項目來說, 想進行一些自定義讀取, 加密等, 就變得不可能. 幸好官方在擴展上支持的還是不錯的.

            參考lua5.2的官方文檔http://www.lua.org/manual/5.2/manual.html#pdf-require

            require時, lua會自動根據一定的搜索規律找到加載代碼的方法. 這個方法定義在package.searchers這個數組中. 一共有4個加載搜索順序

            1. preload, 對已加載的module進行直接返回, 對應package.preload[modname]

            2. lualoader, 對lua文件進行加載, 搜索路徑為package.path

            3. cloader, 對lua標準dll進行加載, 搜索路徑為package.cpath

            4. croot, 官方文檔說的是all-in-one加載器, 感覺很神奇, 感興趣可以自行參考源碼

            那么, 如果只需要自己的加載器, 只需要這樣做:

              package.searchers[2] = function( name )
                    print("try to load", name )
                end
                package.searchers[3] = nil
                package.searchers[4] = nil
                
                require "libtest"
                只保留preload功能, 然后將第二個加載器換成自己的加載函數, 第三,第四直接屏蔽

            posted @ 2014-04-16 20:29 戰魂小筑 閱讀(7491) | 評論 (0)編輯 收藏

            用慣了hg的便捷, 換做git感覺確實有些不人性化. 但是比起hg分支的反人類,git的強大還是值得我們遷移的

            這里使用TortoiseGit Windows客戶端+Git-1.9.0-preview20140217.   不是使用msysgit, 理論上差異不大

            網上大多數文章都介紹如何和github進行遠程拉取. 我想說, 我們開發客戶端, 用github資源就是個大問題, 還更別說直接開源…

             

            和TortoiseHG一樣, TortoiseGit也有一樣的遠程P2P方式拉取的方法

            只需要在一個代碼庫上右鍵菜單中選取Daemon即可

            image

            這里的提示告訴你, 這樣的拉取無需任何的權限. 其實本地開發, 這不存在, 要的是方便, 所以果斷Proceed

             

            image

            本圖表示, 你已經對外開放了你指定庫的權限

             

            局域網的其他人選擇一個空文件夾, 然后選擇Clone

            image

            注意, 這里有巨大的坑, daemon中只告訴你git://你的IP/  但是實際拉取會出錯. 正確的URL格式必須是

            git://你的IP/.git

            表示訪問的git的目錄!!

            posted @ 2014-04-02 14:17 戰魂小筑 閱讀(10584) | 評論 (0)編輯 收藏

            這里使用的golua版本是https://github.com/aarzilli/golua

            按照作者的安裝方法在天朝行不通的, 原因你懂的

            因此進入這個鏈接, 點擊右邊的Download ZIP下載快照包

            下載好后放到你的GOPATH指定路徑, 整理路徑如下

            github.com\aarzilli\golua\

            其下的目錄如下

            example\
                lua\
                LICENSE
                README.md
                TODO

            然后準備lua5.1的開發包

            lua-5.1.4.tar.gz

            還有2個第三方依賴包

            readline-6.2.tar.gz

            ncurses-5.9.tar.gz

            直接configure –> make install 裝好

             

            go env確認你的GOPATH已經指向你的開發目錄

            golua默認使用cgo進行編譯, 可能會報錯, 修改lua.go的cgo定義如下

            #cgo linux,!llua,!luaa LDFLAGS: -llua -lm –ldl

            進入$GOPATH\src\github.com\aarzilli\golua\lua

            執行go install

            完成

            posted @ 2014-03-18 12:51 戰魂小筑 閱讀(2254) | 評論 (0)編輯 收藏

            僅列出標題
            共26頁: 1 2 3 4 5 6 7 8 9 Last 
            久久久精品国产免大香伊| 97热久久免费频精品99| 精品99久久aaa一级毛片| 久久天堂电影网| 超级碰碰碰碰97久久久久| 久久久久AV综合网成人| 久久久久久噜噜精品免费直播 | 久久久久av无码免费网| 成人国内精品久久久久影院| 久久久久久一区国产精品| 亚洲国产精品无码久久98| 很黄很污的网站久久mimi色| 人妻久久久一区二区三区| 久久艹国产| 免费国产99久久久香蕉| 2021国内精品久久久久久影院| 99久久婷婷免费国产综合精品| 久久久精品国产免大香伊| 99久久精品免费观看国产| 久久99精品久久久久久hb无码 | 国产69精品久久久久777| 热久久最新网站获取| 99久久精品免费国产大片| 91精品国产乱码久久久久久 | 久久久久久亚洲精品成人| 亚洲v国产v天堂a无码久久| 久久精品无码一区二区三区| 精品蜜臀久久久久99网站| 亚洲精品无码专区久久久| 久久久久亚洲AV成人网人人网站 | 久久精品无码午夜福利理论片| 亚洲精品综合久久| 久久久久人妻一区精品果冻| 99久久精品免费看国产一区二区三区 | 亚洲精品无码久久久久AV麻豆| 久久er国产精品免费观看8| 91超碰碰碰碰久久久久久综合| 亚洲一区二区三区日本久久九| 日本精品久久久久中文字幕| 久久精品视频网| 久久亚洲2019中文字幕|