【问题标题】:Proper Method for Storing JavaScript Instances in Nan::ObjectWrap C++ Class在 Nan::ObjectWrap C++ 类中存储 JavaScript 实例的正确方法
【发布时间】:2019-05-11 12:42:44
【问题描述】:

假设我有两个用 C++ 开发的类,但使用 Nan NodeJS 本机模块公开。例如,“Sprite”和“Texture”类。

在 JavaScript 中,我希望能够让 Sprite 存储纹理,就好像它只是另一个属性:

// Local instance of texture
var t = new Texture();

// Global instances of Sprites that won't be GC'd
global.spr = new Sprite();
global.spr2 = new Sprite();

// Same texture can be assigned to multiple sprites
spr.texture = t;
spr2.texture = t;

console.log(spr.texture);

在 C++ 方面,Sprite 的“纹理”属性将是存储或检索纹理的 Getter/Setter。但问题是,在内部存储 Texture 实例的正确方法是什么(来自提供的 v8::Local)?比如,我需要做什么才能将它注册为 Sprite “拥有”并使其不会像上面的示例中那样被 GC 处理?

【问题讨论】:

    标签: javascript c++ node.js node.js-addon node.js-nan


    【解决方案1】:

    您可以将Persistent 句柄作为存储纹理实例的 Sprite 类的成员。 Sprite 析构函数需要重置句柄以避免泄漏。

    class Sprite : public Nan::ObjectWrap {
    public:
      Nan::Persistent<v8::Object> textureHandle;
    
      static NAN_SETTER(SetTexture) {
        Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
        if (Nan::New(Texture::constructor)->HasInstance(value)) {
          sprite->textureHandle.Reset(value);
        } else {
          // value wasn't a Texture instance; do something
        }
      }
    
      static NAN_GETTER(GetTexture) {
        Sprite* sprite = Nan::ObjectWrap::Unwrap<Sprite>(info.This());
        Isolate* iso = Isolate::GetCurrent();
        if (sprite->textureHandle.IsEmpty()) {
          // Texture hasn't been set yet; do something
        } else {
          info.GetReturnValue().Set(sprite->TextureHandle.Get(iso));
        }
      }
    
      ~Sprite() {
        textureHandle.Reset();
      }
    }
    

    (未显示:注册 getter/setter 的初始化代码。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2016-10-09
      • 1970-01-01
      • 2014-04-09
      • 2023-04-03
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多