110,536
社区成员
发帖
与我相关
我的任务
分享
#region Dispose
/// <summary>
/// 销毁。
/// </summary>
void IDisposable.Dispose()
{
_heights = null;
_index0 = null;
_index1 = null;
GC.SuppressFinalize(this);
}
#endregion
/// <summary>
/// 保存当前实例至文件,同时保存至数据库。
/// </summary>
public static void Save(SceneDataEntity entity)
{
try
{
entity.IsChanged = false;
//保存至文件
byte[] _buffer = null;
try
{
string _saveToFile = FileUtil.GetAppConfig("SceneDataSaveToFile").ToLower().Trim();
bool NeedSaveToFile = (_saveToFile == "true" || _saveToFile == "yes" || _saveToFile == "1");
if (NeedSaveToFile)
{
_buffer = BaseHelper.Serialize(entity);
_buffer = CompressUtil.Compress(_buffer);
FileUtil.WriteAllBytes(entity.FileName, _buffer);
}
}
catch (Exception ex)
{
TraceUtility.Trace("SceneDataEntity-SaveFile", string.Format("Save scene data entity is fail. Scene no is {0}, error message is {1}", entity.No, ex.Message));
}
TraceUtility.Assert(entity != null, "SaveSceneEntity", String.Format("Need save entity is null."));
if (entity.Size > 0)
{
//保存至数据库
int length = entity.Heights.Length * 4;
_buffer = new byte[length];
IntPtr _ptr = IntPtr.Zero;
//Heights
try
{
_ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(entity.Heights, 0, _ptr, entity.Heights.Length);
Marshal.Copy(_ptr, _buffer, 0, length);
SaveData(SceneDataStyle.Scene, entity.No, entity.Size, _buffer);
}
catch (Exception ex)
{
TraceUtility.Trace("SceneEntity-SaveDB-Heights", string.Format("Save scene data entity is fail. Scene no is {0}, error message is {1}", entity.No, ex.Message));
}
finally
{
Marshal.FreeHGlobal(_ptr);
}
//Index0
try
{
length = entity.Index0.Length * 4;
_buffer = new byte[length];
_ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(entity.Index0, 0, _ptr, entity.Index0.Length);
Marshal.Copy(_ptr, _buffer, 0, length);
SaveData(SceneDataStyle.Index0, entity.No, entity.Size - 1, _buffer);
}
catch (Exception ex)
{
TraceUtility.Trace("SceneEntity-SaveDB-Index0", string.Format("Save scene data entity is fail. Scene no is {0}, error message is {1}", entity.No, ex.Message));
}
finally
{
Marshal.FreeHGlobal(_ptr);
}
//Index1
try
{
length = entity.Index1.Length * 4;
_buffer = new byte[length];
_ptr = Marshal.AllocHGlobal(length);
Marshal.Copy(entity.Index1, 0, _ptr, entity.Index1.Length);
Marshal.Copy(_ptr, _buffer, 0, length);
SaveData(SceneDataStyle.Index1, entity.No, entity.Size - 1, _buffer);
}
catch (Exception ex)
{
TraceUtility.Trace("SceneEntity-SaveDB-Index1", string.Format("Save scene data entity is fail. Scene no is {0}, error message is {1}", entity.No, ex.Message));
}
finally
{
Marshal.FreeHGlobal(_ptr);
}
}
}
catch (Exception e)
{
TraceUtility.Trace("SceneDataEntity-SaveDB", string.Format("Save scene data entity is fail. Scene no is {0}, error message is {1}", entity.No, e.Message));
}
}
[Serializable]
public class SceneDataEntity : IDisposable, ICloneable
{
#region 构造&释构
/// <summary>构造本实体时必须传入场景编号</summary>
public SceneDataEntity(string no)
{
_no = no;
}
~SceneDataEntity()
{
Dispose(false);
}
#endregion
#region 属性
private string _no;
/// <summary>场景编号。</summary>
public string No { get { return _no; } }
/// <summary>场景大小。</summary>
private int _size;
public int Size { get { return _size; } set { _size = value; } }
/// <summary>场景的高度数据,长度为Size * Size。</summary>
private float[] _heights;
public float[] Heights { get { return _heights; } set { _heights = value; } }
/// <summary>场景混合纹理的第一部分数据。</summary>
private int[] _index0;
public int[] Index0 { get { return _index0; } set { _index0 = value; } }
/// <summary>场景混合纹理的第二部分数据。</summary>
private int[] _index1;
public int[] Index1 { get { return _index1; } set { _index1 = value; } }
/// <summary>数据是否被更新。</summary>
private bool _isChanged;
public bool IsChanged { get { return _isChanged; } set { _isChanged = value; } }
private bool isDisposed;
#endregion
private static void SaveData(SceneDataStyle style, string sceneNo, int size, byte[] buffer)
{
List<byte[]> _rowData = new List<byte[]>(size);
int _startIndex = 0;
int _len = size * 4;
byte[] _buffer = new byte[_len];
do
{
Array.Copy(buffer, _startIndex, _buffer, 0, _len);
_rowData.Add(_buffer);
_startIndex += _len;
_buffer = new byte[_len];
} while (_startIndex < buffer.Length);
DBHelper.SaveBinaryData(style, sceneNo, 0, 0, _rowData);
}
#endregion
#region Dispose
/// <summary>
/// 销毁。
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!isDisposed)
{
if (disposing)
{
}
_heights = null;
_index0 = null;
_index1 = null;
}
isDisposed = true;
}
#endregion
#region ICloneable
public object Clone()
{
SceneDataEntity _entity = new SceneDataEntity(this.No);
_entity.Heights = this.Heights;
_entity.Index0 = this.Index0;
_entity.Index1 = this.Index1;
_entity.Size = this.Size;
return _entity;
}
#endregion
}
Queue<SceneDataEntity> _saveEntities = new Queue<SceneDataEntity>();
/// <summary>保存当前所有的数据集合。 </summary>
public void Save()
{
//1.取出所有已经改过的集合
//2.保存数据
//3.更改集合中的项;
_saveEntities = new Queue<SceneDataEntity>();
lock (_syncRoot)
{
//获取已经发生变动的场景
foreach (SceneDataEntity _entity in AllSceneData.Values)
if (_entity.IsChanged)
_saveEntities.Enqueue((SceneDataEntity)_entity.Clone());
//更改IsChanged值
foreach (SceneDataEntity entity in _saveEntities)
AllSceneData[entity.No] = entity;
}
//保存数据
while (_saveEntities.Count > 0)
{
SceneDataEntity _saveEntity = _saveEntities.Dequeue();
SceneDataEntity.Save(_saveEntity);
_saveEntity.Dispose();
_saveEntity = null;
}
_saveEntities = null;
TraceUtility.Trace("SaveToDb", string.Format("Use Memory : {0} bytes.", GC.GetTotalMemory(false)));
GC.Collect();
TraceUtility.Trace("SaveToDb", string.Format("Use Memory(After Collect) : {0} bytes.", GC.GetTotalMemory(false)));
}