我目前正在开发一款小型地牢模拟游戏。游戏非常详细,我计划随着时间的推移拥有代表“怪物”的类的 +200k 实例。它们包含该怪物的特权、技能和历史。比如他用了多少药剂,他住在哪里,他的巡逻路线是什么等等。
我开始使用 SQLite 实现这一点,并使用一个名为“monsters”的简单表,其中包含所有数据。这让我可以使用 SQL 查询来查找每帧模拟计算所需的怪物。例如:查找所有在 A 点巡逻的怪物,或查找所有使用 Potion X 的怪物等。不幸的是,每帧查询 SQLite 几次很快就会降低游戏速度。虽然是 2D 游戏,但我需要宝贵的毫秒时间进行模拟计算。
另外,我将来需要加入来做图表:我需要知道一个怪物是否攻击了另一个怪物,或者一个怪物是否是另一个怪物团队的一部分。这会进一步减慢速度。
有人对如何解决这个问题有任何建议吗?
我的数据类似于这样:
最佳答案
如果您没有使用实体组件系统,请考虑将您的游戏迁移到使用实体组件系统。相关数据的每一位都可以存储在一个自包含的组件中,而实体本身就是一些不透明的标识该组件的标识符。使用 ECS 时,不是让游戏实体挂着一堆数据,而是颠倒关系。特定类型的所有组件一起存在于一个大池中,您的实体只是一个标识符,指定他们关心这个池中的哪个组件。这允许您做的是批量组件更新。如果您在每个带有库存的怪物上都有库存组件,那么您的所有库存组件都可以或多或少地连续存储在内存中。这意味着在处理它们时,您具有高缓存一致性,这可以显着提高性能。
也可能是您只是试图在每一帧中做太多事情。使用实体组件系统,您可以根据需要将特定子系统限制为每 X 帧或每 X 秒。也许 AI 组件只需要每秒运行一次就可以考虑下一步该做什么,但它们需要不断移动,以便您每帧更新位置。或者可能将其中一个图表和图形放在一起需要很长时间才能在一帧中完成,因此您每隔一帧计算一次,或者将处理拆分为两帧,以便您在帧上迭代一半以上的实体,其余的在第二帧框架。有很多方法可以拆分它。
Here is some more reading on component systems if you haven't seen them before
关于c++ - 在 C++ 中存储和检索复杂对象的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37506155/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server