统一缓冲区和常量缓冲区有什么区别?
它们是完全独立的还是可以将制服视为在恒定缓冲区中?换句话说,如果你想设置一个uniform,你需要一个常量缓冲区还是有其他方法?
我问这个问题是因为我有四个变量(float2平移、float缩放和float旋转),它们很可能不会同时改变。我是否需要一个恒定的缓冲区来一次设置它们,或者如果可能的话,单独设置它们是否更好?
我需要一个动态长度的数据结构,能够更改元素值.元素的顺序并不重要.
如果我使用数组我可以修改我的元素,但我的长度有问题.解决方案是创建一个正确大小的新数组,并每次将所有元素复制到新数组中.不是一个好主意,因为元素的数量经常变化.
最好使用通用列表,但修改过程非常复杂:首先我需要删除我想要更改的元素 - 通用列表似乎没有简单的"删除"/"删除"方法,所以我尝试了"过滤器" - 然后将修改后的元素添加到头部.它有效,但对于这么简单的事情来说有点太复杂了.
是否有一个数据结构允许我动态更改长度并修改元素,如可修改列表或动态大小的数组?
InitializeQTML是QTML.h中的一个函数.我正在编写一个包装器,我想使用名称InitializeQTML作为包装器函数:
#include <QTML.h>
public class QuickTime
{
public:
static void InitializeQTML(InitializationFlags flag) {
InitializeQTML((long)flag));
};
};
Run Code Online (Sandbox Code Playgroud)
如何从包装函数中引用原始的InitializeQTML函数并避免名称冲突而不重命名包装器?
我有各种项目类型的集合列表.列表输入为List<IEnumerable>; 因为IEnumerable是唯一的非通用接口ICollection<T>,我需要在此列表中添加eg ICollection<Contact>和ICollection<Partnership>collections.
稍后,在实体实用程序代码中,我需要清除集合.到目前为止我找到的唯一解决方案是:
collection.GetType().GetInterface("ICollection`1").InvokeMember("Clear",
BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod,
null,
collection,
new object[0]);
Run Code Online (Sandbox Code Playgroud)
我可以使用更优雅的东西吗?
我一直在学习CQRS/ES.看一下小例子项目,我经常看到事件改变了实体状态.例如,如果我们查看Order 聚合根:
public class Order : AggregateRoot {
private void Apply(OrderLineAddedEvent @event) {
var existingLine = this.OrderLines.FirstOrDefault(
i => i.ProductId == @event.ProductId);
if(existingLine != null) {
existingLine.AddToQuantity(@event.Quantity);
return;
}
this.OrderLines.Add(new OrderLine(@event.ProductId, @event.ProductTitle, @event.PricePerUnit, @event.Quantity));
}
public ICollection<OrderLine> OrderLines { get; private set; }
public void AddOrderLine(/*parameters*/) {
this.Apply(new OrderLineAddedEvent(/*parameters*/));
}
public Order() {
this.OrderLines = new List<OrderLine>();
}
public Order(IEnumerable<IEvent> history) {
foreach(IEvent @event in history) {
this.ApplyChange(@event, false);
}
}
} …Run Code Online (Sandbox Code Playgroud) 我试图在Windows上的MonoGame GL中完成我认为非常简单的事情.那就是从PNG文件加载纹理并将其作为精灵渲染到屏幕上.到目前为止,我遇到了很多麻烦.我正在使用以下代码(F#)将PNG加载到Texture2D:
use file = System.IO.File.OpenRead("testTexture.png")
this.texture <- Texture2D.FromStream(this.GraphicsDevice, file)
Run Code Online (Sandbox Code Playgroud)
然后渲染:
this.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
this.spriteBatch.Draw(this.texture, Vector2.Zero, Color.White)
this.spriteBatch.End()
Run Code Online (Sandbox Code Playgroud)
这个问题是对alpha通道有一些奇怪的影响,好像有些东西没有通过alpha预乘或某些东西,但我无法准确确定发生了什么.值得注意的是,完全相同的代码使用官方XNA库完美呈现.这个问题只出现在MonoGame中,我使用3.0和3.2版进行了测试,两者都有相同的问题.
这是在MonoGame中渲染测试PNG来说明问题:

每个图像中的背景是矢车菊蓝色,然后分别是纯红色,绿色和蓝色.请注意,在带有红色背景的图像中,您可以看到纹理中红色线条周围的黑色轮廓.由于线条和背景都是纯红色,因此不应该出现此轮廓.请注意,具有蓝色背景的图像中的蓝线周围会出现相同的情况,但绿色背景的图像中则不会出现相同的情况.在该图像中,绿线与绿色背景融为一体.
下面是使用官方XNA库完全相同的文件呈现方式.

注意当背景颜色相同时,蓝色,绿色和红色线如何融入背景.这是正确的行为.
鉴于相同的代码在XNA和MonoGame中表现不同,我相信框架中必定存在错误.任何人都可以对这个错误的位置和性质有什么好的猜测吗?如果这是一个简单的解决方案,那么最好的解决方案可能就是自己解决这个问题.
除此之外,我真的只是想学习一种方法,我可以简单地加载PNG并将其正确地渲染到MonoGame的屏幕上.我敢肯定,我不能成为第一个想要这样做的人.我想尽可能避免使用内容管道,只是为了简单起见.
我已经做了一些挖掘,试图弄清楚这个问题的本质.我已经更改了testTexture.png文件,以便更多地揭示alpha混合问题.使用这个新的纹理文件后,我拍摄了不正确的MonoGame渲染的截图,并在其单独的颜色通道中查看.发生的事情让我非常困惑.我最初虽然可能是一个BlendState.NonPremultiplied被忽略的简单案例,但我所看到的看起来更复杂.除此之外,绿色通道似乎与蓝色和红色通道的混合方式不同.这是一个相当大的PNG图像,它是关于我正在谈论的截图和解释的汇编:
i.imgur.com/CEUQqm0.png
显然,MonoGame for Windows GL中存在某种错误,可能还有其他版本我没试过这个版本(虽然我有兴趣看看已经验证过).如果有人认为他们知道这里可能会发生什么,请告诉我.
最后,这是重现我遇到的问题的项目文件:
mega.co.nz/#!llFxBbrb!OrpPIn4Tu2UaHHuoSPL03nqOtAJFK59cfxI5TDzLyYI
此代码每100毫秒运行一次.内存使用率不断增加,直到达到1.5 GB然后崩溃.
void takeScreenShot()
{
Surface s;
s = CaptureScreen();
pictureBox1.Image = new Bitmap(Surface.ToStream(s, ImageFileFormat.Bmp));
s.Dispose();
}
public Surface CaptureScreen()
{
int width = Screen.PrimaryScreen.Bounds.Width;
int height = Screen.PrimaryScreen.Bounds.Height;
Device device = new Device(new Direct3D(), 0, DeviceType.Hardware, IntPtr.Zero, CreateFlags.HardwareVertexProcessing, new PresentParameters(width, height));
DisplayMode disp = device.GetDisplayMode(0);
Surface s = Surface.CreateOffscreenPlain(device, disp.Width, disp.Height, Format.A8R8G8B8, Pool.Scratch);
device.GetFrontBufferData(0, s);
return s;
}
Run Code Online (Sandbox Code Playgroud) 我正在将存储为嵌入式资源的本机exe写入Path.GetTempFileName返回的文件中。该功能是理想的,因为它让我忽略了避免竞争情况的实现细节。唯一的缺点是它将返回带有扩展名的文件名.tmp。
Process.Start在我的系统上的记事本中打开tmp-named-exe文件。显然,您可以使用p / invoke手动指定类和动词(请参阅/sf/answers/887685361/)。在我这样做之前,是否有任何方法可以使用.NET框架来完成同一件事?
这两种方法的工作方式是否相同?这两个都阻塞了主线程,不是吗?
// 1. Use async method
public IEnumerable<Entity> AsyncMethod()
{
return Context.Entities.ToListAsync().Result;
}
// 2. Use sync method
public IEnumerable<Entity> SyncMethod()
{
return Context.Entities.ToList();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用纹理图集来保存一系列图像.当映射到网格时MeshLambertMaterial,使用Texture.offset并Texture.repeat精美地工作以从整个图像中剪切出子纹理.
但是,使用完全相同的纹理实例可以PointCloudMaterial使用整个图集渲染粒子,而不仅仅是选定的子图像.
我试图遵循three.js源代码,但文档很少.
有没有比使用画布切割图像更好的解决方法?
编辑:根据要求,可在http://jnm2.com/minesweeper/上获取正在进行的工作.