public bool SaveData() { bool cancelled = false; using (var writer = new OCDataWriter(GetOCDataFilePath())) { writer.BeginBlock(); WriteNeighborMaxGameObjId(writer); writer.Write(_maxGameObjectIDCount); writer.Write(volumelList.Count); for (int i = 0; i < volumelList.Count; ++i) { if (Util.Progress("保存PVS数据", String.Format("Volume {0}/{1} ...", i + 1, volumelList.Count), ((float)i + 1) / volumelList.Count)) { cancelled = true; break; } var volume = volumelList[i]; volume.Save(writer); } writer.EndBlock(); //BakeStat.CompressRatio = writer.CompressRatio; return(!cancelled); } }
private void WriteNeighborMaxGameObjId(OCDataWriter writer) { //write max game object id count of neighbor scenes if (Owner == null) { writer.Write(0); } else { int tileDimension = Owner.TileDimension; writer.Write(tileDimension); for (int x = 0; x < tileDimension; ++x) { for (int y = 0; y < tileDimension; ++y) { var tile = Owner.ExistTile(new Index(x, y)); if (tile == null) { writer.Write(0); } else { writer.Write(((SingleScene)tile).MaxGameObjectIDCount); } } } } }
public void Save(OCDataWriter writer) { writer.Write(cellSize); writer.Write(aabb); writer.Write(cellList.Count); //foreach (var cell in cellList) //{ // cell.Save(writer); // } for (int i = cellList.Count - 1; i >= 0; i--) { var cell = cellList[i]; cell.Save(writer); //cellList.Remove(cell); } }
public void Save(OCDataWriter writer) { writer.Write(aabb.center); //OCProfiler.Start(); if (owner.owner.Owner == null) { var flag = new BitArray(owner.owner.MaxGameObjectIDCount); flag.SetAll(false); visFlagDic.Add(new Index(0, 0), flag); } else { //var mainFlag = new BitArray(0); //mainFlag.SetAll(false); //visFlagDic.Add(Index.InValidIndex, mainFlag); Index currentIndex = owner.owner.TileIndex; for (int i = -1; i < 2; i++) { for (int j = -1; j < 2; j++) { Index newIndex = new Index(i, j) + currentIndex; if (owner.owner.Owner.IsValidIndex(newIndex)) { var multiScene = owner.owner.Owner as MultiScene; if (multiScene.tileMap.Count > 9) { Debug.LogError("batch mode tile count=" + multiScene.tileMap.Count); } var scene = multiScene.ExistTile(newIndex) as SingleScene; if (scene != null) { var flag = new BitArray(scene.MaxGameObjectIDCount); flag.SetAll(false); visFlagDic.Add(new Index(i, j), flag); } else { Debug.LogError("batch mode Cell::SaveData error!"); } } } } } foreach (var obj in visibleModelList) { SingleScene scene = obj.Owner; if (scene.Owner != null) { if (scene.Owner.IsValidIndex(scene.TileIndex)) { int deltaX = scene.TileIndex.x - owner.owner.TileIndex.x; int deltaY = scene.TileIndex.y - owner.owner.TileIndex.y; visFlagDic[new Index(deltaX, deltaY)].Set(obj.GUID, true); } else { //main scene //visFlagDic[Index.InValidIndex].Set(obj.GUID, true); } } else { visFlagDic[new Index(0, 0)].Set(obj.GUID, true); } } //var cellSaveInitTime = OCProfiler.Stop(); foreach (var bitArray in visFlagDic) { writer.Write(OC.Util.ConvertBitArray(bitArray.Value)); } writer.Write(children.Count); foreach (var child in children) { writer.Write(child.aabb.center); } Clear(); }