C# XNA:我每帧更新一次的列表似乎会丢失它的前几个条目

C# XNA:我每帧更新一次的列表似乎会丢失它的前几个条目,c#,.net,list,xna,C#,.net,List,Xna,我有一个列表,每次调用update()时,我都会通过调用Add()向列表中添加另一个整数来更新该列表 每次调用Draw(),我都会在列表中foreach,并使用存储的int在屏幕上绘制一些东西 我的问题是,对于前几个帧(即,要更新的几个调用),我的列表不同步。我加的东西从来没有出现过 我使用以下代码向文件中添加了一些跟踪: log.WriteLine("start list with count " + Actions.Count); int nextAction = getNextAction

我有一个
列表
,每次调用
update()
时,我都会通过调用
Add()
向列表中添加另一个整数来更新该列表

每次调用
Draw()
,我都会在
列表中
foreach
,并使用存储的
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相同

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

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

编辑 似乎我对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();
        }
    }
公共类日志列表:列表
{
公共日志列表()
:base()
{
Debug.WriteLine(“日志列表-构造”);
}
新增公共作废(T项)
{
Debug.WriteLine(“日志列表-添加”);
基础。添加(项目);
}
公共新作废删除(T项)
{
Debug.WriteLine(“日志列表-删除”);
底座。移除(项目);
}
公共新空移除(内部索引)
{
Debug.WriteLine(“LogLost-RemoveAt”);
基本移动(索引);
}
公共新空白清除()
{
Debug.WriteLine(“日志列表-清除”);
base.Clear();
}
}

如果代码就是这么简单,您确定
操作
是一个
列表
?它可能是其他集合类型。比如
HashSet
maybe?@IIan-definal:private-List\u-actions;公共列表操作{get{lock({u Actions){return{u Actions;}}}}}可能您正在创建一个新列表并多次将其分配给
\u Actions
。在分配给
\u操作的位置设置断点
@IlianPinzon尝试了它。它只在类的构造函数中创建/初始化一次。我在那里也添加了一个断点,它只被命中一次。而且,只要我在添加到操作的位置放置断点,就不会重新启动。也就是说,如果我放慢速度,效果会很好。只是出于好奇,什么是
log
movelog
?我的绘图只是在列表上做了一个foreach:
foreach(int act in Fox.Actions){…}
其中
..
根本没有触及列表。更新中的
gameTime.ElapsedGameTime.millides
相当一致地为16ms。所以现在你希望你的列表继续无限增长?我建议您创建自己的list类,从list继承并重写add/remove和clear方法,以确保在您不需要的时候没有调用它们,您还可以向构造函数引入日志记录,这样您就可以知道列表是否由于某种原因再次初始化。不,它不会无限增长。大约在20/30左右停止。是的!除了打印当前线程堆栈跟踪之外,您的日志列表还显示该列表被构造了多次!原因是我是在鼠标点击的基础上构建的,我通过执行
if(mouse.GetState().LeftButton==ButtonState.Pressed)
来检查点击,该操作会被多次触发。当我设置了断点时,它没有发生,因为断点导致它不再注册任何单击。