使用 C# 5 异步等待在多个游戏帧上执行的内容

2024-03-19

我儿子正在编写一个简单的 RPG 游戏,其中有许多非玩家角色(又名 NPC)。每个 NPC 都有一个相关的“脚本”来控制其行为。我们将使用迷你自定义脚本语言来编写这些行为,但我现在想知道在 C#5/Async 中是否会更好。

举一个非常简单的例子,假设其中一个 NPC 只是在两点之间行走,我想写这样的东西会很好:

while (true)
{
    await WalkTo(100,100);
    await WalkTo(200,200);
}

WalkTo 方法是一个异步方法,它处理与在两点之间行走有关的所有事情,并在游戏循环中的多个帧上执行此操作。它不是一种可以卸载到后台线程的阻塞方法。

这就是我陷入困境的地方......我还没有找到任何以这种方式使用 async/await 的例子,但它似乎是完美的。

Ideas?


这是我想做的一些非常粗略的伪代码:

class NpcBase
{

    // Called from game loop
    public void onUpdate(double elapsedTime)
    {
        // Move the NPC
        .
        .
        .


        // Arrived at destination?
        if (Arrived)
        {
            // How do I trigger that the task is finished?
            _currentTask.MarkComplete();        
        }

    }


    // Async method called by NPC "script"
    public async Task WalkTo(int x, int y)
    {
        // Store new target location


        // return a task object that will be "triggered" when the walk is finished
        _currentTask = <something??>
        return _currentTask;
    }

    Task _currentTask;

}

好吧,听起来一个选择是TaskCompletionSource http://msdn.microsoft.com/en-us/library/dd449174.aspx对于游戏的每一帧。然后您可以等待Task http://msdn.microsoft.com/en-us/library/dd449187.aspx from WalkTo,并将结果设置为OnUpdate:

private TaskCompletionSource<double> currentFrameSource;

// Called from game loop
public void OnUpdate(double elapsedTime)
{
    ...
    var previousFrameSource = currentFrameSource;
    currentFrameSource = new TaskCompletionSource<double>();
    // This will trigger all the continuations...
    previousFrameSource.SetResult(elapsedTime);
}

// Async method called by NPC "script"
public async Task WalkTo(int x, int y)
{
    // Store new target location
    while (/* we're not there yet */)
    {
        double currentTime = await currentFrameSource.Task;
        // Move
    }
}

诚然,我不确定这会有多有效……但它应该有效。

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

使用 C# 5 异步等待在多个游戏帧上执行的内容 的相关文章

随机推荐

  • Android 应用程序复制保护和数据文件

    在我的应用程序中 我在代码中的以下硬编码位置访问我的 sqlite 数据库 数据 数据 com mydomain appname databases database db 如果我在 Market Place 中打开复制保护 我的应用程序仍
  • Telegram 机器人:如何隐藏内联键盘? PHP

    我制作了一个带有内联键盘的电报机器人 来自InlineKeyboardMarkup 我喜欢hide 或使其one time 用户响应后的键盘 我怎样才能在 PHP 中做到这一点 这是我的机器人的视图 有方法editMessageReplyM
  • 在 Backbone.js 中使用状态并登录用户

    我需要检查用户是否已登录并经过身份验证 然后才能让我的用户使用我的backbone js基于应用程序 用户身份验证作为属性存储在本机主干模型中 我在启动主路由器之前通过调用进行检查Backbone history start 这样 未经身份
  • 使用 React 内联样式设置背景图像

    我正在尝试访问静态图像以在内联中使用backgroundImageReact 中的属性 不幸的是 我对如何做到这一点已经一无所知 一般来说 我认为你只是做了如下操作 import Background from images backgro
  • 扩展方法中的 ArgumentNullException 或 NullReferenceException?

    在空实例上调用扩展方法 扩展方法不允许 时 您认为抛出的最佳异常类型是什么 由于扩展方法只不过是静态方法 您可能会认为它应该是 ArgumentNullException 但另一方面 它们的使用方式与实例方法类似 因此使用 NullRefe
  • 检测主线程之外的 UI 操作

    注 此问题涉及从后台线程调用 UIKit 时发出警告 https stackoverflow com questions 10976424 warn on calls to uikit from background threads但没有给
  • 如何将进度条连接到函数?

    我正在尝试将进度条连接到我的项目的函数 这是我到目前为止所拥有的 但我很确定它什么也没做 def main pgBar start function1 function2 function3 function4 pgBar stop 这是我
  • Postgresql - 在大数据库中使用数组的性能

    假设我们有一个包含 600 万条记录的表 有 16 个整数列和少量文本列 它是只读表 因此每个整数列都有一个索引 每条记录大约 50 60 字节 表名称为 项目 服务器为 12 GB RAM 1 5 TB SATA 4 核 所有 postg
  • 如何在[关闭]下实现带点的画廊滑动

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何实现画廊下点滑动 我需要显示当前
  • HTML 内容提取的最新技术水平如何?

    有很多关于 HTML 内容提取的学术工作 例如 Gupta Kaiser 2005 从可访问的网页中提取内容 http citeseerx ist psu edu viewdoc summary doi 10 1 1 60 357 以及这里
  • 链接到 CMAKE 中的ExternalProject_add 依赖项

    我在运行 Ninja 时收到以下 ninja 构建错误 我的 CMAKE 构建命令是cmake G Ninja DCMAKE BUILD TYPE Release ninja error ext deps api src ext api b
  • Angular2:表中带有 *ngFor 的复选框

    我有一个 HTML 表 其中每行都有一个关联的复选框 默认情况下 最初会检查所有行
  • 以编程方式查找对象使用的内存

    有没有办法以编程方式准确确定 C 中对象使用的内存量 我不关心这个过程有多慢 所以左右运行 GC 是可以接受的 当然我更喜欢更高效的东西 序列化对象并查看结果长度似乎不太准确 在对此方法的简单测试中 我看到整数返回值 54 Using GC
  • 如何在 PHP 中使用 fetch() API POST 方法抓取数据?

    我正在尝试使用fetch API POST 方法以获取 PHP 中的 POST 数据 这是我尝试过的 var x hello fetch url method post body x then function response retur
  • Microsoft 的 strncat 读取超出源缓冲区边界的字节

    我观察到 Microsoft 实现中存在一个有趣的问题strncat 它超出了源缓冲区 1 个字节 考虑以下代码 include
  • 设置android相机发送灰度图像

    Android 相机可以通过编程方式设置为发送灰度图像吗 我不是在询问收到图像后的转换 而是在询问一种以编程方式设置它的方法 就像我们对 fps 分辨率等所做的那样 您是在谈论内置相机应用程序 通过意图 还是在您的应用程序内部 如果它是内置
  • 如何更改应用程序中使用的默认键盘的背景颜色?

    因此 我正在制作的应用程序需要使用较暗的键盘 否则内容和键盘之间的对比度太高 因此我需要更改与 EditText 交互时显示的键盘 我已经看了一下安卓软键盘 http developer android com resources samp
  • dplyr的arrange()使用什么排序算法?

    主要是出于好奇 我想知道 dplyr 的排列函数使用什么排序算法 我读到使用 R 的最常见的排序算法是选择排序 但我找不到有关range 的任何细节 我只是对排序算法有点兴趣 并且很好奇这个函数使用什么 我查看了排列函数的源代码 但我无法真
  • 如何推迟 Norton Secure Site Seal 的加载?

    我正在网站中显示 Norton Secure Site Seal 并且我想提高页面速度以推迟密封脚本的加载 我所做的所有尝试都失败了 我只找到了这个页面提到了这一点 link http www webpagetest org forums
  • 使用 C# 5 异步等待在多个游戏帧上执行的内容

    我儿子正在编写一个简单的 RPG 游戏 其中有许多非玩家角色 又名 NPC 每个 NPC 都有一个相关的 脚本 来控制其行为 我们将使用迷你自定义脚本语言来编写这些行为 但我现在想知道在 C 5 Async 中是否会更好 举一个非常简单的例