我们正在开发具有3D功能的Silverlight应用。我们正在使用我们自己的3D引擎(具有多平台功能)。
我们遇到了一个非常糟糕的问题: 我们得到了一个RenderManager,它渲染了一堆可以动态添加/删除等的渲染。这种渲染发生在Thread1中。
我们得到了另一个对象(实际上是更多对象),它引用了“一些”可渲染对象。这个对象在Thread2中完成它的工作。如果这个对象被释放,它应该(并且确实)处理它引用的可渲染对象。
现在问题。首先,它发生在随机时间(我相信这通常是线程的情况):
我相信下一件事情会发生: 1. Thread1开始运行。它达到了这段代码:
for (var i = 0; i < renderables.Length; ++i)
{
if (!renderables[i].IsDisposed)
DrawRenderable(renderables[i]);
}
当然,我可以将IsDisposed检查放在DrawRenderable中,并使用它所使用的方法等,等等。但这并没有真正解决问题,因为同样的事情也可能发生在那里。
我正在考虑在if条件之前“锁定”可渲染,但我不知道该怎么做或者甚至可能。
使用锁定,我不一定是指使用'lock'-keyword。我的意思是暂时只读它。
但同样,我不知道该怎么做,如果甚至可以做到这一点。
有没有人知道如何摆脱这个问题?
UPDATE1 所以在阅读完评论之后,我试着想办法以正确的方式做到这一点。这就是我想出的:
主题1: - 渲染一切 - 检查Dispose所有'ReadyToDispose'对象
主题2: - 在我目前称为renderable.Dispose()
的同一个地方将ReadyToDispose设置为true。这样,物体在使用后将被丢弃。由于ReadyToDispose只是一个什么也不做的布尔值,因此可渲染方法中的所有值都可用于渲染方法。在渲染之后,可以进行处置以处置必须处理的那些。
这听起来像是一种可能的解决方案吗?我在尝试之前会问,因为这意味着我必须改变很多东西。在我这样做之前,我想知道这听起来是否合理。
感谢。