【问题标题】:Slow performance with simple 3d scene简单的 3d 场景性能缓慢
【发布时间】:2020-12-17 16:50:46
【问题描述】:

我正在尝试在 Godot 中创建触手。我尝试在 Blender 中制作它,然后放入骨头,但我无法让它工作,所以我尝试了一些更简单的方法:我有 13 个 CSGMesh(圆柱网格)来表示触手段,每个段都是触手的其余部分。

tentacle
+-> segment1
    +-> segment2
        +-> segmen...

所以我要做的很简单,在每次更新时,我都会来回修改片段的 Z 旋转。效果看起来确实像触手挥舞,但我每秒可能会获得 1-2 帧。场景中没有其他任何东西,所以我觉得我可能做错了什么,虽然我不知道是什么。

我做的事情很简单,但是代码很多,所以相关的部分就在这里:

public class tentacle4 : Spatial
{
    private class SegmentPosition
    {
        // ... I cut out the stuff in here for keeping track of position and rotation speed

        // the actual segment in the scene
        public Spatial Node { get; set; }

        public void RotateZ(float delta)
        { 
            // the bit that actually roates is:
            this.Node.Rotation = new Vector3(0, 0, proposed);
        }
    }

    // No meaningful difference here in performance between
    // this and _PhysicsProcess()
    public override void _Process(float delta)
    {
       foreach (var segment in Segments)
       {
          segment.RotateZ(delta);
       }
    }

}

我做错了什么让它表现如此糟糕?我假设我在管道中的错误时间进行轮换,尽管我不知道什么时候是正确的。我会提到 Godot 中的预览运行得很好,并且在运行项目时(在 GLES2 或 GLES3 中)计算机并没有紧张——CPU (i7-8705) 和 GPU (Vega GL) 似乎都不在乎.

【问题讨论】:

  • 看起来我这样做的方式不正确。我切换到,而不是在每次更新时设置旋转,而是创建一个 Tween 节点并将其设置为 rotation_degrees:z 上的 InterpolateProperty(),这更平滑 - 但它看起来仍然很不稳定。我在每个_Process() 中都放了一个GD.Print(),也就是说delta=0.016,所以我想我得到了60 fps?感觉更像是 20 岁左右。

标签: godot


【解决方案1】:

CSG 节点并不意味着每帧都移动,尤其是在像这样深度嵌套的树中。 CSG 操作很昂贵,而且它们只在 CPU 上执行。仅在实际需要时才使用布尔运算。当您不需要布尔运算时,请改用 MeshInstance。

另外,要使网格变形,您可以查看writing a vertex shader。与 CSG 或脚本不同,着色器代码在 GPU 上运行,速度更快,尤其是在处理大量实例的情况下。

【讨论】:

  • 就是这样。一旦我删除了 CSG 节点并用网格实例替换它们,它就开始变得流畅了:github.com/f00f-nyc/Kraken
猜你喜欢
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多