在为基于图块的游戏编程随机级别生成器时,我遇到了一个有趣的问题.我为它实现了一个强力求解器,但它指数速度慢,绝对不适合我的用例.我不一定在寻找一个完美的解决方案,我会对一个表现良好的"足够好"的解决方案感到满意.
问题陈述:
假设您有以下可用的全部或部分可用(这是映射到右,上,左和下方向的所有可能的4位模式的组合):
alt text http://img189.imageshack.us/img189/3713/basetileset.png
您将获得一个网格,其中一些单元格被标记(true)而另一些单元格未被标记(false).例如,这可以通过perlin噪声算法生成.目标是用瓷砖填充这个空间,以便有尽可能多的复杂瓷砖.理想情况下,应连接所有瓷砖.某些输入值可能没有解决方案(可用的tile + pattern).如果左上角,未连接的图块可用(即,所有图案单元格可以用该图块填充),则始终存在至少一个解决方案.
例:
图像从左到右:图块可用性(可以使用绿色图块,红色图案不可用),图案填充和解决方案
alt text http://img806.imageshack.us/img806/2391/sampletileset.png + alt text http://img841.imageshack.us/img841/7/samplepattern.png = alt text http://img690.imageshack.我们/ img690/2585/samplesolution.png
我尝试了什么:
我的蛮力实施尝试了所有可能的区域,并跟踪找到的解决方案.最后,它选择最大化从每个图块传出的连接总数的解决方案.对于图案中的图块数量,所花费的时间是指数的.12个图块的图案需要几秒钟才能解决.
笔记:
正如我所说,表现比完美更重要.但是,必须正确连接最终解决方案(没有指向不指向原始图块的图块的图块).为了了解范围,我想在大约2秒内处理100个图块的模式.
我有一些代码本地win32.自从我升级到.NET 4以来,代码开始抛出一个MethodAccessException:
通过安全透明方法'Tek.Audio.Midi.MidiDevice.GetDevices()'尝试通过方法'Tek.Native.Windows.Multimedia.midiInGetNumDevs()'调用本机代码失败.对于调用本机代码,方法必须是安全关键或安全性安全关键.
这是发生了什么:
Program.Main
方法调用library1 public staticTek.Audio.Midi.MidiDevice.GetDevices()
GetDevices()
调用library2的公共静态pinvoke Tek.Native.Windows.Multimedia.midiInGetNumDevs()
(是的,不好的做法,无论如何)涉及的类,方法和程序集上唯一与安全相关的属性是library1上的AllowPartiallyTrustedCallers,我甚至不知道原因.
令我感到羞耻的是,我承认我对.NET的安全性一无所知.我该怎么做才能防止这种异常?虽然我在这里,有什么好文章可以让我开始使用.NET安全性吗?
我正在编写一个使用System.Reflection.Emit
API 生成磁盘上.NET程序集的编译器.编译器本身是针对.NET 4.5构建的,但生成的代码仅引用可移植类库中的类型.但是,当尝试从Windows Phone 8项目引用生成的程序集时,Visual Studio会抱怨这一点A reference to a higher version or incompatible assembly cannot be added to the project
.
在反编译器中打开生成的程序集时,我可以看到它引用了两个PCL加上mscorlib 4.0.0.0
,而我理解PCL应该引用mscorlib 2.0.5.0
.
有没有办法让System.Reflection.Emit
API生成PCL,或者是我唯一的选择迁移到Mono.Cecil
?
该Intel® 64 and IA-32 Software Developer's Manual, Volume 2A, Section 3.1.1.1
提到的符号ct
来表示操作码之后的10字节值.然而,我无法找到任何用它注释的指令.我错过了什么或没有指令采用10字节的立即值?
下面的代码片段会调用复制构造函数,我希望调用移动构造函数:
#include <cstdio>
struct Foo
{
Foo() { puts("Foo gets built!"); }
Foo(const Foo& foo) { puts("Foo gets copied!"); }
Foo(Foo&& foo) { puts("Foo gets moved!"); }
};
struct Bar { Foo foo; };
Bar Meow() { Bar bar; return bar; }
int main() { Bar bar(Meow()); }
Run Code Online (Sandbox Code Playgroud)
在VS11 Beta上,在调试模式下,打印:
Foo gets built!
Foo gets copied!
Foo gets copied!
Run Code Online (Sandbox Code Playgroud)
我检查了标准,并且Bar
似乎满足了自动生成默认移动构造函数的所有要求,但这似乎不会发生,除非有另一个原因导致无法移动对象.我在这里看到了很多移动和复制构造函数相关的问题,但我认为没有人遇到过这个具体问题.
关于这里发生了什么的任何指示?这是标准行为吗?
我最近迁移了许多手动前提条件测试和代码合同的异常抛出.而不是升级到.NET 4,我一直在使用Microsoft.Contracts.dll
程序集,所以我可以坚持使用.NET 3.5(这是一个由.NET 3.5和.NET 4程序集使用的库).我在Visual Studio 2010中设置了合同重写器,合同工作正常.
但是,因为我已经完成了那个开关,所以我注意到调试器在带有契约的方法中表现得很有趣,特别是在具有ContractInvariantMethod的类中.执行游标似乎并不总是与突出显示的行匹配,一些断点无法被命中,我有一个方法,调试器无法告诉本地变量名称,并显示类似的东西CS$1$0000
.这是在调试版本中.
Microsoft.Contracts.dll
在.NET 3.5到VS10中使用代码契约是否存在已知问题?.NET 4中的代码合同是否会出现类似的问题?
[编辑]这个问题让我在Microsoft Connect上创建了一个错误:https://connect.microsoft.com/VisualStudio/feedback/details/573983/code-contract-rewriting-messes-up-local-variable-names-in -迭代器的方法,同时调试
我已成功使用MEF获取导出的类实例.但是,我遇到了一种情况,我需要枚举一组导出的派生类而不实例化它们.我查了一下CompositionContainer
文档,它似乎只能返回对象实例.
我知道我可以在每个派生类中有一个静态Type字段并导出它,或者做我自己的反射,但是我想知道是否有一种内置方法来标记具有该[Export]
属性的类,然后枚举它们System.Type
.
我正在Windows上学习x64汇编以获得"有趣".Windows上x64调用约定的MSDN文档说:
调用者负责为被调用者分配参数空间,并且必须始终为4个寄存器参数分配足够的空间,即使被调用者没有那么多参数也是如此.这有助于简化支持C非原型函数和vararg C/C++函数.
由于我的功能是不是C unprototyped函数或可变参数的C/C++函数,这是否意味着我可以一直使用[rsp+8]
到[rsp+32]
(假设未修改的价值rsp
我的函数中调用后右)通用存储,如为局部变量?
我一直在玩 Direct3D 11,并惊讶地发现 HLSLStructuredBuffer<T>
必须绑定到着色器资源视图 (SRV),而RWStructuredBuffer<T>
必须绑定到统一访问视图 (UAV)。深入研究这一点,似乎所有读写着色器资源都需要 UAV,而只读资源需要 SRV。
比较UNORDERED_ACCESS_VIEW_DESC和SHADER_RESOURCE_VIEW_DESC结构,UAV 或多或少是用描述 SRV 的信息子集来描述的。将 UAV 和 SRV 设置为流水线阶段的 API 也非常相似。甚至两个接口的文档看起来也像是由两个不同的技术作者解释的相同概念:
我不是很精通 D3D11,但在我看来,无人机的概念使 API 变得复杂而没有太多好处。SRV 和 UAV 之间的区别是为了更好地映射到硬件还是因为技术限制?或者这只是一个 API 设计决策?
考虑以下代码:
struct foo
{
static constexpr int value = 42;
};
void bar(const int* value) { std::cout << *value; }
int main() { bar(&foo::value); }
Run Code Online (Sandbox Code Playgroud)
编译没有问题,并没有在警告夫妇的在线编译器我试过了.鉴于没有.cpp
定义该constexpr
值的单个文件,如果bar
从不同的编译单元调用该方法,指针的值是否可以不同?或者标准是否保证值最终只在所有编译单元中分配一次(即隐式_declspec(selectany)
)?