在用Java创建地图生成器时,我发现它们的随机数生成器存在一个相当令人不安的问题,指定当两个RNG具有非常相似的种子(小整数不同)时,它们的第一个输出值将变得非常相似!
示例代码:
Random r = new Random();
long n = 100000; //Choose any number
r.setSeed(n);
System.out.println(r.nextInt());
r.setSeed(n+1);
System.out.println(r.nextInt());
Run Code Online (Sandbox Code Playgroud)
这几乎打破了我对原始Java RNG的信心,因为我使用坐标为地图生成器播种.有人可以建议重新定义Random.next(int bits)方法,或者针对此问题进行其他修复吗?
谢谢您的帮助!
我正在开发一个基于平铺的,自上而下的2D游戏,其中包含动态生成的地形,并开始(重新)在OpenGL中编写图形引擎.游戏是用Java编写的,使用LWJGL,我更喜欢它保持相对平台无关,并且也可以在旧计算机上播放.
目前我正在使用立即模式进行绘图,但显然这对于除最简单场景之外的任何事情来说都太慢了.
绘制的对象有两种基本类型:Tiles,它是世界,Sprites,几乎所有其他东西(实体,项目,效果等).
瓷砖为20*20像素,并以块(40*40个瓷砖)存储.地形生成以完整的块完成,就像在Minecraft中一样.
我现在使用的方法是迭代播放器附近的9个块,然后在内部的每个瓦片上迭代,为瓦片纹理绘制一个四边形,并根据材料绘制特征的可选额外四边形.这最终会很慢,但是简单的视线外检查可以提供5-10倍的FPS提升.
为了优化这一点,我研究了使用VBO和quad strip,但是当地形发生变化时我遇到了问题.这不会发生在每一帧,但也不是非常罕见的事件.一个简单的方法是在每次更改时丢弃并重建块的VBO.这似乎不是最好的方式.我读到VBO可以是"动态的",允许更改其内容.如何做到这一点,以及哪些数据可以有效地在其中进行更改?有没有其他方法可以有效地吸引世界?
另一种类型的精灵,目前使用四边形绘制,其中纹理从精灵表映射.因此,通过更改纹理坐标,我甚至可以在以后设置它们的动画.这是做正义的正确方法吗?
目前即使是非常多的精灵也不会减慢游戏速度,通过了解VBO,我将能够加快它们的速度,但我还没有看到任何有效的方法来获得有效的方法.这样做.也许有人知道吗?
谢谢您的帮助!