В настоящее время я разрабатываю симулятор, который работает на сервере и должен отображать данные в браузере.
Для обслуживания файлов, общения и тому подобного я бы хотел использовать Node.js. Но я не уверен, что он будет работать так же хорошо, как я хотел бы, чтобы в отделе вычислений, поэтому я хотел бы разработать часть моделирования в C ++.
Симуляция разделена на отдельные «миры», которые все начинаются с некоторых начальных параметров.
Каков наилучший способ сделать это?
Ну, V8 позволяет вызывать код C ++ из JavaScript.
Таким образом, вы можете иметь 3 части вашего кода:
World
является.World
учебный класс.Во-первых, понять, как V8 и C ++ общаются. Google предоставляет руководство для этого: https://developers.google.com/v8/embed
Затем вам нужен специальный клей для node.js. Увидеть http://www.slideshare.net/nsm.nikhil/writing-native-bindings-to-nodejs-in-c а также http://syskall.com/how-to-write-your-own-native-nodejs-extension
Из приведенной выше ссылки на слайды:
#include <v8.h>
#include <node.h>
using namespace v8;
extern "C" {
static void init(Handle<Object> target) {}
NODE_MODULE(module_name, init)
}
Мы можем расширить это в нечто более близкое к тому, что вы хотите:
SRC / world.h
#ifndef WORLD_H_
#define WORLD_H_
class World {
public:
void update();
};
extern World MyWorld;
#endif
SRC / world.cpp
#include "world.h"#include <iostream>
using std::cout;
using std::endl;
World MyWorld;
void World::update() {
cout << "Updating World" << endl;
}
SRC / bind.cpp
#include <v8.h>
#include <node.h>
#include "world.h"
using namespace v8;
static Handle<Value> UpdateBinding(const Arguments& args) {
HandleScope scope;
MyWorld.update();
return Undefined();
}
static Persistent<FunctionTemplate> updateFunction;
extern "C" {
static void init(Handle<Object> obj) {
v8::HandleScope scope;
Local<FunctionTemplate> updateTemplate = FunctionTemplate::New(UpdateBinding);
updateFunction = v8::Persistent<FunctionTemplate>::New(updateTemplate);
obj->Set(String::NewSymbol("update"), updateFunction->GetFunction());
}
NODE_MODULE(world, init)
}
демо / demo.js
var world = require('../build/Release/world.node');
world.update();
WScript
def set_options(opt):
opt.tool_options("compiler_cxx")
def configure(conf):
conf.check_tool("compiler_cxx")
conf.check_tool("node_addon")
def build(bld):
obj = bld.new_task_gen("cxx", "shlib", "node_addon")
obj.cxxflags = ["-g", "-D_FILE_OFFSET_BITS=64", "-D_LARGEFILE_SOURCE", "-Wall"]
# This is the name of our extension.
obj.target = "world"obj.source = "src/world.cpp src/bind.cpp"obj.uselib = []
В оболочке Linux некоторые настройки:
node-waf configure
Чтобы построить, запустите:
node-waf
Тестировать:
node demo/demo.js
Выход:
Updating World
Других решений пока нет …