在其他对象尝试渲染时处置对象

时间:2013-06-06 10:24:22

标签: c# multithreading silverlight 3d

我们正在开发具有3D功能的Silverlight应用。我们正在使用我们自己的3D引擎(具有多平台功能)。

我们遇到了一个非常糟糕的问题: 我们得到了一个RenderManager,它渲染了一堆可以动态添加/删除等的渲染。这种渲染发生在Thread1中。

我们得到了另一个对象(实际上是更多对象),它引用了“一些”可渲染对象。这个对象在Thread2中完成它的工作。如果这个对象被释放,它应该(并且确实)处理它引用的可渲染对象。

现在问题。首先,它发生在随机时间(我相信这通常是线程的情况):

我相信下一件事情会发生: 1. Thread1开始运行。它达到了这段代码:

        for (var i = 0; i < renderables.Length; ++i)
        {
            if (!renderables[i].IsDisposed)
                DrawRenderable(renderables[i]);
        }
  1. 在if条件之后,Thread2启动。
  2. 可渲染在if条件之后处理。
  3. Rendermanager尝试绘制可渲染的渲染。
  4. 当然,我可以将IsDisposed检查放在DrawRenderable中,并使用它所使用的方法等,等等。但这并没有真正解决问题,因为同样的事情也可能发生在那里。

    我正在考虑在if条件之前“锁定”可渲染,但我不知道该怎么做或者甚至可能。

    使用锁定,我不一定是指使用'lock'-keyword。我的意思是暂时只读它。

    但同样,我不知道该怎么做,如果甚至可以做到这一点。

    有没有人知道如何摆脱这个问题?

    UPDATE1 所以在阅读完评论之后,我试着想办法以正确的方式做到这一点。这就是我想出的:

    • 将属性“ReadyToDispose”添加到IRenderable

    主题1: - 渲染一切 - 检查Dispose所有'ReadyToDispose'对象

    主题2: - 在我目前称为renderable.Dispose()

    的同一个地方将ReadyToDispose设置为true。

    这样,物体在使用后将被丢弃。由于ReadyToDispose只是一个什么也不做的布尔值,因此可渲染方法中的所有值都可用于渲染方法。在渲染之后,可以进行处置以处置必须处理的那些。

    这听起来像是一种可能的解决方案吗?我在尝试之前会问,因为这意味着我必须改变很多东西。在我这样做之前,我想知道这听起来是否合理。

    感谢。

0 个答案:

没有答案