使用期货进行异步加载

时间:2013-12-28 10:14:26

标签: webgl dart

我决定学习Dart,我这样做的项目将是一个小型的webgl游戏。

使用带有aysnc操作和期货的单个线程对我来说是新的,虽然我理解我发现它的概念有点难以知道如何使用它们。

在我的游戏中,我想加载一个webgl GLSL程序。要创建此程序,我首先必须从文件加载顶点着色器和片段着色器。所以我写了这个似乎适用于加载和编译着色器。

我遇到的问题是如何知道两个着色器何时加载,以便我可以创建"程序"来自两个已加载着色器的对象。就像我可以使用的那样。然后从HttpRequest.getString重新编写的未来我需要以某种方式做同样的事情并且在片段和顶点着色器都被加载时运行.then。

我确定我在这里遗漏了一些重要且简单的东西,但这对我来说是新的,我有点挣扎以了解如何使用它。 (这很好,学习新东西很好!)

  //
  // Start the process of loading the shaders. 
  //
  void initShaders()
  {
    Shader vs = gl.createShader(VERTEX_SHADER);
    Shader fs = gl.createShader(FRAGMENT_SHADER);

    var vsFuture = HttpRequest.getString('basic.vert');
    var fsFuture = HttpRequest.getString('basic.frag');

    //
    // When we have the vertex shader source, compile it
    //
    vsFuture.then((src) {
      gl.shaderSource(vs, src);
      gl.compileShader(vs);
      if (!gl.getShaderParameter(vs, COMPILE_STATUS)) {
        throw new Exception(gl.getShaderInfoLog(vs));
      }
      print ('Vertex shader compiled');
    });

    //
    // When we have the fragment shader source, compile it
    //
    fsFuture.then((src) {
      gl.shaderSource(fs, src);
      gl.compileShader(fs);
      if (!gl.getShaderParameter(fs, COMPILE_STATUS)) {
        throw new Exception(gl.getShaderInfoLog(fs));
      }
      print ('Fragment shader compiled');
    });


    //
    // When both the fragment shader and the vertex shader are 
    // compiled, we need to link them. But how do we know??
    //

    ***something... to make this be called when both the vertex and
    fragment shaders are compiled...***
    {
      program = gl.createProgram();
      gl.attachShader(program, fs);
      gl.attachShader(program, ps);
      gl.linkProgram(program);

    }

1 个答案:

答案 0 :(得分:4)

then的所有调用都会返回在执行回调后触发的Future。所以你在编译步骤中有两个期货。之后,您可以使用Future.wait等待期货清单。 wait函数返回在所有输入期货完成后触发的Future

像这样(不完整,但想知道它是如何工作的):

   var vsCompiledFuture = vsFuture.then((src) {
     // Compile
   });

   var fsCompiledFuture = fsFuture.then((src) {
     // Compile
   });

   Future.wait([vsCompiledFuture, fsCompiledFuture]).then((_) {
     // Link here...
   });

如果您从未来的回调中返回已编译的着色器,则Future.wait回调会收到一个包含所有期货结果的列表。