gpt4 book ai didi

c# - GC 收集...什么?

转载 作者:行者123 更新时间:2023-11-30 16:35:16 27 4
gpt4 key购买 nike

我正在尝试优化我的引擎 (C# + SlimDX) 以尽可能减少分配(以防止 GC 过于频繁地触发),使用一个分析器作为指导,该分析器会告诉我生成垃圾对象的位置。它进展顺利(从每 5 秒垃圾 20 MB 下降到每 1 分半钟垃圾 8 MB(是的,它几乎没有优化 XD))有一种方法我找不到任何声明的东西,我不知道该怎么做。似乎这个方法在其主体中每次执行都会生成 2 个垃圾对象(而不是在被调用的函数上):

有人可以指导我理解为什么这个函数会生成要被丢弃的对象吗?我真的不知道。

    public override void Update()
{
base.Update();
if (LastCheckInstancesNumber != Instances.Count)
{
LastCheckInstancesNumber = Instances.Count;
_needToRegenerateUpdate = true;
}
// Crea byte array da usare nel prossimo draw.
if (_needToRegenerateUpdate)
{
Int32 PrimitivesCount = Instances.Count;
Int32 Size = PrimitivesCount * 80;

if ((ByteUpdateTemp != null) && (ByteUpdateTemp.Length < Size))
ByteUpdateTemp = new byte[Size];
int offset = 0;

PrimitivesCount = 0;
Int32 Count = Instances.Count;
for (int i = 0; i < Count; i++)
{
InstancedBase3DObjectInstanceValues ib = Instances[i];
if (ib.Process)
{
MathHelper.CopyMatrix(ref ib._matrix, ref MatrixTemp);
MathHelper.CopyVector(ref ib._diffuseColor, ref ColorTemp);

ObjectUpdateTemp[0] = MatrixTemp.M11;
ObjectUpdateTemp[1] = MatrixTemp.M12;
ObjectUpdateTemp[2] = MatrixTemp.M13;
ObjectUpdateTemp[3] = MatrixTemp.M14;
ObjectUpdateTemp[4] = MatrixTemp.M21;
ObjectUpdateTemp[5] = MatrixTemp.M22;
ObjectUpdateTemp[6] = MatrixTemp.M23;
ObjectUpdateTemp[7] = MatrixTemp.M24;
ObjectUpdateTemp[8] = MatrixTemp.M31;
ObjectUpdateTemp[9] = MatrixTemp.M32;
ObjectUpdateTemp[10] = MatrixTemp.M33;
ObjectUpdateTemp[11] = MatrixTemp.M34;
ObjectUpdateTemp[12] = MatrixTemp.M41;
ObjectUpdateTemp[13] = MatrixTemp.M42;
ObjectUpdateTemp[14] = MatrixTemp.M43;
ObjectUpdateTemp[15] = MatrixTemp.M44;
ObjectUpdateTemp[16] = ColorTemp.X;
ObjectUpdateTemp[17] = ColorTemp.Y;
ObjectUpdateTemp[18] = ColorTemp.Z;
ObjectUpdateTemp[19] = ColorTemp.W;
ByteConverter.WriteSingleArrayToByte(ref ObjectUpdateTemp, ref ByteUpdateTemp, offset);
offset += 20;

PrimitivesCount++;
}
}

SynchronizedObject so = SynchronizationEventWriter.LockData();
so.Synchronizedobject = ByteUpdateTemp;
SynchronizationEventWriter.Update();
SynchronizationEventWriter.UnlockData();
_needToRegenerateUpdate = false;

so = SynchronizationEventWriterNum.LockData();
so.Synchronizedobject = PrimitivesCount;
SynchronizationEventWriterNum.Update();
SynchronizationEventWriterNum.UnlockData();
}
}

注释:

由于缓存,新字节[Size] 永远不会被调用。MathHelper 函数只是将每个元素(单个)从一个对象复制到另一个对象,而不创建任何内容。base.Update() 几乎什么都不做(无论如何都是从我引擎中的所有对象派生的,但只有在这里我有垃圾对象)

谢谢!!!

编辑:

    internal void GetLock()
{
Monitor.Enter(InternalLock);
Value.Locked = true;
Value.LockOwner = Thread.CurrentThread;
}
public SynchronizedObject LockData()
{
Parent.GetLock();
return Parent.Value;
}

这是 LockData() 的代码。我不认为它会产生任何东西:|

最佳答案

我解决了!!!

问题是 so.Synchronizedobject = PrimitivesCount;正在将 Int32 分配给 Object 类。似乎每次都会替换导致旧对象被垃圾处理的对象。我通过使用框类来封装 Int32 对象并简单地更改其中的值来解决。

关于c# - GC 收集...什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1952105/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com