天道酬勤,学无止境

如何在 C# 中实现精确的游戏循环帧限制?(How to implement precise game loop frame limiting in C#?)

问题

我正在尝试在用 C# 编写的游戏引擎中实现游戏循环帧限制器。 有人告诉我Thread.Sleep甚至需要几毫秒才能执行Thread.Sleep(0) ,并且会稍微错过目标毫秒。 因此它对于我需要的来说不够精确,因为目标帧速率可能需要引擎坐下来等待 1 毫秒。 我不确定我是否应该在这种情况下使用Thread.SpinWait ,因为也可能存在引擎需要等待 10 毫秒的情况,我不知道在这种情况下使用 SpinWait 是否是一个坏主意。

这是一段代码来说明我想要实现的目标:

public void Run()
{
    var targetDelta = TimeSpan.FromSeconds(0.016);
    Running = true;
    while (Running)
    {
        // Calculate time since previous frame start here ("delta")

        // Simplified, but essentially this is what's going on
        Input.HandleEvents();
        Scene.Update(delta);
        Renderer.Render(Scene);

        // Perform waiting to limit frame rate here
    }
}
回答1

现在看看这是您需要自己进行测试以了解实际发生的情况的地方,而不仅仅是相信某人的话。

运行 1000000 通过一个循环来测量Thread.Sleep(0)所花费的时间,每次执行平均为 2.44 微秒,最小值为 1.70 微秒,最大值为 6.49 毫秒。 虽然最后一个数字听起来像是一个问题,但实际上并非如此。 在百万次传球中,只有 59 次(即 0.0059%)是 1 毫秒或更长。

调用Thread.Sleep(0)是将剩余的时间片释放回系统供其他进程使用。 它会阻止您的进程在不需要时占用所有可用的 CPU 时间。

它不是特别准确,因为它受任务调度程序的支配。 但是,几乎系统中的一切都是。 如果没有在一个或多个内核上以实时优先级运行,您将无法获得更好的准确性。

您可以使用混合解决方案,当等待时间超过几毫秒时调用Thread.Sleep(0) ,然后在等待Stopwatch或类似的情况下执行繁忙循环以在最后几微秒内打勾。 取决于您的代码对时间的敏感程度。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在反应香蕉中实现游戏循环?(How to implement a game loop in reactive-banana?)
    问题 这个问题专门针对具有物理和视觉组成部分(例如游戏)的反应性香蕉和实时模拟。 根据修复您的时间步伐! 设置游戏循环的理想方法(假设物理是可重现的),在帧之间需要固定的时间步长。 在考虑了许多实际的复杂性之后,作者进入了这个游戏循环: double t = 0.0; const double dt = 0.01; double currentTime = hires_time_in_seconds(); double accumulator = 0.0; State previous; State current; while ( !quit ) { double newTime = time(); double frameTime = newTime - currentTime; if ( frameTime > 0.25 ) frameTime = 0.25; // note: max frame time to avoid spiral of death currentTime = newTime; accumulator += frameTime; while ( accumulator >= dt ) { previousState = currentState; integrate( currentState, t, dt ); t += dt
  • 在 Flex 中实现计时器循环是一个坏主意吗?(Is it a bad idea to implement a timer loop in Flex?)
    问题 在我们的游戏项目中,我们确实将计时器循环设置为每秒触发约 20 次(与应用程序帧速率相同)。 我们用它来移动一些精灵。 我想知道这是否会导致问题,我们应该使用 EnterFrame 事件处理程序进行更新吗? 我的印象是,让计时器循环运行得比应用程序帧速率快可能会导致问题......是这种情况吗? 作为更新,尝试在 EnterFrame 上执行此操作会导致非常奇怪的问题。 它不是每 75 毫秒一帧,而是突然跳到 25 毫秒。 请注意,不仅仅是我们的计算声称帧率不同,动画突然加速到疯狂的速度。 回答1 我会选择 Enter 框架,在某些特殊情况下,有两个“循环”可能很有用,一个用于逻辑,一个用于视觉效果,但对于我制作的大多数游戏,我坚持使用 Enter 框架事件侦听器。 有一个单独的计时器来移动你的东西有点不必要,因为将它设置为除帧率之外的任何内容都会使运动变得不稳定或不可见(因为帧没有重绘)。 然而,需要考虑的一件事是将您的逻辑与帧速率分离,这最容易通过使用 getTimer(在 as2 和 as3 中可用)来计算自上一帧以来已过期的时间并相应地调整运动或其他任何内容来实现。 计时器并不比进入帧事件更可靠,Flash 会尝试跟上您设置的任何速率,但如果您进行繁重的处理或复杂的图形,它会减慢计时器和帧速率。 回答2 下面简要介绍 Flash
  • 在现代复杂游戏中实现成就系统(Implementation of achievement systems in modern, complex games)
    问题 如今创建的许多游戏都有自己的成就系统,奖励玩家/用户完成某些任务。 stackoverflow 上的徽章系统完全相同。 虽然有一些问题,但我无法找到好的解决方案。 成就系统必须时刻注意某些事件,想想一个提供 20 到 30 个成就的游戏,例如:战斗。 服务器必须始终检查这些事件(例如:玩家在这场战斗中避免了对手的x 次攻击或玩家走了x英里)。 服务器如何处理如此大量的操作而不会减慢甚至崩溃? 成就系统通常只需要在游戏的核心引擎中使用的数据,如果没有那些讨厌的成就,无论如何也不需要那里的数据(想想例如:玩家在每场战斗中跳跃的频率,你不'不想将所有这些信息存储在数据库中。)。 我的意思是,在某些情况下,添加成就的唯一方法是将检查其当前状态的代码添加到游戏核心中,这通常是一个非常糟糕的主意。 成就系统如何与保存后期不必要信息的游戏核心交互? (见上面的例子) 它们是如何与游戏核心分离的? 我的例子可能看起来“无害”,但想想魔兽世界中目前可用的 1000 多个成就以及许多同时在线的玩家,例如。 回答1 成就系统实际上只是一种记录形式。 对于这样的系统,发布/订阅是一个很好的方法。 在这种情况下,玩家发布有关他们自己的信息,感兴趣的软件组件(处理个人成就)可以订阅。 这允许您使用专门的日志代码查看公共值,而不会影响任何核心游戏逻辑。 以您的“玩家步行 x 英里”为例。
  • 如何在C#中实现数组索引器(How to implement Array indexer in C#)
    问题 我可以打字 Square[,,,] squares = new Square[3, 2, 5, 5]; squares[0, 0, 0, 1] = new Square(); 实际上,尽管我不知道会需要多少内存,但我希望我可以继续向Int.MaxValue添加维。 如何在自己的类中实现此变量索引功能? 我想封装未知维度的多维数组,并将其作为属性使用,从而以这种方式启用索引。 我是否必须始终知道大小,在这种情况下数组如何工作? 编辑 感谢您的评论,这就是我最终得到的内容-我确实想到了参数,但是在不了解GetValue之后不知道该去哪里。 class ArrayExt<T> { public Array Array { get; set; } public T this[params int[] indices] { get { return (T)Array.GetValue(indices); } set { Array.SetValue(value, indices);} } } ArrayExt<Square> ext = new ArrayExt<Square>(); ext.Array = new Square[4, 5, 5, 5]; ext[3, 3, 3, 3] = new Square(); TBH我现在真的不需要这个了。
  • Unity 性能问题的优化
    文章目录 1. 优化Unity中的脚本简介用我们的代码诊断问题关于Unity如何构建和运行游戏的简要介绍建立过程我们编写的代码和已编译的代码之间的关系Unity Engine代码与脚本代码之间的运行时通信 代码性能不佳的原因改善代码的性能编写高效的代码尽可能将代码移出循环考虑代码是否必须每帧运行 仅在情况发生变化时运行代码每[x]帧运行一次代码使用缓存使用正确的数据结构尽量减少垃圾收集的影响使用对象池 避免对Unity API的昂贵调用SendMessage()Find()Transformupdate()Vector2和Vector3Camera.main其他Unity API调用和进一步优化 仅在需要运行时运行代码剔除细节级别 总结 2. 优化Unity游戏中的垃圾回收简介诊断垃圾收集问题Unity中的内存管理简介在栈分配和释放期间会发生什么?堆分配期间会发生什么?垃圾回收期间会发生什么?什么时候进行垃圾回收? 垃圾回收问题查找堆分配在栈和堆上分配了什么?使用探查器窗口查找堆分配 减少垃圾收集的影响减少创建的垃圾量缓存不要在经常调用的函数中执行分配清理集合对象对象池 不必要的堆分配的常见原因stringUnity函数调用装箱协程foreach循环方法引用LINQ和正则表达式 结构化代码以最大程度地减少垃圾收集的影响定时垃圾收集手动强制垃圾收集 总结延申阅读 3
  • 如何在 U-SQL 中实现循环(How to implement Loops in U-SQL)
    问题 是否可以在不使用 C# 的情况下在 U-SQL 中实现循环(while/for)。 如果没有,任何人都可以共享 c# 语法来在 u-sql 中实现循环。 我正在从特定日期提取文件到某个日期,但现在我通过手动编写文件路径来提取它。 DROP VIEW IF EXISTS dbo.ReadingConsolidated; CREATE VIEW IF NOT EXISTS dbo.ReadingConsolidated AS EXTRACT ControllerID int?, sensorID int?, MeasureDate DateTime, Value float FROM "adl://datalake.azuredatalakestore.net/2015/7/1/Reading.csv", "adl://datalake.azuredatalakestore.net/2015/7/2/Reading.csv", "adl://datalake.azuredatalakestore.net/2015/7/3/Reading.csv", "adl://datalake.azuredatalakestore.net/2015/7/4/Reading.csv", "adl://datalake.azuredatalakestore.net/2015/7/5/Reading
  • 我可以在 CompositionTarget.Rendering 中做什么?(What can I do inside CompositionTarget.Rendering?)
    问题 CompositionTarget.Rendering 事件是构建游戏主循环的完美选择。 它基本上以 vsync 的速率(通常为 60 Hz)触发。 在渲染合成树中的对象之前发生。 在动画和布局应用到合成树之后,Rendering 事件被路由到指定的事件处理程序。 每帧动画操作方法文章解释了更多。 请注意,在计算布局后调用您的事件处理程序方法。 但是,您可以在事件处理程序方法中修改布局,这意味着在渲染之前将再次计算布局。 基于此,其处理程序内的代码规则是: 避免改变布局快速返回 还有什么其他问题? 哪些不明显的操作会导致另一个布局传递? 我在处理程序中到底有多少时间? 回答1 我认为它的主要目的是启用无计时器动画,例如那些使用重力等物理元素的动画,需要精确的规则计时。 然而,它不是游戏图形的好地方...... WPF不是一种游戏语言,严重的游戏使用它不会顺利运行​​,因为有太多的开销。 如果您想编写 .NET 游戏,请使用 XNA。 来自“WPF Control Development Unleashed:Building Advanced User Experiences”一书: 一些读者可能会认识到这种方法与 DirectX 等高端图形子系统之间的相似之处。 不要将 CompositionTarget.Rendering 误认为是创建基于 WPF
  • Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
    简介Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发。规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死。你拥有两种资源 — 生命值(health points)和能量值(energy points)。每次撞击和与小行星的接触都会让你失去生命值。在射击和使用提升驱动时会消耗能量值。你杀死的对象越多,你的生命值条就会越长。线上试玩:http://superstellar.u2i.is技术栈游戏分为两个部分:一个中央服务器(central server)和一个在每个客户端的浏览器中运行的前端应用程序(a front end app)。我们之所以选择这个项目,主要是因为后端部分。 我们希望它是一个可以同时发生许多事情的地方:游戏模拟(game simulation),客户端网络通信(client network communication),统计信息(statistics),监视(monitoring)等等。 所有这些都应该并行高效地运行。因此,Go 以并发为导向的方法和轻量级的方式似乎是完成此工作的理想工具。前端部分虽然很重要,但并不是我们的主要关注点。然而,我们也发现了一些潜在的有趣问题,如如何利用显卡渲染动画或如何做客户端预测,以使游戏运行平稳和良好。最后我们决定尝试包含:JavaScript, webpack 和
  • 如何在C#中实现foreach? [复制](How is foreach implemented in C#? [duplicate])
    问题 这个问题已经在这里有了答案: foreach循环在C#中如何工作? [已关闭] (7个答案) 7年前关闭。 在C#中, foreach到底是如何实现的? 我想象其中一部分看起来像: var enumerator = TInput.GetEnumerator(); while(enumerator.MoveNext()) { // do some stuff here } 但是我不确定到底发生了什么。 每个周期返回enumerator.Current数的方法是什么? 它会返回[每个周期]还是需要一个匿名函数或执行foreach主体的内容? 回答1 它不使用匿名函数,不。 基本上,编译器将代码转换为与您在此处显示的while循环大致等效的内容。 foreach不是函数调用-它是语言本身的内置函数,就像for循环和while循环一样。 不需要它返回任何东西或“采用”任何类型的函数。 请注意, foreach有一些有趣的皱纹: 当遍历数组(在编译时已知)时,编译器可以使用循环计数器并与数组的长度进行比较,而不是使用IEnumerator foreach将在最后处理迭代器; 这对于扩展IDisposable IEnumerator<T>很简单,但是由于IEnumerator并非如此,编译器会插入一个检查以在执行时测试迭代器是否实现IDisposable
  • 在openGL中设置每秒最大帧数(setting max frames per second in openGL)
    问题 有没有办法计算应该进行多少更新才能达到所需的帧速率,而不是特定于系统的? 我发现对于 Windows,但我想知道 openGL 本身是否存在这样的东西。 它应该是某种计时器。 或者我还能如何防止 FPS 大幅下降或提高? 这一次,我正在测试它绘制大量直线顶点,并且使用 fraps 我可以看到帧速率从 400 到 200 fps,绘制速度明显减慢。 回答1 你有两种不同的方法来解决这个问题: 假设您有一个名为maximum_fps的变量,其中包含要显示的最大帧数。 然后你测量在最后一帧上花费的时间(计时器会做) 现在假设您说您的应用程序希望最大 60FPS。 那么您希望测量的时间不低于 1/60。 如果测量的时间更短,则调用sleep()以达到一帧剩余的时间。 或者你可以有一个名为tick的变量,它包含应用程序的当前“游戏时间”。 使用相同的计时器,您将在应用程序的每个主循环中递增它。 然后,在您的绘图例程中,您根据tick计算位置,因为它包含应用程序的当前时间。 选项2的一大优点是您的应用程序将更容易调试,因为您可以使用tick变量,随时前进和后退。 这是一个很大的优势。 回答2 规则1。 不要让 update() 或 loop() 类型的函数依赖于它被调用的频率。 您无法真正获得所需的 FPS。 您可以尝试通过跳过一些昂贵的操作来提升它,或者通过调用 sleep()
  • 浏览器如何确定setInterval应该使用什么时间?(How do browsers determine what time setInterval should use?)
    问题 通常,在某些情况下,浏览器会修改setInterval使用的实际时间间隔,甚至超出最小限制。 例如,我有以下代码: function start() { window.setInterval(function() { update(); }, 1); } lastTime = new Date; numFrames = 0; lastFrames = 0; function update() { numFrames++; if (new Date - lastTime >= 1000) { lastFrames = numFrames; numFrames = 0; lastTime = new Date; } } 在这里, lastFrames将为我们提供大约过去一秒的帧数。 在Chrome,Firefox和Safari中使用时,此代码不会在一毫秒内运行。 当然,每个浏览器在setInterval调用之间都有一个任意的最小时间,因此这是可以预期的。 但是,随着页面继续运行,即使选项卡仍处于焦点状态,帧速率也将继续降低。 我发现解决此问题的唯一方法是使浏览器执行某些操作。 这些事情似乎使浏览器尽可能快地运行setInterval : function start() { window.setInterval(function() { update(); }, 1); }
  • Lua、游戏状态和游戏循环(Lua, game state and game loop)
    问题 在每个游戏循环迭代中调用 main.lua 脚本 - 设计好还是坏? 它对性能(相对)有何影响? 从维护游戏状态。 C++ 主机程序或b 。 来自 Lua 脚本或c 。 从两者并同步它们? (关于该主题的上一个问题: Lua 和 C++:职责分离) (我为每个答案投票。最佳答案将被接受。) 回答1 lua 最好的事情是它有一个轻量级的 VM,在块被预编译后,在 VM 中运行它们实际上相当快,但仍然不如 C++ 代码快,而且我不认为每次都调用 lua渲染帧将是一个好主意。 我将游戏状态放在C++中,并在lua中添加可以到达的函数,并修改状态。 基于事件的方法几乎更好,事件注册应该在 lua 中完成(最好只在游戏开始时或在特定的游戏事件中,但每分钟不超过几次),但实际事件应该由C++ 代码。 用户输入也是事件,它们通常不会在每一帧发生(可能除了 MouseMove 但由于这个原因应该谨慎使用)。 您在 lua 中处理用户输入事件的方式(您是否处理所有内容(例如按下哪个键等),或者是否为键盘上的每个键(在极端情况下)提供单独的事件取决于您的游戏)重新尝试制作(回合制游戏可能只有一个事件处理程序来处理所有事件,RTS 应该有更多事件,而 FPS 应该小心处理(主要是因为每帧都会移动鼠标))。一般来说越多您拥有的不同类型的事件,您在 lua 中编写代码的次数越少(这将提高性能)
  • 优化 iPhone OpenGL ES 填充率(optimizing iPhone OpenGL ES fill rate)
    问题 我在 iPhone 上有一个 Open GL ES 游戏。 我的帧率非常糟糕,~20fps。 在 iPhone 3G 上使用 Xcode OpenGL ES 性能工具,它显示: 渲染器利用率:95% 到 99% 瓷砖利用率:~27% 我正在绘制很多非常大的图像,并进行了大量混合。 如果我减少绘制的图像数量,帧率会从 ~20 到 ~40,尽管性能工具结果保持不变(渲染器仍然最大化)。 我想我受到 iPhone 3G 填充率的限制,但我不确定。 我的问题是:如何更精确地确定瓶颈在哪里? 这是我最大的问题,我只是不知道一直在消耗什么。 如果是填充率,除了减少绘制之外,还有什么可以改进它的吗? 我正在使用纹理图集。 我试图最小化图像绑定,尽管这并不总是可行的(绘制顺序,并非所有内容都适合一个 1024x1024 纹理等)。 每帧我做 10 个图像绑定。 这看起来很合理,但我可能会弄错。 我正在使用顶点数组和 glDrawArrays。 我真的没有很多几何。 如果需要,我可以尝试更精确。 每个图像都是 2 个三角形,我尝试将事情分批进行,尽管经常(可能有一半的时间)图像是通过单独的 glDrawArrays 调用绘制的。 除了图像之外,我还有大约 60 个三角形的几何图形在大约 6 个 glDrawArrays 调用中渲染。 我经常在调用 glDrawArrays 之前进行
  • 什么!FPS难道不是越高越好吗?
    一、背景作为手机游戏开发者,我们的工作中有很多时间都在尝试优化自己的代码。比如让某一段逻辑执行的更快速,或降低一些迭代的频率,减轻CPU负担,抑或通过各种骚操作在不降低画面质量的情况下,减轻GPU负担。最终的目的都是想让使用不同性能设备的玩家都可以流畅的体验游戏。“卡不卡”也是玩家对游戏产生的第一印象之一,因此,我们的目的就是让游戏以最快的速度运行。通常,评价一款游戏是否流畅的最直观的指标就是FPS(帧/秒)。那么,FPS真的是越高越好吗?市面上评测硬件性能都是对比不同硬件下相同画质游戏的FPS,且越高越好(Higher is better)。对于桌面平台来讲,它有持续稳定的供电与强劲的散热方案,不需要考虑发热与耗电量的问题,可以让硬件自由发挥。其次我们还要考虑显示设备(手机屏幕、电脑屏幕)的刷新率(RefreshRate)。为了了解帧率(单位是FPS)与刷新率的关系,我们先来看看他们的定义:1. 帧率(FrameRate)帧率是GPU和CPU合作在游戏运行时,可产生的图像的数量,计量单位是帧/秒(FramePerSecond),通常是评估硬件性能与游戏体验流畅度的指标。2. 刷新率(RefreshRate)刷新率(垂直刷新率、垂直扫描率)表示显示设备一秒内可显示的新图像的数量,计量单位是赫兹(Hz)。刷新率与帧率是两个独立的概念,帧率表示驱动显示器的设备每秒可产生新图像的数量
  • unity帧同步游戏极简框架及实例
    原文地址:https://blog.csdn.net/wanzi215/article/details/82053036 阅前提示: 此框架为有帧同步需求的游戏做一个简单的示例,实现了一个精简的框架,本文着重讲解帧同步游戏开发过程中需要注意的各种要点,伴随框架自带了一个小的塔防sample作为演示. 文章目录 哪些游戏需要使用帧同步如何实现一个可行的帧同步框架帧同步原理帧同步算法 基础核心算法渲染更新机制插值动画参数计算公式详解定点数关于Dotween的正确使用随机数服务器同步校验 逻辑和渲染如何进行分离逻辑代码版本控制策略哪些unity数据类型不能直接使用哪些unity接口不能直接调用加速功能小谈加速优化战斗回放功能 记录战斗关键事件复原战斗事件框架文件结构自带sample流程战斗校验服务器简单搭建指引 安装mono环境编译可执行文件运行可执行文件服务器端战斗校验逻辑实现简单socket通信回传框架源码 客户端服务器客户端服务器共享逻辑 哪些游戏需要使用帧同步 如果游戏中有如下需求,那这个游戏的开发框架应该使用帧同步: 多人实时对战游戏游戏中需要战斗回放功能游戏中需要加速功能需要服务器同步逻辑校验防止作弊 LockStep框架就是为了上面几种情况而设计的. 如何实现一个可行的帧同步框架 主要确保以下三点来保证帧同步的准确性
  • 如何在国际象棋游戏中实现移动?(How to implement movement in a chess game ?)
    问题 我正在学习使用 windows 窗体 C# 制作一个小的国际象棋游戏变体,游戏只包括双方的棋子,我已经画了棋盘并在那里组织了棋子,但老实说我不知道​​如何开始实施通过在棋子上单击鼠标然后我想移动它的位置来移动。 作为参考,黑色棋子被命名为piece,白色棋子被命名为pieceW 这是我的董事会代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AIchess { public partial class Form1 : Form { static System.Drawing.Bitmap piece = AIchess.Properties.Resources.piece; ChessPiece Piece = new ChessPiece(piece, ChessColor.Black); static System.Drawing.Bitmap pieceW =
  • Java中的接口是什么?(What is an interface in Java?)
    问题 与这个问题相对应:Java中的接口是什么? 回答1 接口是抽象类的一种特殊形式,它不实现任何方法。 在Java中,您可以这样创建一个接口: interface Interface { void interfaceMethod(); } 由于该接口无法实现任何方法,因此这意味着整个事物(包括所有方法)都是公共的和抽象的(Java术语中的抽象含义是“未由此类实现”)。 因此,上面的接口与下面的接口相同: public interface Interface { abstract public void interfaceMethod(); } 要使用此接口,您只需要实现该接口。 许多类可以实现一个接口,而一个类可以实现许多接口: interface InterfaceA { void interfaceMethodA(); } interface InterfaceB { void interfaceMethodB(); } public class ImplementingClassA implements InterfaceA, InterfaceB { public void interfaceMethodA() { System.out.println("interfaceA, interfaceMethodA, implementation A"); } public
  • 如何在C#中实现3层架构(How to implement 3 tiers architecture in c#)
    问题 我读了很多有关C#中三层体系结构的文章,但我发现: 几乎将业务逻辑层(BLL)用作数据库中对应表的对象映射。 该BLL对象具有以下一些方法: + GetData() :返回此值; + Update(this) ; + Insert(this) ; + Delete(this) ; 该BLL对象调用相应的DAL(数据访问层)以执行到相应的数据库表。 我认为,如果使用上述方法,我们可以获取记录并进行更新。 但是,如果我们有很多记录并希望将其放入数据集中,我们如何更新所有已更改的记录? 我们必须对所有记录使用循环来做到这一点吗? 此外,在数据库中,有许多相互关联的表,那么如何像将BindingSource与Combobox和DataGridView一起使用那样,如何将它们放入数据集,建立关系以及添加,更新,删除记录? 在这种情况下,我们如何分隔代码? 回答1 The above describe a very simple architecture of a 3-tier model. DAL (Data Access Layer) interacts with Database directly, so all the SQL operation are being done within DAL only. BLL (Business Logic Layer) works
  • 如何在 cocos2d 游戏中实现暂停/恢复?(How to implement pause/resume in cocos2d game?)
    问题 我的问题是在 cocos2d 游戏期间寻找暂停/恢复状态(包括所有需要保存的数据信息)的设计解决方案。 包括但不限于以下情况: 1)。 用户选择退出,弹出一个对话框让用户选择“直接退出”、“暂停”; 2)。 有人呼入,弹出对话框让用户选择“退出”或“暂停”游戏。 如果选择“暂停”,所有值得保存的东西都应该保存。 就像PC游戏一样。 我知道 Director 提供“暂停”、“继续”,这对这个任务可以吗? 感谢任何人的线索或评论。 欢迎通过电子邮件进一步讨论:apple.dev.sh@gmail.com 回答1 这是一个很好的例子: 暂停: - (void) applicationDidEnterBackground:(UIApplication *)application { [[CCDirector sharedDirector] stopAnimation]; [[CCDirector sharedDirector] pause]; } - (void)applicationWillResignActive:(UIApplication *)application { [[CCDirector sharedDirector] stopAnimation]; [[CCDirector sharedDirector] pause]; } 恢复时: - (void
  • C#中的浮点数学是否一致? 是真的吗?(Is floating-point math consistent in C#? Can it be?)
    问题 不,这不是另一个“为什么(1 / 3.0)* 3!= 1”问题。 最近,我一直在阅读有关浮点的文章。 具体而言,相同的计算如何在不同的体系结构或优化设置上产生不同的结果。 对于存储重放或对等网络(而不是服务器-客户端)的视频游戏来说,这是一个问题,它们依赖于所有客户端在每次运行程序时都产生完全相同的结果-一个小小的差异浮点计算可能导致不同机器(甚至同一台机器!)上的游戏状态完全不同。 即使在“遵循” IEEE-754的处理器中也会发生这种情况,主要是因为某些处理器(即x86)使用双精度扩展精度。 也就是说,它们使用80位寄存器进行所有计算,然后将其截断为64位或32位,从而与使用64位或32位进行计算的机器产生不同的舍入结果。 我已经在网上看到了几种解决此问题的方法,但是所有解决方案都是针对C ++而非C#: 使用_controlfp_s(Windows), _FPU_SETCW (Linux?)或fpsetprec(BSD)禁用双精度扩展模式(以便所有double精度计算都使用IEEE-754 64位)。 始终以相同的优化设置运行相同的编译器,并要求所有用户具有相同的CPU架构(禁止跨平台使用)。 因为我的“编译器”实际上是JIT,所以每次运行程序时它的优化方式都可能不同,所以我认为这是不可能的。 使用定点算术,并且完全避免float和double float 。