java c 语法相似_是否有类似C的迷你语法/语言可以翻译为本机C/C++和Java?

两个词:过早优化.

你关心的是表现.但考虑到你想制作一个Minecraft克隆,这意味着游戏世界可以很好地用三维数组来表示.在所有提到的编程语言中访问它们的速度相当快;游戏逻辑应该比访问数百万个数组条目花费更多的时间来执行.那么为什么要优化一个不会占用大部分计算时间的部分 – 甚至在你编写一个最低工作版本之前呢?

您可能想要创建代表游戏世界的Java接口或Scala特征.它提供了获取和存储游戏世界块内容的方法.稍后,您还可以添加批量方法以进一步优化性能;例如,一个将检查给定立方体中的所有块是否为空,或计算木块的数量,沿着这些线.但是在开始时,最好省略这些方法,或者做一些依赖于重复调用抽象方法的简单实现.您可以稍后优化它们.

然后,您可以提供该接口的非常简单的Java / Scala实现,该实现使用三维数组.另一种选择是地图,其键是坐标,值是块状态.优点是对游戏世界的大小没有实际限制,并且空块不会占用任何内存(对于具有空块的坐标,地图中没有条目).缺点显然可能是性能.

此时,如果消耗太多内存,您可能需要考虑更紧密地打包数据.您可以使用位集.当你到达那个阶段时,使用JNI将一些用C或C编写的代码注入JVM实际上是有意义的.因此,您将游戏逻辑保留在Java / Scala中,并在C中进行内存打包和查找.

创建一个可以创建Java / Scala和C/C++版本的代码本机部分的通用“脚本”源是没有意义的.本机C/C++函数在很大程度上依赖于无法直接转换为Java的优化.如果要以“纯Java / Scala模式”启动服务器,即没有JNI函数,只需使用您在之前步骤中创建的其他类.它们可能稍慢,但它们是纯JVM字节代码.而且由于你保持简单,所以不必冒险扩展它们或将新错误引入它们.至少,创建或调整跨编程语言代码生成器的开销远远大于保留两个单独的代码库,特别是当Java / Scala实现非常简单时.

当然,位打包只会让你这么远.您可能需要注意游戏世界的某些部分几乎完全是空的(特别是表面上方的那些部分),而其他部分包含填充了相同类型的块的巨大区域(例如几乎完全由石头组成的地下区域).保持具有大量冗余的巨大内存结构实际上是浪费内存.因此,您可能会考虑将游戏世界打包在树中,其中每个节点代表游戏世界的一个大的立方体区域,并且孩子们进一步细分它,直到描述仅一个特定游戏世界坐标的内容的叶子.当一个节点只有相同内容类型的子节点时,您不需要存储子节点.只需在这一点切割树,并让节点说:“你不需要进一步观察.我充满了水,所以我内部的每个坐标都指向一个水瓦.” – 这将大大减少内存使用量.只有游戏世界中实际上很复杂的部分才会消耗大量内存,这是正确的.世界上较无聊的部分只占树中的几个节点.这很好.由于它是一棵树,从顶部到叶子的遍历平均需要对数时间.这是非常好的! – 当然,你必须保持树的可变性.如果世界中仅由一个节点表示的无聊部分发生更改,则需要打开该节点并将其拆分为两个或更多子节点.如果它之后再次变得简单,你可以再次加入孩子并切割树.

在这一点上你可能会注意到的一件事是:内存打包和访问优化在这里不再是一个问题.通过使用存储和查找方法的本机函数,无法合理地优化这样的树.如果你能从这样的优化中获得超过10%的收益,那么这将是非常不可能的并且非常令人印象深刻. (但更可能的情况是,这可能意味着Java / Scala对应物被严重优化.)这种最小的速度增益并不能证明需要付出巨大的额外努力.而是将更好的CPU放入机器中,享受通过吃冰淇淋节省时间,观看House博士或继续进一步提升游戏性能,让玩家更有趣,更有吸引力.通过创造有价值的东西来真正改善产品.

但这还不是.如果我没记错的话,Minecraft世界的初始状态是程序生成的.使用分形算法,您可以真正创建无限的领域,在眨眼间感觉复杂和自然.因此,您可能希望使用世界生成过程作为查找方法,而不是预先计算游戏世界的内容并将其存储在大型数据结构中:而不是从内存中查找坐标的内容,只需使用算法.通过这种方式,世界的初始状态可以完全存储在四个字节中:算法的种子值.

当然,世界并不总是保持这种状态.当玩家(或其他东西)改变世界时,这是你需要存储的东西.因此,您只存储世界的种子值以及对其所做的更改.每当您查找坐标的内容时,请尝试在更改的磁贴存储中找到它.当它在那里时,使用该信息.当它不存在时,默认为程序世界生成算法.这将使您的内存消耗大大减少.由于世界变化相对较小并且包含巨大的空白区域,因此编写一个能够快速有效地存储这些变化的数据结构应该相对容易.同样,为此编写本机代码不会产生显着的性能提升,并且不值得付出努力.

其他东西可以优化:程序世界生成算法.这是您可能希望用C或C编写的一个关键组件.它应该相对较小而且代码不多,但它是数学密集型的,并且会经常调用.因此,优化它并从中创建一个小型JNI库.这将为您带来巨大的性能提升,值得付出努力. (当然,您可能希望首先执行Java / Scala实现.如果已经足够快,则无需进入JNI问题.)

如果您的世界生成过程仍然太慢,那么您可以为它实现缓存.当JVM有一些懒惰时,缓存甚至可以抢先生成一些玩家的周围环境.

我为你开发了这个开发过程,作为几个想法的迭代,比前一个更好.您将在第一阶段开始编写优化C/C++代码库的图像.这本来是浪费时间;你可以在后期把它扔掉.使用C编写的位打包的高效数组存储是一件好事,但是当您将世界重组为二进制空间分区树时,它绝对没用.

所以,不要过分.当您无法单独在Java / Scala中创建最低工作(但速度慢且未经优化)的版本时,您无法在C/C++或某些交叉编译脚本语言中创建优化版本.先做简单版本,然后进行性能测试,只在有实际需要时进行优化.不要先通过制作优化概念来启动项目.这种优化应该是您将要做的最后一件事.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值