使用 future 进行异步加载

2023-12-24

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

不过,使用具有异步操作和功能的单线程对我来说是新的,虽然我理解这些概念,但我发现很难知道如何使用它们。

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

我遇到的问题是如何知道两个着色器何时加载,以便我可以从两个加载的着色器创建“程序”对象。就像我可以在将来从 HttpRequest.getString 返回时使用 .then 一样,我需要以某种方式做同样的事情,并有一个 .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);

    }

全部致电then返回一个Futurethen回调执行后触发。所以编译步骤有两个未来。之后您可以使用Future.wait https://api.dartlang.org/docs/channels/stable/latest/dart_async/Future.html#wait等待期货清单。这wait函数返回一个Future在所有输入 future 完成后触发。

像这样的东西(不完整,但了解它是如何工作的):

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 future 进行异步加载 的相关文章

随机推荐

  • Oracle 合并语句和按源/目标条件

    我需要做一个MERGE在 Oracle 中 但我被困住了 在 SQL Server 中 我总是使用BY SOURCE and BY TARGET检查记录存在的位置 然后采取行动 我有点困惑 因为我不知道如何在 PL SQL 中实现相同的目标
  • PHP - 计算字符串中逗号的数量

    如何计算逗号在这样的字符串中出现的次数 A B C D 它应该返回 3 substr count my string 如果您希望将逗号之间的所有元素作为数组获取 您可以随时 splitted explode my string
  • 从模式创建 ERD?

    我被告知要创建一个 ERD 图 给出以下内容 The college keeps track of each student s name student number social security number address phon
  • Ansible 自定义模块:可以打印语句吗?

    我有一个 Ansible 自定义模块 用于在我的剧本中执行特定任务 我想调试该模块内的特定变量 有没有办法可以打印这个自定义模块内的任何内容 在下面的示例中 打印 Hello 请检查自定义模块中的以下代码片段 我正在通过一个jobid作为该
  • 如何查找更改正在监视的对象的调用站点

    AngularJS 允许监听对象的变化 并调用提供给 watch 函数的回调函数 对于像 ngGrid 这样使用 AngularJS 的大型库 对象经常被 监视 一旦调用了监视回调 如何追溯到导致对象发生更改的调用站点 如果不知道是什么导致
  • 如何在 WordPress 中使用 get_current_user_id() ?

    我正在尝试弄清楚如何使用该功能get current user id 适当地 我需要它来分离用户数据 就像普通的 PHP 代码一样 SESSION 我找到了以下代码示例 并将其放入Function php它工作正常 但它似乎在每个页面上执行
  • PHP 查找最高键值的索引

    我有一个数组的数组 我想找到最高键值Rating的数组的索引 例如 下面的数组索引为 1 任何帮助将非常感激 array 3 0 gt array 3 name gt Nola Roman Road rating gt 4 2 price
  • Azure kubernetes - 具有内部负载均衡器的 Istio 控制器

    我有一个带有 Istio 服务网格的 Azure kubernetes 集群 目前 Istio 控制器与公共负载均衡器 IP 关联 我想使用内部负载均衡器配置 Istio 我将使用公共 IP 到内部 LB 的防火墙映射 如何配置 Istio
  • 如何将 GridView.DataSource 导出到数据表或数据集?

    我怎样才能导出GridView DataSource数据表或数据集 假设您的 DataSource 是 DataTable 类型 您可以这样做 myGridView DataSource as DataTable
  • 谷歌云消息传递示例[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人有示例 gcm 服务器端和 android 项目吗 最好有一个解释一切的教程 我尝试查看示例中包含的内容 但未能成功 我有一个 c2d
  • maven-processor-plugin 忽略未定义的符号

    我有 JPA 2 maven 项目 我想处理源以获得静态元模型 我做了什么我拿走了JBoss 的静态元模型处理器 http docs jboss org hibernate stable orm topical html metamodel
  • 帮助循环遍历数组

    我在我的网站上进行了搜索 得到了以下数组 0 gt Array job id gt 4 job title gt Supercar Test Driver salary gt 40000 job tags gt Driving retrai
  • 在代码中复制 SQL Server 数据库

    我有两个 SQL Server 连接字符串 CX 和 CY 我需要做的是 确保 CY 中没有表 备份数据库CX 将其恢复为 CY 还没有找到我要找的东西 我不需要工具来执行此操作 我需要在运行时用 C 代码执行此操作 因为添加新客户端的操作
  • G++ 总是因对 _Unwind_GetIPInfo 的未定义引用而失败

    我刚刚在我的 Asus EeePC 上网本上升级到 Ubuntu 11 04 并且遇到了 G 问题 使用 G 编译任何程序 即使是简单的 Hello World 无论是使用 iostream cstdio 还是 stdio h 都会失败并显
  • 如何从子元素中删除 data-target 和 data-toggle 或禁用元素触发事件?

    HTML div class card panel span class white text text span div class card action each tags div class chip div div div
  • 如何使用 int 值将项目添加到表视图

    如何将数字添加到表格单元格并将数字添加到总标签 w当我添加像 ps2 这样的商品时 我怎样才能将价格添加到表格单元格并将其添加到我的总标签中 这是我三周以来一直试图解决的问题 到目前为止我的桌子 我的 ViewController swif
  • 通过 JSONProvider 重用类型定义?

    我正在使用 FSharp Data 中的 JSONProvider 自动为我使用来自服务的示例响应来使用的 Web 服务创建类型 然而 当涉及到在服务中重用的类型时 我有点困惑 例如 有一个 api 方法返回 X 类型的单个项目 而另一个返
  • SvelteKit 与 MongoDB ReferenceError:全局未定义

    我正在尝试设置 MongoDB 连接库功能 我知道这个功能很可靠 它用在很多地方 搜索此处使用 Global 来维护跨热重载的缓存连接 并且您会发现很多用途 包括 next js 版本 请注意 数据库连接全局存储的目的是减少任一时间使用的数
  • 证明二叉堆构建最大比较是(2N-2)

    我试图证明对于二进制堆 buildHeap 最多会在元素之间进行 2N 2 次比较 我发现很难证明这一说法 构建堆算法从中点开始 并根据需要向下移动项目 让我们考虑 127 个项目 7 个级别 的堆 在最坏的情况下 64 nodes the
  • 使用 future 进行异步加载

    我决定学习 Dart 我的项目是一个小型的 webgl 游戏 不过 使用具有异步操作和功能的单线程对我来说是新的 虽然我理解这些概念 但我发现很难知道如何使用它们 在我的游戏中我想加载一个 webgl GLSL 程序 要创建这个程序 我首先