1

我有一个我通过调用向该列表添加另一个整数来List<int>更新每次调用Update()Add()

在每次调用 时Draw(),我都会使用foreachList并使用存储int在屏幕上绘制一些东西。

我遇到的问题是前几帧(即很少调用更新),我的列表不同步。我添加的东西永远不会出现。

我使用此代码向文件添加了一些跟踪:

log.WriteLine("start list with count " + Actions.Count);
int nextAction = getNextAction(); // right now this is just some additions
Actions.Add(nextAction);
movelog.WriteLine("end list with count " + Actions.Count);

我得到这个踪迹:

start list with count 0
end list with count 1

start list with count 0
end list with count 1

start list with count 0
end list with count 1

start list with count 0
end list with count 1

start list with count 0
end list with count 1

start list with count 1
end list with count 2

start list with count 2
end list with count 3

start list with count 3
end list with count 4

正如您所看到的对这部分代码的前几次调用(即调用Update()),我添加到列表中,然后在下次调用它时它神奇地消失了,就好像没有添加到列表中一样。第五次之后,它终于起作用了。这在运行中非常一致。

我尝试锁定列表对象,并且得到完全相同的行为。

我的代码怎么了?我难住了。我没有并行执行任何操作,并且ManagedThreadId每次添加到列表时都尝试跟踪,并且线程 ID 相同。

4

1 回答 1

0

我猜你正在从 Draw() 调用中的列表中删除项目,这将产生你所描述的效果,因为 XNA 不会为每个 Draw() 调用运行 1 个 Update() 方法。

默认情况下,XNA 尝试每秒运行 60 次 Update(),但 Draw() 方法会尝试与显示器刷新率同步运行,并且如果更新方法花费的时间过长,则调用的次数会更少。

编辑 似乎我对从数组中删除项目的 Draw() 方法是错误的,在寻找这个问题的根源时我会尝试的下一步是确保没有任何东西在列表中乱序执行将是更改它到记录活动的列表。

public class LogList<T> : List<T>
    {
        public LogList()
            : base()
        {
            Debug.WriteLine("LogList- Construction");
        }

        public new void Add(T item)
        {
            Debug.WriteLine("LogList - Add");
            base.Add(item);
        }

        public new void Remove(T item)
        {
            Debug.WriteLine("LogList - Remove");
            base.Remove(item);
        }

        public new void RemoveAt(int index)
        {
            Debug.WriteLine("LogLost - RemoveAt");
            base.RemoveAt(index);
        }

        public new void Clear()
        {
            Debug.WriteLine("LogList - Clear");
            base.Clear();
        }
    }
于 2012-06-01T07:55:59.570 回答