Thank you! I'll give it a go! On Mar 29, 2016 4:27 AM, "Jochen Eisinger" <[email protected]> wrote:
> The C++ class corresponding to Engine should have a v8::Global that > references the JS representation of the ComponentMesh. That way, the Engine > will keep the ComponentMesh alive as long as the C++ side is alive. > > Note that this will potentially create a cycle through C++ which V8's GC > cannot detect: C++ Engine - (via v8::Global) -> mesh -> creation context -> > root - (via another global handle) -> C++ Engine, and you will have to > manually break this cycle for garbage collection to collect it. > > On Mon, Mar 28, 2016 at 5:10 PM Scott Duensing <[email protected]> > wrote: > >> You're right, of course. I figured this out as soon as I posted. Doh! >> >> Which brings up the next question... >> >> What's the *proper* way to keep 'mesh' alive? I hate to keep a global JS >> variable for everything I create from the C++ side. I also hate to pass >> copies of objects when a pointer is really what I want. >> >> >> Scott >> >> >> >> >> >> On Thursday, March 24, 2016 at 1:51:30 AM UTC-5, Jochen Eisinger wrote: >> >>> It looks like mesh is collected, not root. How does root keep mesh alive? >>> >>> On Wed, Mar 23, 2016, 9:20 PM Scott Duensing <[email protected]> >>> wrote: >>> >> I've been working on a game engine and using V8 as the embedded >>>> language. Everything has been going fairly well, using SWIG to wrap native >>>> C++ classes for use in JS. >>>> >>>> Until today. >>>> >>>> My test code creates a triangle in JavaScript and sends it to the >>>> engine to be rendered. It works. For about 5 seconds. Then the 'root' >>>> object of my scene gets garbage collected by V8 and I'm not sure why. I >>>> set a breakpoint when the object is destroyed and captured a stack trace: >>>> >>>> 0 ComponentMesh::~ComponentMesh componentMesh.cpp 18 >>>> 0x4cd39e >>>> 1 ComponentMesh::~ComponentMesh componentMesh.cpp 19 >>>> 0x4cd472 >>>> 2 _wrap_delete_ComponentMesh componentMesh_wrap.cpp 1788 >>>> 0x435c46 >>>> 3 v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessing >>>> (v8::internal::Isolate *) 0x6a7fee >>>> 4 v8::internal::GlobalHandles::PostScavengeProcessing(int) >>>> 0x6a7e75 >>>> 5 v8::internal::GlobalHandles::PostGarbageCollectionProcessing(v8:: >>>> internal::GarbageCollector, v8::GCCallbackFlags) 0x6a86ba >>>> 6 v8::internal::Heap::PerformGarbageCollection(v8::internal:: >>>> GarbageCollector, v8::GCCallbackFlags) 0x6afa77 >>>> 7 v8::internal::Heap::CollectGarbage(v8::internal::GarbageCollector, >>>> const char *, const char *, v8::GCCallbackFlags) 0x6af054 >>>> 8 v8::internal::Factory::NewRawOneByteString(int, v8::internal:: >>>> PretenureFlag) 0x68677d >>>> 9 v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char >>>> const>, v8::internal::PretenureFlag) 0x686bb0 >>>> 10 v8::String::NewFromUtf8(v8::Isolate *, const char *, v8:: >>>> NewStringType, int) 0x4d00ea >>>> 11 ScriptInstance::update scriptInstance.cpp 179 0x41d744 >>>> 12 Scripting::update scripting.cpp 219 0x41609c >>>> 13 main main.cpp 70 0x4b2331 >>>> >>>> >>>> >>>> As you can see, my scripting system calls update() in the JS code which >>>> should call render() back in the engine. Except the mesh is being GCed >>>> before that happens. The JS is: >>>> >>>> "use strict"; >>>> >>>> var root; >>>> >>>> function startup(scriptId) { >>>> var mesh = new ComponentMesh("triangle"); >>>> mesh.addVertex(new Vertex(-1.0, -1.0, 0.0)); >>>> mesh.addVertex(new Vertex( 1.0, -1.0, 0.0)); >>>> mesh.addVertex(new Vertex( 0.0, 1.0, 0.0)); >>>> mesh.addIndex(0); >>>> mesh.addIndex(1); >>>> mesh.addIndex(2); >>>> >>>> root = new Entity("root"); >>>> root.addComponent(mesh); >>>> } >>>> >>>> function update(delta, event) { >>>> Engine.render(root); >>>> } >>>> >>>> function shutdown() { >>>> } >>>> >>>> >>>> Why is 'root' being GCed? The context for this script is Persistent<> >>>> and I don't call Destroy()/Reset(). >>>> >>>> The entire codebase is available to browse at >>>> http://skunkworks.kangaroopunch.com/projects/magrathea/repository >>>> >>>> Help? Please? Thanks! >>>> >>>> >>>> Scott >>>> >>>> >>>> -- >>>> -- >>>> v8-users mailing list >>>> >>> [email protected] >>> >>> >>>> http://groups.google.com/group/v8-users >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-users" group. >>>> >>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>> >>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >> -- >> v8-users mailing list >> [email protected] >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to a topic in the > Google Groups "v8-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/v8-users/PYxVvgjAi24/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
