예제 #1
0
 internal void CloseNodeCollectors()
 {
     viewObjectNodes.Close();
     RenderNodes.Close();
     objectNodes.Close();
     ObjectNodeReferences.Close();
 }
예제 #2
0
 public virtual void Reset()
 {
     // Clear nodes
     viewObjectNodes.Clear(false);
     objectNodes.Clear(false);
     ObjectNodeReferences.Clear(true);
     RenderNodes.Clear(false);
 }
예제 #3
0
        internal ObjectNodeReference GetOrCreateObjectNode(RenderObject renderObject)
        {
            if (renderObject.ObjectNode == ObjectNodeReference.Invalid)
            {
                renderObject.ObjectNode = new ObjectNodeReference(objectNodes.Count);
                objectNodes.Add(new ObjectNode(renderObject));

                ObjectNodeReferences.Add(renderObject.ObjectNode);
            }

            return(renderObject.ObjectNode);
        }
예제 #4
0
        internal unsafe ObjectNodeReference GetOrCreateObjectNode(RenderObject renderObject)
        {
            fixed(ObjectNodeReference *objectNodeRef = &renderObject.ObjectNode)
            {
                var oldValue = Interlocked.CompareExchange(ref *(int *)objectNodeRef, -2, -1);

                if (oldValue == -1)
                {
                    var index = objectNodes.Add(new ObjectNode(renderObject));
                    renderObject.ObjectNode = new ObjectNodeReference(index);
                    ObjectNodeReferences.Add(renderObject.ObjectNode);
                }
                else
                {
                    while (renderObject.ObjectNode.Index == -2)
                    {
                    }
                }
            }

            return(renderObject.ObjectNode);
        }