public void Optmimize <VertexType>() where VertexType : struct { lock (_lock) { _originalObjects = _opaqueObjects.Concat(_transparentObjects).ToList(); _opaqueObjects.Clear(); _transparentObjects.Clear(); // categorize objects: var categories = new Dictionary <ObjectCategory, List <I3DObject> >(); foreach (var obj in _originalObjects) { if (!obj.IsOpaque || !obj.IsOptimizable) { Add(obj); } else { var category = ObjectCategory.Create(obj); if (category.BlendStateId == -1) // unknown/custom blendstate { Add(obj); } else { if (categories.ContainsKey(category)) { categories[category].Add(obj); } else { categories.Add(category, new List <I3DObject>() { obj }); } } } } // morph categories of objects into a single geometry object: foreach (var category in categories.Keys) { var objects = categories[category]; if (objects.Count == 1) { AddRange(objects.ToArray()); } else { var morphed = new Morphed3DObject <VertexType>(objects); morphed.LoadContent(); Add(morphed); } } Optimized = true; } }