• Announcements

    • khawk

      Download the Game Design and Indie Game Marketing Freebook   07/19/17

      GameDev.net and CRC Press have teamed up to bring a free ebook of content curated from top titles published by CRC Press. The freebook, Practices of Game Design & Indie Game Marketing, includes chapters from The Art of Game Design: A Book of Lenses, A Practical Guide to Indie Game Marketing, and An Architectural Approach to Level Design. The GameDev.net FreeBook is relevant to game designers, developers, and those interested in learning more about the challenges in game development. We know game development can be a tough discipline and business, so we picked several chapters from CRC Press titles that we thought would be of interest to you, the GameDev.net audience, in your journey to design, develop, and market your next game. The free ebook is available through CRC Press by clicking here. The Curated Books The Art of Game Design: A Book of Lenses, Second Edition, by Jesse Schell Presents 100+ sets of questions, or different lenses, for viewing a game’s design, encompassing diverse fields such as psychology, architecture, music, film, software engineering, theme park design, mathematics, anthropology, and more. Written by one of the world's top game designers, this book describes the deepest and most fundamental principles of game design, demonstrating how tactics used in board, card, and athletic games also work in video games. It provides practical instruction on creating world-class games that will be played again and again. View it here. A Practical Guide to Indie Game Marketing, by Joel Dreskin Marketing is an essential but too frequently overlooked or minimized component of the release plan for indie games. A Practical Guide to Indie Game Marketing provides you with the tools needed to build visibility and sell your indie games. With special focus on those developers with small budgets and limited staff and resources, this book is packed with tangible recommendations and techniques that you can put to use immediately. As a seasoned professional of the indie game arena, author Joel Dreskin gives you insight into practical, real-world experiences of marketing numerous successful games and also provides stories of the failures. View it here. An Architectural Approach to Level Design This is one of the first books to integrate architectural and spatial design theory with the field of level design. The book presents architectural techniques and theories for level designers to use in their own work. It connects architecture and level design in different ways that address the practical elements of how designers construct space and the experiential elements of how and why humans interact with this space. Throughout the text, readers learn skills for spatial layout, evoking emotion through gamespaces, and creating better levels through architectural theory. View it here. Learn more and download the ebook by clicking here. Did you know? GameDev.net and CRC Press also recently teamed up to bring GDNet+ Members up to a 20% discount on all CRC Press books. Learn more about this and other benefits here.
Sign in to follow this  
Followers 0
hupsilardee

Object handle getting released; causing a null pointer error?

4 posts in this topic

Hi all, I've been using Angelscript in my project with great success so far, except this one weird bug.

 

I have bound my MeshSceneNode class to the scripting engine for scripting. It can only be created/destroyed by using the Scene interface (which appears as a singleton to the script)

// C++
assert(0 <= engine->RegisterObjectType("MeshSceneNode", sizeof(MeshSceneNode), asOBJ_REF | asOBJ_NOCOUNT));
assert(0 <= engine->RegisterObjectMethod("CScene", "MeshSceneNode@ CreateMesh(const string &in)", asMETHOD(Scene, AddMesh), asCALL_THISCALL));
assert(0 <= engine->RegisterObjectMethod("CScene", "void DestroyMesh(MeshSceneNode@)", asMETHOD(Scene, DestroyMesh), asCALL_THISCALL));

I made a Character class in script, and made an Avatar subclass to handle graphical representation of it (thus fulfilling ORP), like so

// Angelscript
class Avatar
{
    Character@ Char;
    MeshSceneNode@ armour;
    MeshSceneNode@ helmet;
 
 
    Avatar(Character@ char)
    {
        @Char = char;
        helmet = Scene.CreateMesh("helmet_steel.obj");
        armour = Scene.CreateMesh("armour_steel.obj");
    }
    ~Avatar()
    {
        Scene.DestroyMesh(helmet);
        Scene.DestroyMesh(armour);
    }
}
class Character
{
    Avatar@ avatar;
    
}

 

Now the problem is, when the game shuts down the player is obviously destroyed, but when Scene::DestroyMesh is called, it complains that the meshes passed in are null pointers. Why?

Edited by hupsilardee
0

Share this post


Link to post
Share on other sites

It's hard to be sure with just this information, but it appears that you're establishing a circular reference between the Character and Avatar instances. Most likely you don't break this circular reference anywhere, thus forcing the gc to do that for you when it detects that the character is no longer referenced anywhere else.

 

The way the gc breaks circular references is simply to release any handles that are held in the members, and as such setting the members to null. The destructor will be called when no more references to the object exists, i.e. after the gc has broken the circular references.

 

As weak links are not yet supported (and I currently have no idea when/if they will be) my suggestion is that you design your classes in such a way that you can guarantee that any circular references can be broken before all references are released. For example, you probably have some event when a character is removed from the scene, that would be a great place to call a method on the Character class to do this kind of clean up.

 

Regards,

Andreas

0

Share this post


Link to post
Share on other sites

Sorry for coming into this late, but could this possibly be resolved (in this particular case, and maybe in others) by having the gc preferentially releasing handles that are members of objects with no destructors?

 

That is, in this case the gc would first release the Character::avatar handle. At this point, the Avatar would have no more references, and could be destructed safely.

 

Of course, this solution doesn't quite work if you have circular references between classes that each have destructors, but then that is the programmer's own fault, right? happy.png

 

This method of breaking circular references is used by Python and the Boehm GC, although the way each of these handle the case of circular references among objects that all have destructors is to never collect the objects . . . I think that your solution is better in this case. Or, perhaps, throw an exception and refuse to run the destructors. That sounds more complicated, though.

Edited by collinstocks
0

Share this post


Link to post
Share on other sites

As you pointed out, it would not solve it completely so I don't see it as a good solution.

 

I was thinking about two other alternatives:

 

1. Have the gc call the destructor before releasing the members. 

2. Have the gc call a secondary method, e.g. onBeforeGC, before it releases the members.

 

I haven't quite thought this through though so I'm not sure if this will cause other problems. 

0

Share this post


Link to post
Share on other sites

I've changed this in revision 1654 so that the garbage collector now calls the script class' destructor before it releases all the handles in the object to break the circular reference.

 

Regards,

Andreas

0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0