コード例 #1
0
 public void Construct_Enumeration_Contructed()
 {
     var incrementalEnumerator = new IncrementalEnumerator(0, 10);
     var target = new PagedCollection<IntegerAdapter>(incrementalEnumerator);
     var expectedCount = 10;
     Assert.AreEqual(expectedCount, target.Count);
 }
コード例 #2
0
        public void IncrementalOptimize()
        {
            //All this does is look for any bodies which are to the right of a given body. If it finds one, it pulls it to be adjacent.
            //This converges at the island level- that is, running this on a static topology of simulation islands will eventually result in
            //the islands being contiguous in memory, and at least some connected bodies being adjacent to each other.
            //However, within the islands, it may continue to unnecessarily swap objects around as bodies 'fight' for ownership.
            //One body doesn't know that another body has already claimed a body as a child, so this can't produce a coherent unique traversal order.
            //(In fact, it won't generally converge even with a single one dimensional chain of bodies.)

            //This optimization routine requires much less overhead than other options, like full island traversals. We only request the connections of a single body,
            //and the swap count is limited to the number of connected bodies.
            int optimizationCount = (int)Math.Max(1, Math.Round(bodies.ActiveSet.Count * optimizationFraction));

            for (int i = 0; i < optimizationCount; ++i)
            {
                //No point trying to optimize the last two bodies. No optimizations are possible.
                if (nextBodyIndex >= bodies.ActiveSet.Count - 2)
                {
                    nextBodyIndex = 0;
                }

                var enumerator = new IncrementalEnumerator();
                enumerator.bodies     = bodies;
                enumerator.broadPhase = broadPhase;
                enumerator.solver     = solver;
                enumerator.slotIndex  = nextBodyIndex + 1;
                bodies.EnumerateConnectedBodyIndices(nextBodyIndex, ref enumerator);

                ++nextBodyIndex;
            }
        }