小编sel*_*guy的帖子

XNA/Mono效果投掷运行时强制转换异常

作为前言,完全相同的代码在XNA中工作得很好,但是Monogame会引发异常.这可能需要熟悉Monogame渲染管道的人.

在我的游戏的Draw部分中,有一个ShadowmapResolver渲染出一个纹理,它是给定光源的最终计算光模式.从什么本质上呈现时,它的接收异常EffectPass.Apply()抱怨从某处内单从那里有一个尝试投int32[]Single[].这是我的代码调用它:

private void ExecuteTechnique(Texture2D source, RenderTarget2D destination,
                              string techniqueName, Texture2D shadowMap)
{
    graphicsDevice.SetRenderTarget(destination);
    graphicsDevice.Clear(Color.Transparent);

    resolveShadowsEffect.Parameters["renderTargetSizeX"].SetValue((float)baseSizeX);
    resolveShadowsEffect.Parameters["renderTargetSizeY"].SetValue((float)baseSizeY);

    if (source != null)
        resolveShadowsEffect.Parameters["InputTexture"].SetValue(source);
    if (shadowMap != null)
        resolveShadowsEffect.Parameters["ShadowMapTexture"].SetValue(shadowMap);

    resolveShadowsEffect.CurrentTechnique = resolveShadowsEffect
        .Techniques[techniqueName];

    try
    {
        foreach (EffectPass pass in resolveShadowsEffect.CurrentTechnique.Passes)
        {
            pass.Apply(); // <--- InvalidCastException re-enters my program here
            quadRender.Render(Vector2.One * -1, Vector2.One);
        }
    }
    catch (Exception ex)
    {
        Util.Log(LogManager.LogLevel.Critical, ex.Message);
    }
    graphicsDevice.SetRenderTarget(null);
}
Run Code Online (Sandbox Code Playgroud)

这是堆栈跟踪:

at Microsoft.Xna.Framework.Graphics.ConstantBuffer.SetData(Int32 offset, Int32 rows, Int32 columns, Object data)
   at Microsoft.Xna.Framework.Graphics.ConstantBuffer.SetParameter(Int32 …
Run Code Online (Sandbox Code Playgroud)

c# xna monogame

7
推荐指数
1
解决办法
440
查看次数

数组内的分段聚合

我有一大堆原始价值类型.该阵列实际上是一维的,但在逻辑上代表一个二维场.当您从左向右阅读时,值需要变为(当前单元格的原始值)+(在左侧单元格中计算的结果).显然除了每行的第一个元素外,它只是原始值.

我已经有了一个实现它的实现,但是在整个数组上完全迭代,对于大型(1M +元素)数组来说非常慢.

给出以下示例数组,

0 0 1 0 0
2 0 0 0 3
0 4 1 1 0
0 1 0 4 1
Run Code Online (Sandbox Code Playgroud)

0 0 1 1 1
2 2 2 2 5
0 4 5 6 6
0 1 1 5 6
Run Code Online (Sandbox Code Playgroud)

等等,直到有问题的尺寸(1024x1024)

需要更新阵列(理想情况下),但必要时可以使用另一个阵列.内存占用空间不是问题,但性能至关重要,因为这些阵列具有数百万个元素,每秒必须处理数百次.

单个单元格计算似乎不可并行化,因为它们依赖于从左侧开始的值,因此GPU加速似乎是不可能的.我已经研究过PLINQ,但索引的必要条件使得它很难实现.

是否有另一种方法来构建数据以使其更快地处理?

如果使用创新的技术可以实现高效的GPU处理,那么这将是非常可取的,因为这是当前必须从视频卡中拉出并推回到视频卡的纹理数据.

c# arrays parallel-processing

7
推荐指数
1
解决办法
211
查看次数

C#链接参数函数调用

是否有可能在C#中接受一个params参数,然后将其作为params列表传递给另一个函数?如上所述,如果我没有弄错的话,下面的函数将args作为一个类型数组的单个参数传递object.这里的目标是不言而喻的.

//ScriptEngine
public object[] Call(string fnName, params object[] args)
{
    try{
        return lua.GetFunction(fnName).Call(args);
    }
    catch (Exception ex)
    {
        Util.Log(LogManager.LogLevel.Error, "Call to Lua failed: "+ex.Message);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

lua.GetFunction(fnName).Call(args);是对我的代码之外的调用,它接受param object[].

c# wrapper params

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

标签 统计

c# ×3

arrays ×1

monogame ×1

parallel-processing ×1

params ×1

wrapper ×1

xna ×1