都说Node.js不适合做密集型的运算。状态同步和帧同步牵涉到大量的运算吧,特别是状态同步。 那它还适合做这两种状态同步方式的游戏服务端吗?主要是手游。
如果不适合的话,目前什么语言合适呢?
关注一波问题,个人觉得状态同步跟帧同步,并不会有大量的运算。我也好奇大家都是怎么做这块的。
@wbget 不会啊。状态同步大量计算都在服务端啊
nodejs还有c++扩展,可以将计算密集的任务拆分到扩展上
来自酷炫的 CNodeMD
@zswnew 这个倒也是一个办法
@imhered 实际中也是这样解决的
@nobody 就是将密集型的计算写成C++模块,然后node可以直接调用C++模块的对吧? 是可以直接调用C++模块,而不是需要写成类似web类的api调用对吧?
@imhered 把c++模块编译成.node文件,直接require就能用了
@leiwei1991 感谢!
mark
可以参考pomelo的示例,适不适合关键还是要看项目的复杂度吧
可以去看看V8的内存回收机制,你就会发现完全不适合
v8支持了多线程了吧?只是nodejs还没开放worker线程
@1316346949 是支持了多进程,多线程也是C++扩展来的
@SheenOh 最新浏览器v8支持了es2017的多线程变量共享。nodejs好像屏蔽了这些功能。如果v8不支持多线程,v8怎么跑多线程语言编译成的wasm
@1316346949 你哪里看到的 资料可以贴一下吗? 多线程语言能用,不是wasm能用。C++能用,是因为C++调用了系统线程,那是C++环境的接口,wasm实际上运行在V8上,V8是没有提供线程接口的 实际上 wasm 能做的事情跟js一样。wasm只是在编译解析上加速
@SheenOh 多线程语言编译到wasm如果是多线程并行运算,v8不支持多线程,还要编译成单线程要怎么玩呢?其实浏览器有一个new Workek开启多线程,但是线程是隔离的,不支持共享内存,ecmascript2017 解决的就是这个共享问题,和锁的概念加入。最后又还个是多线程异步等待提案
关注一波
如果不适合的话,目前什么语言合适呢?
自然是cpp了
@1316346949 V8是C++写的,浏览器是系统级别应用,内部当然轻松调用线程功能。是否有多线程,那基于运行环境,并非语言本身呐。
官方文档确实说了,webassembly 可以调用高级系统的api,可以调用pthreads apis,那也不管v8的事。 http://webassembly.org/docs/c-and-c++/ APIs WebAssembly applications can use high-level C/C++ APIs such as the C and C++ standard libraries, OpenGL, SDL, pthreads, and others, just as in normal C/C++ development. Under the covers, these libraries implement their functionality by using low-level facilities provided by WebAssembly implementations. On the Web, they utilize Web APIs (for example, OpenGL is executed on WebGL, libc date and time methods use the browser’s Date functionality, etc.). In other contexts, other low-level mechanisms may be used.