java 的基礎(chǔ)設(shè)施不行。
處理大量小對象以及和 cpp 交互,csharp 可以實現(xiàn)零成本抽象和零成本交互,java 不行。
游戲開發(fā)這個場景需要處理大量的小對象,屬于 java 的七寸但是 csharp 擅長的。java 沒有自定義值類型,這種情況下,要想性能好,得大量的用 float 數(shù)組,面向數(shù)組編程。面向數(shù)組編程,抽象程度就上不去,別扭,本來開發(fā)速度都一般,抽象程度再上不去,這就更難受了。
開發(fā)處理各種大量的小對象這個環(huán)節(jié),不面向數(shù)組編程,保持和 csharp 一樣的抽象粒度,java 性能只有 csharp 的 1/10 - 1/100。圖像處理是和游戲開發(fā)很類似的場景,都是要處理大量的小對象。知乎里有另一個帖子測過 java 下用 class 定義像素來做圖像處理,和 csharp 近乎兩個數(shù)量級的性能差距。所以你看開源的各種圖像處理代碼,java 的都只能在數(shù)組上開干,而 csharp 就可以用自定義值類型抽象出像素,用span抽象出行,這個抽象是零成本的。
還有跟引擎和其它底層庫的交互,dognet 的話 fixed 一下,直接把指針傳給引擎,不需要拷貝數(shù)據(jù),對輸出值也可以直接處理。java 的話,得把內(nèi)容序列化后傳進(jìn)去,再把結(jié)果反序列化后使用。粗暴點說就是,c艸艸可以艸c艸,直接注入數(shù)據(jù)。java 得自己擼然后用注射器注射。
還有 byte,游戲面對大量的多媒體資源,java 下那個帶符號的 byte,老別扭了。
更別說現(xiàn)在 dognet 標(biāo)準(zhǔn)庫里直接內(nèi)置了 simd,這又是游戲開發(fā)喜歡的東西。
仔細(xì)研究這些細(xì)節(jié),你會發(fā)現(xiàn),只有 c艸艸是游戲高性能快速開發(fā)的天命之子,快速開發(fā)+關(guān)鍵環(huán)節(jié)零成本抽象+gc兜底,帶著 mono 這個戰(zhàn)五渣都能大殺四方。java,python,js,都有上述這些問題,用起來束手束腳的。