小编Kai*_*Kai的帖子

单元测试在游戏编程中是否可行?

我喜欢单元测试的想法,但我在将它应用于游戏编程时遇到了麻烦.游戏非常有状态,而且代码通常不会分解成不同的单元.根据我的经验,大多数函数都会改变状态而不是返回值.

考虑一个简单的动作playerJump(height).我希望有一个测试套件可以检查各种各样的情况,以确保跳跃始终按预期工作.然而,这个功能可能会不返回值,并有副作用,player.velocity.y = -heightcheckCollisions(player).我想不出一个明确的单元测试来构建这个.

单元测试在游戏等高度有状态的应用程序中是否不可行?单元测试的优势是否如此之大,以至于值得在功能上编程游戏?


更新:

来自Within的游戏有一系列关于在游戏中使用测试驱动开发的深度文章.我强烈推荐给任何对此主题感兴趣的人.这是第一篇文章:

http://gamesfromwithin.com/stepping-through-the-looking-glass-test-driven-game-development-part-1

unit-testing

54
推荐指数
4
解决办法
2万
查看次数

Runge-Kutta(RK4)集成了游戏物理

Gaffer on Games有一篇很棒的文章,关于使用RK4集成来改进游戏物理.实现很简单,但背后的数学让我感到困惑.我从概念层面理解衍生物和积分,但很长一段时间没有操纵方程式.

这是Gaffer实施的主要内容:

void integrate(State &state, float t, float dt)
{
     Derivative a = evaluate(state, t, 0.0f, Derivative());
     Derivative b = evaluate(state, t+dt*0.5f, dt*0.5f, a);
     Derivative c = evaluate(state, t+dt*0.5f, dt*0.5f, b);
     Derivative d = evaluate(state, t+dt, dt, c);

     const float dxdt = 1.0f/6.0f * (a.dx + 2.0f*(b.dx + c.dx) + d.dx);
     const float dvdt = 1.0f/6.0f * (a.dv + 2.0f*(b.dv + c.dv) + d.dv)

     state.x = state.x + dxdt * dt;
     state.v = state.v …
Run Code Online (Sandbox Code Playgroud)

math integration physics

50
推荐指数
1
解决办法
2万
查看次数

混合面向对象和函数式编程

有哪些语言可以促进面向对象和函数式编程?我知道任何支持一流功能的语言都可以被认为是功能性的,但我正在寻找一种专门针对两种编码风格的语法.

使用这样的语言,我想象将所有状态更改隔离到单个代码部分,并使程序的其余部分纯粹功能.只是想到它让我流口水(调试天堂!).

到目前为止,我已经发现了Scala,虽然我刚刚听说过它(它看起来很神奇).在这种"混合风格"范式中是否有任何重要的竞争者?

functional-programming scala imperative-programming

29
推荐指数
7
解决办法
1万
查看次数

Clojure可变存储类型

我正在尝试从网站上提供的API和文档中学习Clojure.我对Clojure中的可变存储有点不清楚,我想确保我的理解是正确的.如果有任何想法我错了,请告诉我.

编辑:我正在更新这个,因为我收到有关其正确性的评论.


免责声明:所有这些信息都是非正式的,可能是错误的.不要使用这篇文章来了解Clojure的工作原理.


Vars总是包含根绑定,可能还包含每个线程的绑定.它们与命令式语言中的常规变量相当,不适合在线程之间共享信息.(感谢Arthur Ulfeldt)

Refs是支持原子事务的线程之间共享的位置,可以更改单个事务中任意数量的ref的状态.在退出同步表达式(dosync)时提交事务,并且使用STM魔法(回滚,队列,等待等)自动解决冲突

代理是通过调度独立的操作函数来更改代理的状态,使得线程之间异步共享信息的位置,而开销最小.虽然在调度函数完成之前未设置代理程序的值,但代理程序会立即返回并因此是非阻塞的.

原子是可以在线程之间同步共享的位置.它们支持不同线程之间的安全操作.

这是我基于何时使用这些结构的友好总结:

  • Vars就像命令式语言中的常规旧变量.(尽可能避免)
  • 原子就像Vars一样,但具有线程共享安全性,可以立即读取和安全设置.(谢谢马丁)
  • 代理就像一个Atom,但它不是阻塞它而是产生一个新的线程来计算它的值,只有在改变一个值时才会阻塞,并且可以让其他线程知道它已经完成了分配.
  • Refs是在事务中锁定自己的共享位置.我们只是启动一个事务并让Clojure处理该事务中refs之间的所有锁定条件,而不是让程序员决定在每个锁定代码的竞争条件下会发生什么.

此外,相关概念是功能future.对我来说,似乎未来的对象可以被描述为同步代理,在完成计算之前根本无法访问该值.它也可以描述为非阻塞Atom.这些准确的未来概念是什么?

multithreading future clojure mutable

27
推荐指数
1
解决办法
3092
查看次数

Lua中一个数字的最大值是多少?

在文档中似乎没有明确的答案.

我有兴趣增加一个time计算程序启动后秒数的变量.如果最大值可以计入未来,例如100年,那么我不关心让变量永远增量.否则我将不得不考虑重置time为0 的好点.

time lua numbers

21
推荐指数
2
解决办法
3万
查看次数

最困难的编程解释

最近我试图向我的项目经理解释一些设计糟糕的代码.所有的管理器类都是单例("这就是为什么我不能轻易改变它")并且代码使用事件调度,函数调用就足够了("这就是为什么它很难调试").可悲的是,它只是一个笨拙的英语混乱.

您作为程序员向非技术人员传达的最困难的事情是什么?您是否发现任何类比或解释方法使其更清晰?

theory

19
推荐指数
11
解决办法
4548
查看次数

具有可选标志的Clojure参数

将关键字作为可选标志实现到函数的最佳方法是什么?我想进行函数调用,例如:

(myfunction 5)
(myfunction 6 :do-this)
(myfunction 3 :go-here)
(myfunction 2 :do-this :do-that)
Run Code Online (Sandbox Code Playgroud)

使用defn,我可以定义一个函数,例如:

(defn myfunction [value & flags] ... )
Run Code Online (Sandbox Code Playgroud)

但这flags成了一个清单.我可以编写自己的函数来搜索列表,但是这样的函数不包含在核心库中,所以我认为它不是惯用的.

我现在用的是什么:

(defn flag-set? [list flag] (not (empty? (filter #(= flag %) list))))
(defn flag-add [list flag] (cons flag list))
(defn flag-remove [list flag] (filter #(not= flag %) list))
Run Code Online (Sandbox Code Playgroud)

parameters clojure keyword

14
推荐指数
2
解决办法
4662
查看次数

在没有嵌套let的情况下在Clojure中绑定多个相关变量

我想使用变量的值来计算同一let语句中另一个变量的值.有没有办法在Clojure中执行此操作而不使用嵌套的let?

嵌套让解决方案:

(let [x 3] 
  (let [y (+ 1 x)] 
    y)) = 4
Run Code Online (Sandbox Code Playgroud)

期望的解决方案:

(let [x 3 
      y (+ 1 x)] 
   y) = 4
Run Code Online (Sandbox Code Playgroud)

nested clojure let

12
推荐指数
1
解决办法
3272
查看次数

什么编程语言最好地弥合了伪代码和代码之间的差距?

当我从现在开始编写代码时,我计划首先将所有内容布置在漂亮,可读的伪代码中,然后围绕该结构实现该程序.

如果我将目前最简单到最难翻译的语言排名,我会说:

Lisp,Python,Lua,C++,Java,C

我知道每种语言都有其优点和缺点,但我专注于伪代码.您使用哪种语言最适合伪代码?我总是喜欢学习新语言.此外,如果您目前使用此技术,我很乐意听到您有关构建实用伪代码的任何提示.

注意:我觉得这是主观的,但每个人的偏好都有明确的答案.我在这里问这个问题是因为SO社区拥有非常广泛的受众,并且很可能建议我不会遇到的语言和技术.

pseudocode

11
推荐指数
3
解决办法
4157
查看次数

AS3大型游戏性能随着时间的推移而降级

我目前正在制作一个非常大的Flash平台游戏(数百个课程),并处理一个问题,如果你让它停留足够长的话,游戏会慢慢停止.我没有写游戏,所以我只是模糊地熟悉它的内部.一些神秘的症状包括,

  • 游戏将在确定的时间内(在给定的级别上)正常运行,突然间它会以指数方式开始泄漏内存.
  • 当屏幕上有更多精灵时,游戏达到指数级泄漏的时间缩短了.
  • 即使没有任何东西可见地呈现在屏幕上,游戏也会变慢.
  • 随着更频繁的精灵碰撞,游戏速度变慢.
  • 完全禁用冲突代码确实可以减缓降级,但不会阻止游戏最终丢帧.

查看源代码并使用Flex Profiler,我的主要嫌疑人是,

  • 有许多游荡的物体,特别是WeakMethodClosure占用大量的记忆.
  • 该程序非常广泛地使用弱事件侦听器(每帧调度数十个).
  • 每次创建新的精灵时都会复制BitmapData.这些是50x50像素精灵,每秒产生约8个精灵.

我知道在没有看到源的情况下几乎无法告诉我这个问题,所以我只是在寻找可以帮助我缩小范围的花絮.有没有人在他们自己的项目中经历过这种规避性能下降?你的案子是什么原因?

apache-flex performance memory-leaks actionscript-3

9
推荐指数
1
解决办法
1871
查看次数