小编Mar*_*tin的帖子

将结构传递给接口字段是否分配?

我有一个像这样的结构

struct MyStructure
    :IFoo
{
}
Run Code Online (Sandbox Code Playgroud)

和这样的方法:

public BarThisFoo(IFoo a)
{

}
Run Code Online (Sandbox Code Playgroud)

我的问题是将结构传递给该方法的"框"结构,从而导致垃圾分配?

附录:在有人说之前,垃圾收集在这个应用程序中不是免费的,它实际上对垃圾收集非常敏感,所以免费分配代码很重要.

c# garbage-collection

3
推荐指数
3
解决办法
560
查看次数

构造颜色以获得最大对比度

我想在屏幕上绘制一些项目,每个项目都在N套中.集合的数量一直在变化,因此我需要计算尽可能不同的N种不同的颜色(以便于识别哪个集合中的内容).

因此,例如,当N = 2时,我的结果将是黑色和白色.有三个我猜我会全红,全绿,全蓝.对于所有四个人来说,正确的答案是不太明显的,这就是我遇到麻烦的地方.

编辑::显而易见的方法是将0映射到红色,将1映射到绿色,将其间的所有颜色映射到适当的彩虹颜色,然后通过GetRainbowColour(N/TotalSets)获得集合N的颜色,因此GetRainbowColour方法就是解决这个问题所需要的

language-agnostic algorithm math graphics colors

3
推荐指数
2
解决办法
2066
查看次数

逆向工程贝塞尔曲线

给定贝塞尔曲线上的一些采样点,是否可以计算出这些点可能存在的可能曲线集?

在我的特定应用程序中,曲线可能有一组有限的端点,所以我想生成一组可能的曲线,枚举所有曲线并挑选出可能在有效终点上结束的所有曲线.

有些人要求提供更多细节.我知道有一组点在二次贝塞尔曲线上,我想计算曲线的公式,并能够推断出曲线上的新点.

language-agnostic algorithm math bezier

3
推荐指数
1
解决办法
3425
查看次数

以两个字节查找公共前缀的长度

给定两个字节,如何在两个字节的开头找到公共位的长度.

例如:

9 == 00001001
6 == 00000110

Common prefix is 0000, length 4
Run Code Online (Sandbox Code Playgroud)

我在C#工作,所以请坚持使用C#操作.

附录:这段特殊的代码将运行数千次,并且需要非常快.

c# bit-manipulation bitfoo

3
推荐指数
2
解决办法
754
查看次数

Protobuf.net“一旦生成序列化程序就不能更改类型”

我有一些使用 Protobuf.net 的相当简单的代码,它抛出了一个非常奇怪的异常。在第 167 行的 MetaType.cs 中,它抛出 InvalidOperationException “一旦生成序列化程序,就无法更改类型”。这是什么意思,我该如何解决?

我的代码如下所示:

这个方法开始所有的序列化:

while (!Parallel.For(0, 100, (i) =>
{
    Widget w;
    lock (f) { w = f.CreateWidget(); }

    SerialiseWidget(w);

}).IsCompleted)
{
    Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)

非常简单,它只是在 Parallel 中遍历所有内容,并序列化 100 个小部件。

serialise 方法也很简单:

private byte[] SerialiseWidget(Widget w)
{
    using (MemoryStream m = new MemoryStream())
    {
        Serializer.Serialize<PacketChunk>(m, w);

        return m.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,小部件类如下所示:

[ProtoContract]
private class Widget
{
    [ProtoMember(1)]
    public int a;

    [ProtoMember(2)]
    public byte[] b;

    [ProtoMember(3)]
    public Thing c; //Thing is itself a protocontract

    [ProtoMember(4)] …
Run Code Online (Sandbox Code Playgroud)

.net c# debugging protobuf-net

3
推荐指数
1
解决办法
1833
查看次数

协议缓冲区数组中浪费的字节数?

我有一个像这样的协议缓冲区设置:

[ProtoContract]
Foo
{
    [ProtoMember(1)]
    Bar[] Bars;
}
Run Code Online (Sandbox Code Playgroud)

单个Bar被编码为67字节的协议缓冲区.这听起来是正确的,因为我知道Bar几乎只是一个64字节的数组,然后有3个字节的开销用于长度前缀.

但是,当我使用20 Bars的数组编码Foo时,需要1362个字节.20*67是1340,所以只有22个字节的开销用于编码数组!

为什么这会占用这么多空间?我能做些什么来减少它吗?

c# protocol-buffers protobuf-net

3
推荐指数
1
解决办法
1932
查看次数

System.Drawing.Bitmap 包含比预期更多的数据

我有一种方法可以将数据从 System.Drawing.Bitmap 中复制出来,如下所示:

var readLock = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
byte[] data = new byte[3 * image.Width * image.Height];
if (data.Length != readLock.Stride * readLock.Height)
    throw new InvalidOperationException("Incorrect number of bytes");
Marshal.Copy(readLock.Scan0, data , 0, data.Length);
image.UnlockBits(readLock);
Run Code Online (Sandbox Code Playgroud)

非常简单,它适用于我的大多数图像。但是,对于非常小的图像 (14x14),它会遇到异常。在失败的情况下,Stride 是 44,而不是预期的 42 (14 * 3)。

像素格式为 Format24bppRgb,因此图像中的每个像素应该有三个字节。这些额外的字节来自哪里,在处理图像数据时如何处理它们?

对于任何感兴趣的人,我正在从高度图生成法线数据,因此我需要能够准确地获取每个像素及其邻居)。

c# graphics gdi+

3
推荐指数
1
解决办法
267
查看次数

将球体投影到立方体上

我正在制作一个行星上的游戏,我计划存储数据的方式是6个二维数组,这是围绕球体的高度图(在立方体的面上).我遇到的问题是,给定一个从球体中心向外指向的归一化向量,我如何确定这两个方面:

  1. 它相交的平面
  2. x/y坐标我应该在我的2d数组中查找以获得高度.

我目前的解决方案是这个(使用XNA):

  1. 构造一条沿着提供的方向向量从[0,0]指向的光线.遍历每个表面并执行光线/平面交叉(这是XNA框架提供的方法)以获得到交叉点的距离.选择最近的平面(到交叉点的最短距离)
  2. 取3D点,并将其转换为2D点,可用作数组查找以找到半径(这是我无法计算数学的位,或通过谷歌找到任何引用).

一个有用的约束是球体/立方体系统位于原点附近.

因此,需要解决的问题是: 给定方向向量,如何确定它与周围立方体的交叉点.使用此结果,我如何在2D立方体中获取正确的值,该数组在此立方体的表面上"绘制"?

c# math 3d xna

2
推荐指数
1
解决办法
1697
查看次数

散列集中的重复元素

我目前有一个hashsets的问题.我有不可变的类,只包含一个项目,当我将两个不同的类添加到相同的数据到一个哈希集时,我在集合中得到它们.这很奇怪,因为我在基类和超类上都重载了Equals和GetHashCode.

public abstract class Contact :IEquatable<Contact>
{
    public readonly BigInteger Id;

    public Contact(BigInteger id) { this.Id = id; }

    public abstract bool Equals(Contact other);

    public abstract int GetHashCode();

    public abstract bool Equals(object obj);
}
Run Code Online (Sandbox Code Playgroud)

而继承类:

public class KeyOnlyContact :Contact, IEquatable<KeyOnlyContact>
{
    public KeyOnlyContact(BigInteger id) :base(id) { }

    public override bool Equals(object obj)
    {
        if (obj is KeyOnlyContact)
            return Equals(obj as KeyOnlyContact);
        else if (obj is Contact)
            return Equals(obj as Contact);
        else
            return (this as object).Equals(obj);
    }

    public override bool Equals(Contact …
Run Code Online (Sandbox Code Playgroud)

.net c# debugging hashset

2
推荐指数
1
解决办法
3374
查看次数

如何最好地减少数据存储区使用的CPU时间

我有一个cron作业,我每三分钟运行一次,从远程API中提取一些数据,然后将其存储在我的本地数据存储区中.但是,这会在数据存储区放置操作中占用大量CPU时间.我怀疑我可能正在做一些非常愚蠢的事情,可以进行大量优化:

result = urllib2.urlopen(url).read()
foos = json.loads(result)['foo']
bars = json.loads(result)['bar']

models = []
for foo in foos:
    d = FooContainer()
    d.Property = foo.Value #in real code, this is setting a load of values based off foo     
    models.append(d)

for bar in bars:
    d = BarContainer()
    d.Property = bar.Value #in real code, this is setting a load of properties based off bar
    models.append(d)

db.put(models)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将每个数据存储在本地数据存储表中作为新的"行"存储.是否有一些技术可以用来减少这个cron作业使用的巨大数据存储CPU时间?

optimization google-app-engine datastore

2
推荐指数
1
解决办法
534
查看次数