我有一个问题,其中一对三维数组分配了大量的内存,程序有时需要用更大/更小的替换它们并抛出OutOfMemoryException.
示例:有5个分配的96MB阵列(200x200x200,每个条目中有12个字节的数据),程序需要用210x210x210(111MB)替换它们.它以类似于此的方式执行:
array1 = new Vector3[210,210,210];
Run Code Online (Sandbox Code Playgroud)
其中array1-array5与先前使用的字段相同.这应该将旧数组设置为垃圾收集的候选者,但是看起来GC不能足够快地执行并且在分配新数组之前分配旧数组 - 这会导致OOM - 而如果它们在新分配之前释放,则空间应该是足够.
我正在寻找的是一种做这样的事情的方法:
GC.Collect(array1) // this would set the reference to null and free the memory
array1 = new Vector3[210,210,210];
Run Code Online (Sandbox Code Playgroud)
我不确定完整的垃圾收集是否是一个好主意,因为该代码可能(在某些情况下)需要经常执行.
有没有正确的方法呢?
我正在使用Visual C#2010 Express(最终版,而不是测试版或其他版本),我在调试时遇到模糊字体问题.字体在任何地方都显得正常(智能感知,菜单,代码)但是当达到断点时,大多数与调试器相关的文本都是模糊的(Locals,Call Stack,"data tooltips").
以下是正常文本和调试时模糊文本的屏幕截图:http: //img682.imageshack.us/i/normalh.png/
http://img145.imageshack.us/i/blurry.png/
这是一个已知的bug还是与我的系统有关的东西?有办法解决吗?
我知道泛型在C#中履行类似于C++模板的角色,但我真的需要一种在编译时生成一些代码的方法 - 在这种特殊情况下,用C++模板解决问题会非常容易.
有谁知道任何替代品?也许一个VS插件预处理代码或类似的东西?它不需要非常复杂,我只需要在编译时生成一些方法.
这是C++中一个非常简化的例子(请注意,这个方法将在具有各种条件的紧密循环中调用,而不仅仅是"高级",并且这些条件每帧只会改变一次 - 使用if会太慢并且编写所有替代方法用手不可能维持).还要注意性能非常重要,这就是我需要在编译时生成它的原因.
template <bool Advanced>
int TraceRay( Ray r )
{
do
{
if ( WalkAndTestCollision( r ) )
{
if ( Advanced )
return AdvancedShade( collision );
else
return SimpleShade( collision );
}
}
while ( InsideScene( r ) );
}
Run Code Online (Sandbox Code Playgroud) .NET 4.0意味着与3.5并行运行,并且不会运行3.5个应用程序,这让我担心必须指示我的用户下载.NET 3.5而不仅仅是"最新版本".
我在博客中看到4.0安装程序也将安装3.5,如果它还没有安装但我现在无法测试,有没有人试过这个或者从可靠来源得到答案?
我想paralelize建立在Windows窗体顶部的3D体素编辑器,它采用了raycaster来呈现这样将屏幕并获得在池中的每个线程渲染它的一部分应该是微不足道的.
问题出现在Windows窗体的线程必须作为STA运行 - 我可以让其他线程启动并完成工作但在等待它们完成时阻塞主线程导致奇怪的随机死锁如预期的那样.
保持主线程不被阻塞也是一个问题 - 例如,如果用户使用填充工具,则在渲染过程中将处理输入,这将导致"中间"图像(例如,部分着色的对象).在每帧之前复制整个图像是不可行的,因为如果必须每帧复制,则卷足够大以抵消任何性能增益.
我想知道是否有任何解决方法可以让amin线程以不会被实际阻止的方式阻止用户,但会将输入处理延迟到下一帧.
如果不可能,有没有更好的设计来处理这个?
编辑:阅读原文我认为我不清楚raycaster是否实时运行,因此显示进度对话框根本不起作用.不幸的是,帧之间的输入FPS足够低(5-40取决于各种因素)以产生不希望的结果.
我已经尝试实现它阻止UI线程并使用ThreadPool的一些线程进行处理,除了STA的这个问题之外它工作正常.