Tag: 游戏引擎

LibGDX:过滤缩放的TextureRegion

我有几个具有不同纹理的对象用于不同的状态,因此我使用TexturePacker制作的TextureAtlas ,并在需要它的地方调整TextureRegion大小。 我必须resize,因为我不仅要支持720p和1080p,而且我的一些对象是基于棋盘宽度和高度resize的平铺或光标,因为这可以在我的游戏中改变,而棋盘将始终占据屏幕的相同百分比。 使用Texture ,我可以这样做: texture.setFilter(TextureFilter.Linear, TextureFilter.Linear); 但是,当我使用TextureRegion ,没有选项来设置filter。 这导致这些TextureRegion的大小调整为锐利,块状和锯齿状。 这不是很好的缩放,它似乎根本没有反别名。 这非常令人沮丧,因为我制作图形时已经够糟糕了,现在即使我喜欢我制作它看起来很糟糕的东西。 如何使用TextureRegion而不是Texture来复制TextureFilter.Linear的效果?

循环条件中方法调用的效率

我正在编写一个游戏引擎,其中使用for循环迭代在ArrayList中保存的一组对象。 显然,效率是相当重要的,所以我想知道循环的效率。 for (String extension : assetLoader.getSupportedExtensions()) { // do stuff with the extension here } 其中getSupportedExtension()返回String的ArrayList 。 我想知道的是,每次循环遍历新扩展时是否调用该方法。 如果是这样,做以下事情会更有效率: ArrayList supportedExtensions = ((IAssetLoader) loader).getSupportedExtensions(); for (String extension : supportedExtensions) { // stuff } ? 提前致谢。

游戏循环中最佳睡眠时间计算的研究

在编写动画和小游戏时,我开始了解Thread.sleep(n);重要性Thread.sleep(n); 我依靠这种方法告诉操作系统何时我的应用程序不需要任何CPU,并使用它使我的程序以可预测的速度进行。 我的问题是JRE在不同的操作系统上使用不同的实现此function的方法。 在基于UNIX(或受影响)的操作系统上,例如Ubuntu和OS X,底层JRE实现使用function良好且精确的系统将CPU时间分配给不同的应用程序,从而使我的2D游戏平滑无滞后。 但是,在Windows 7和较旧的Microsoft系统上,CPU时间分配似乎有所不同,并且您通常会在给定睡眠量后恢复CPU时间,从目标睡眠开始大约1-2 ms。 但是,偶尔会有额外10-20毫秒的睡眠时间爆发。 这导致我的游戏在发生这种情况时每隔几秒就会滞后一次。 我注意到这个问题存在于我在Windows上尝试过的大多数Java游戏中,Minecraft是一个值得注意的例子。 现在,我一直在互联网上寻找解决这个问题的方法。 我见过很多人只使用Thread.yield(); 而不是Thread.sleep(n); 无论你的游戏实际需要多少CPU,它都会以当前使用的CPU核心满负荷为代价完美运行。 这对于在笔记本电脑或高能耗工作站上玩游戏并不理想,而且在Mac和Linux系统上进行不必要的权衡。 进一步outlook我发现了一种常用的纠正睡眠时间不一致的方法,称为“旋转睡眠”,你只能一次命令睡眠1毫秒,并使用System.nanoTime();检查一致性System.nanoTime(); 方法,即使在Microsoft系统上也非常准确。 这有助于正常1-2毫秒的睡眠不一致,但它无法帮助抵抗偶尔爆发+ 10-20毫秒的睡眠不一致,因为这通常会导致花费更多的时间比我的循环的一个循环应该花费所有一起。 经过大量的观察,我找到了安迪·马拉科夫的这篇神秘文章,这对改善我的循环很有帮助: http : //andy-malakov.blogspot.com/2010/06/alternative-to-threadsleep.html 基于他的文章我写了这个睡眠方法: // Variables for calculating optimal sleep time. In nanoseconds (1s = 10^-9ms). private long timeBefore = 0L; private long timeSleepEnd, timeLeft; // The estimated game update rate. private double timeUpdateRate; […]

Java主游戏循环

我正在编写游戏循环,我在下面的示例中找到了代码。 我还研究了其他方法来进行游戏循环,例如本文 。 我无法让任何那些工作。 所以我保留了第一个链接中的那个。 我想知道的是: 我编写游戏循环的方式是一种很好的方法吗? 有什么建议么? 我应该使用Thread.sleep(); 在我的游戏循环中? 这是我目前的代码: public void run(){ long lastLoopTime = System.nanoTime(); final int TARGET_FPS = 60; final long OPTIMAL_TIME = 1000000000 / TARGET_FPS; long lastFpsTime = 0; while(true){ long now = System.nanoTime(); long updateLength = now – lastLoopTime; lastLoopTime = now; double delta = updateLength / ((double)OPTIMAL_TIME); lastFpsTime […]