- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个每 (.1) 秒更新一次对象列表的程序。程序完成更新列表后,程序将知道是否有任何对象在任何其他对象的特定距离内。每个对象在图形上都有一个 X、Y 位置。每个对象都有一个称为“范围”的值。每个刻度 (.1s) 程序将使用距离公式来计算是否有任何其他对象小于或等于正在处理的对象的范围。
例如,如果点 A 的范围为 4 且位于 (1,1),而点 B 位于 (1,2),则距离公式将返回 ~1,这意味着点 B 在点 A 的范围内. 计算结果类似于:
objects = { A = {X = 1,Y = 1,Range = 4}, B = {X = 1,Y = 2,Range = 3}, C = {X = 4,Y = 7,Range = 9} }
while(true) do
for i,v in pairs(objects) do
v:CheckDistance()
end
wait()
end
-- Point:CheckDistance() calculates the distance of all other points from Point "self".
-- Returns true if a point is within range of the Point "self", otherwise false.
--
问题: 该图可能包含 200 多个点,每个点都会对存在的每个其他点应用数学。这将每 .1 秒发生一次。我想这可能会减慢我正在使用的 3D 环境或造成延迟。
问题: 这听起来像是执行此操作的最佳方法吗? 对于如何更有效/更快地完成这项工作,您有什么想法?
最佳答案
作为Alex Feinamn说:看起来你正在制作自己的碰撞检测器,尽管是一个原始的。
不过,我不确定您是否在 2D 或 3D 平面上有点。您说每个对象“在图表上都有一个 X、Y 位置”,并进一步谈论“我正在使用的 3D 环境中的滞后”。
好吧,2D 和 3D 物理以及 Lua 都是发达的领域,因此不乏优化。
A quadtree (或 3D 的 octree)是一种数据结构,将您的整个 2 世界表示为一个分为四个正方形的正方形,每个正方形又分为四个正方形,依此类推。
您可以在 this handy site 上亲自体验交互式示例.
空间树通常可以非常快速地访问局部点。
圆圈表示特定粒子的相互作用半径。如您所见,很容易准确地找到需要遍历哪些分支。
在处理点云时,您需要确保两个点不共享同一位置,或者您的树有最大划分深度;否则,它将尝试无限地划分分支。
我不知道 Lua 中有任何八叉树的实现,但是制作一个很容易。如果您需要示例,请寻找 Python 或 C 实现;不要不要在 C++ 中寻找一个,除非你能处理模板疯狂。或者,您可以通过 Lua API 绑定(bind)或 FFI 库使用 C 或 C++ 实现(推荐,请参阅绑定(bind)部分)。
LuaJIT是一个定制的 Lua 5.1 解释器和即时编译器,提供显着的速度和存储优化,以及一个 FFI 库,允许轻松高效地使用 C 函数和类型,例如整数。
使用 C 类型来表示您的点和空间树将显着提高性能。
local ffi = require"ffi"
ffi.cdef[[
// gp = graphing project
struct gp_point_s {
double x, y;
double range;
};
struct gp_quadtree_root_s {
// This would be extensive
};
struct gp_quadtree_node_s {
//
};
]]
gp_point_mt = {
__add = function(a, b)
return gp_point(a.x+b.x, a.y+b.y)
end,
__tostring = function(self)
return self.x..", "..self.y
end
__index = {
-- I couldn't think of anything you might need here!
something = function(self) return self.range^27 end,
},
}
gp_point = ffi.metatype("struct gp_point_s", gp_point_mt)
-- Now use gp_point at will
local p = gp_point(22.5, 5.4, 6)
print(p)
print(p+gp_point(1, 1, 0))
print(p:something())
LuaJIT 会将 gp_point 的任何运行时使用编译为 native 程序集,这意味着在某些情况下速度类似于 C。
这是一个棘手的...
无法正确优化通过 Lua API 的调用,因为它们对 Lua 状态具有权威。而通过 LuaJIT 的 FFI 对 C 函数的原始调用可以得到完全优化。
由您决定您的代码应该如何互操作:
不是真正的优化,但它很重要。
如果您正在制作专为用户交互设计的应用程序,那么您不应该 fix your time step ;也就是说,您不能假设每次迭代都恰好需要 0.1 秒。相反,您必须将所有与时间相关的操作乘以时间。
pos = pos+vel*delta
vel = vel+accel*delta
accel = accel+jerk*delta
-- and so on!
但是,这是一个物理模拟;正如 Glenn Fiedler 所讨论的,物理学的固定时间步长和可变时间步长都存在明显的问题:
Fix your timestep or explode
... If you have a series of really stiff spring constraints for shock absorbers in a car simulation then tiny changes in dt can actually make the simulation explode. ...
如果您使用固定的时间步长,那么理论上每次都应该运行相同的模拟。如果你使用可变时间步长,它会非常平滑但不可预测。我建议问问你的教授。 (这是一个大学项目,对吧?)
关于c++ - 对我的绘图项目的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12787532/
我是一个相对较新的程序员; CS 学士学位,大学毕业大约 2 年,主要使用 C# 中的 .NET。我对 SQL 交互/脚本编写相当流利,并且对 ASP.NET 做了一些工作(主要是维护现有站点)。 我
我计划开发一个简单的解决方案,使我能够即时执行非常基本的视频流分析。我以前从未做过类似的事情,因此这是一个非常笼统和开放的问题。主要重点是检查流是否正常运行,例如 - 卡住帧、黑屏以及音频是否存在。同
我正在考虑重组一个大型 Maven 项目...... 我们当前结构的基本概述: build [MVN plugins, third party dependency management]:5.1
我需要有关附加查询的建议。该查询执行了一个多小时,并根据解释计划进行了全表扫描。我对查询调优还很陌生,希望得到一些建议。 首先,为什么我要进行全表扫描,即使我使用的所有列都在其上创建了索引。 其次,有
我正在做一个项目,我需要在 4 个模型之间创建三个多对多关系。这是它的过程: 常见问题类别可以有许多常见问题子类别,反之亦然。 常见问题组可以有许多常见问题的子类别,反之亦然。 常见问题可以有许多常见
对于代码大小比语音质量更重要的 PIC 和/或 ARM 嵌入式系统,是否有任何易于使用的免费或廉价的语音合成库?现在似乎 1 meg 的封装被认为是“紧凑的”,但很多微 Controller 都比它小
我们正在使用 Solr 建议器功能进行 businessName 查找。当用户输入查询以及匹配的名称时,我们希望 solr 发送来自个人资料的其他属性,如 id、地址、城市、州、国家等字段。 我尝试使
我正在构建一个用户界面。我的计划将包括 4 个主要部分: 1) 顶部菜单 - TMainMenu。一个窗口的顶部 2) 主菜单 - TTreeView。一个窗口的左边。 TreeView的每一项=对应
我的公司需要一个任务管理系统来处理从“为X购买一台计算机”到“将一个人转移到另一个国家”这样简单的场景。简单的场景是由一个人处理的单个任务,而更大的任务可以分解为在工作流程中委派给多个人的多个子任务。
MarkLogic 服务器的林大小与实际内存的建议比率是多少?例如,我目前有一个 190GB 的数据库,并且该数据库随着时间的推移而不断增长。由于数据库会不断增长,我最终需要对该数据库进行集群。因此,
去年我收到了一个礼物,它是一个索尼 CMT700Ni 音频站,支持 wifi。它还具有类似于广播的功能,称为“PartyStreaming”。我目前正在挖掘内部,探索它,所以也许我可以结束拥有自己的“
有没有我可以阅读的研究论文/书籍可以告诉我针对手头的问题哪种特征选择算法最有效。 我试图简单地将 Twitter 消息识别为 pos/neg(首先)。我从基于频率的特征选择开始(从 NLTK 书开始)
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我正在浏览 stackoverflow 以查找有关使用 jUnit 进行测试的常见建议,但仍然有几个问题。我知道,如果要测试的方法很复杂,最好的方法是将其分成小的单独部分并测试每个部分。但问题是 -
我有一个方法如下 public List> categorize(List customClass){ List> returnValue = new ArrayList<>();
我的问题是,当按照下面的程序合并时,在最佳实践场景中,“将分支折叠回主干”程序的最后一步是正确的方法吗? 我已经使用 svn 很多年了。在我的个人项目中,我总是毫不犹豫地在主干上愉快地进行修改,并且在
我读过 UINavigationController当您想从 n 个屏幕跳转到第一个屏幕时,这是最佳选择。这样做需要以下代码: NSMutableArray *array=[[NSMutableArr
我有一个文件输入类。它在构造函数中有一个字符串参数来加载提供的文件名。但是,如果文件不存在,它就会退出。如果文件不存在,我希望它输出一条消息 - 但不确定如何...... 这是类(class): pu
我希望创建一个“您访问过的国家/地区” map - 就像您可能在 Facebook、TravelAdvisor 和诸如此类的网站上看到的那样。 我尝试过不同的闪光灯套件,但它们并不像我希望的那样先进。
我需要一些关于如何处理我想用 Perl 编写的脚本的建议。基本上我有一个看起来像这样的文件: id: 1 Relationship: "" name: shelby pet: 1
我是一名优秀的程序员,十分优秀!