雲風的 BLOG: sproto 的預設值處理
sproto 由於主要供 lua 使用,是不能在協議定義中描述預設值的。所有不編碼的欄位都呈現為 lua 中的 nil 。
注:這裡還有個實現上的小問題。如果一個數組為空,也會呈現為 nil 而不是空表,所以應當注意處理。
我最近給 sproto 增加了一個新的 api ,可以為一類訊息生成一個全部為預設值的 table 。這樣,使用者就可以方便把這個 table 作為別的 table 的 metatable 中的 index 方法了。相當於實現了原來在 protobuf 中的預設值的特性。
只不過,預設值不能主動定義。所有的 integer 預設為 0 、boolean 預設為 false 、string 預設為空串、子型別為空表,並附加有一項 __type
相關推薦
雲風的 BLOG: sproto 的預設值處理
sproto 由於主要供 lua 使用,是不能在協議定義中描述預設值的。所有不編碼的欄位都呈現為 lua 中的 nil 。 注:這裡還有個實現上的小問題。如果一個數組為空,也會呈現為 nil 而不是空表,所以應當注意處理。 我最近給 sprot
[java]JAXB解析XML時預設值處理
package test.xml; import java.io.StringReader; import javax.xml.bind.JAXBContext; import javax.xml
Python函式引數預設值的陷阱和原理深究 • cenalulu's Tech Blog
本文將介紹使用mutable物件作為Python函式引數預設值潛在的危害,以及其實現原理和設計目的 陷阱重現 我們就用實際的舉例來演示我們今天所要討論的主要內容。 下面一段程式碼定義了一個名為generate_new_list_with的函式。該函式的本意是在每次呼叫時都新建一個包含有給
雲風的 BLOG: Skynet 1.2.0
今天我釋出了 skynet 1.2.0。 距離上次釋出 1.1.0 已經有一年了。雖然我覺得給 skynet github 倉庫裡某個特定版本起個有意義的名字並無太大意義,因為我也不會刻意去維護一個所謂穩定版。但在 issues 中還是發現有一些
雲風的 BLOG: 給 skynet 增加網路統計
這些資料通過系統的 netstat 指令也可以查到,但是由 skynet 提供,可以查到更多細節:最關鍵的內部資訊是一個 socket 被繫結在 skynet 的哪個內部服務上,這是系統的 netstat 無法提供的資訊。 在設計獲取統計資訊
雲風的 BLOG: 判斷點是否在三角形內的演算法精度問題
我看了一下原始碼,把這個函式提出來,改寫了一點點,方便獨立測試。 #include <stdio.h> // #define float double static float dtVdot2D(const float v0[3]
雲風的 BLOG: Lua GC 的原始碼剖析 (1)
/* ** Union of all Lua values */ typedef union { GCObject *gc; void *p; lua_Number n; int b; } Value; /* ** Tagge
雲風的 BLOG: Lua 虛擬機器的封裝
我們面臨的需求是:建立一個(或幾個)Lua 虛擬機器,定期驅動它執行。重點在,定期驅動它執行。這可視為向虛擬機發送訊息,虛擬機器本質上是訊息驅動的(其實 Windows 程式也是)。通常,有一個時鐘驅動的行為,或者有一個渲染幀驅動的行為;然後,有外
雲風的 BLOG: 動作遊戲中的擊打判定
即使現在用 3d 技術來渲染,大多數格鬥遊戲依然可以歸到 2d 格鬥型別中,還是可以用這種方法來做的。比如最新的 Street Fighter 5 ,完全延續了平面 AABB 攻擊盒的規則。在網上甚至可以找到工具 顯示出攻擊盒,幫助玩家訓練,提高技
雲風的 BLOG: lockstep 網路遊戲同步方案
首先,我認為把 lockstep 翻譯成幀同步,還有與之對應的所謂“狀態同步” (我在多次面試中聽過這個名詞),都是對同步演算法的錯誤理解造成的。把自己所理解的演算法牽強附會到已有的在歐美遊戲先行者中經過實踐的方案上。 btw, 前幾天和幾位做區
雲風的 BLOG: 3d engine 專案招聘
我們的 3d engine 專案從 2018 年 1 月底開始,已經過去 10 個月了。比原計劃慢,但是進度還可以接受。目前已經大致完成了執行時的基礎渲染框架(基於 ecs 模式),整合了 bullet 物理引擎,開發了一個基於網路的虛擬檔案系統,
雲風的 BLOG: Lua 的多執行緒支援
這些個方案都允許使用者在不同的虛擬機器間相互呼叫函式,大約是利用在虛擬機器間同步函式的位元組碼和 upvalue 實現的。基於這些執行緒庫的程式,用起來和別的支援多執行緒的語言(比如 Golang)那樣沒有太大區別。 但我不喜歡這種多執行緒解決方
雲風的 BLOG: 用 2d 縮放及斜切變換模擬斜視角下的旋轉
我對牆壁的旋轉很感興趣,一開始以為是預渲染了若干張圖。後來試著解開了 .kwad 資源包(可自行 google 到工具)發現裡面的資源圖片只有一或兩張。ps. 圖片是用 zlib 壓縮過的 RGBA 點陣圖,格式也可以 google 到。 以門為
雲風的 BLOG: 虛擬檔案系統的自舉
首先我不想做的太複雜。我們不需要特別彈性的不同檔案系統模組掛接到虛擬檔案系統的不同目錄上的功能。所以我寫死了一個叫 .firmware 的目錄,專門存放用來自舉所需的基礎程式碼(的備用版本)。這塊程式碼在啟動後可以在網路模組載入完畢後,用新的版本覆
雲風的 BLOG: Lua C API 的正確用法
當 lua 發生了未捕獲的異常時,會呼叫 panic 函式,然後呼叫 abort() 退出程序。一個補救的方法是在框架的最外層設定一個恢復點:C 語言用 setjmp ,C++ 用 try catch 。在 lua_atpanic 設定的 pani
雲風的 BLOG: Lua GC 的原始碼剖析 (2)
lua 的 GC 分為五個大的階段。GC 處於哪個階段(程式碼中被稱為狀態),依據的是 global_State 中的 gcstate 域。狀態以巨集形式定義在 lgc.h 的 14 行。 /* ** Possible states of th
雲風的 BLOG: Lua GC 的工作原理
幾乎所有現代程式語言都有自動化記憶體管理設施,在記憶體不再使用的時候,能夠自動釋放它們。有兩種方法可以做到這點,一是引用計數,二是垃圾收集。引用計數有迴圈引用無法將不再使用的物件引用減到零的問題,但這並不是 Lua 選擇垃圾收集方法的主要原因。主要
雲風的 BLOG: 《我的程式設計感悟》 Archives
我有一個忘記從哪繼承來的觀點:無論我們想學什麼,都應該從學習他的歷史開始。極端點說,無論學什麼,都是在學他的歷史。 前幾天在北京見到了我的小表妹,她剛上初一,人極為聰明。七年前我在北京工作時,她還沒有上小學。那個時候我就回答過她許多科普問題。一個
雲風的 BLOG: 伺服器排隊系統的一點想法
遊戲系統需要估計自己的環境大約可以支援一定時間段多少人可以進入。這個用來估算每個新使用者的大致等待時間。 遊戲系統採用一個以時間為演算因子的序列 key ,用來做進入的驗證。只有持有這個 key 的使用者才認為是經過排隊的。允許進入。 排隊伺服
雲風的 BLOG: 遊戲資源倉庫及升級釋出
這次實現,我們去掉了目錄和檔案處理方式上的差異,一律都變成了以其內容的 hash 值為檔名(key)的資料塊。倉庫僅僅是一個 key-value 的資料倉庫,以內容 hash (選用了 sha1 演算法)為檔名放在倉庫目錄下。為了避免單個目錄檔案太