在编写动画和小游戏时,我已经知道了Thread.sleep(n);
当我的应用程序不需要任何CPU时,我依靠这种方法来告诉操作系统,并且使用这个让我的程序以可预测的速度进步,这非常重要.
我的问题是JRE在不同的操作系统上使用不同的实现此功能的方法.在基于UNIX(或受影响)的操作系统上,例如Ubuntu和OS X,底层的JRE实现使用功能良好且精确的系统将CPU时间分配给不同的应用程序,从而使我的2D游戏平滑无滞后.但是,在Windows 7和较旧的Microsoft系统上,CPU时间分配似乎有所不同,并且您通常会在给定睡眠量后恢复CPU时间,与目标睡眠时间相差约1-2毫秒.但是,偶尔会有额外10-20毫秒的睡眠时间爆发.这导致我的游戏在发生这种情况时每隔几秒就会滞后一次.我注意到我在Windows上尝试过的大多数Java游戏都存在这个问题,Minecraft就是一个明显的例子.
现在,我一直在互联网上寻找解决这个问题的方法.我已经看到很多人只使用Thread.yield();
而不是Thread.sleep(n);
,无论你的游戏实际需要多少CPU,它都会以当前使用的CPU核心满负荷为代价完美运行.这对于在笔记本电脑或高能耗工作站上玩游戏并不理想,而且在Mac和Linux系统上进行不必要的权衡.
进一步展望我发现了一种常用的纠正睡眠时间不一致的方法,称为"旋转睡眠",你只能一次命令睡眠1毫秒,并使用该System.nanoTime();
方法检查一致性,即使在微软系统上也是如此.这有助于正常1-2毫秒的睡眠不一致,但它无法帮助抵抗偶尔爆发+ 10-20毫秒的睡眠不一致,因为这通常会导致花费更多的时间比我的循环的一个循环应该花费所有一起.
经过大量的观察,我发现了这篇神秘的Andy Malakov文章,这对改善我的循环很有帮助: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;
// The time one game loop cycle should take in order to reach the max FPS.
private long timeLoop;
private void sleep() throws InterruptedException {
// Skip first game …
Run Code Online (Sandbox Code Playgroud) 所以我有一个具有以下理论值的数组:
int[] elements = {A1, A2, B1, B2,
A3, A4, B3, B4,
C1, C2, D1, D2,
C3, C4, D3, D4};
Run Code Online (Sandbox Code Playgroud)
说明图:
+ - + - + - + - +
| A | A | B | B |
+ - + - + - + - +
| A | A | B | B |
+ - + - + - + - +
| C | C | D | D |
+ - + - + …
Run Code Online (Sandbox Code Playgroud) 简而言之:我想要的只是以最基本的方式在屏幕上显示像素数据,而不会失去跨平台兼容性.
我之前曾经问过类似的问题,但他们似乎并没有朝着我正在寻找的方向前进.
基本上,我正在创建自己的小游戏库,我打算将它用于我自己的2D像素艺术游戏.所有像素处理由我自己处理,现在我一直在寻找一个绝对最小的解决方案来启动一个窗口,听它的事件(鼠标,键盘,窗口事件)和绘制我的像素.如果库可以处理线程和/或音频,则会获得奖励.
在这个阶段我不需要任何OpenGL支持,我不确定我会不会.除了提到的那些之外,我真的不需要任何功能.我应该自己开始使用Windows,X11和OSX API,还是在那里有一个真正的极简主义框架?是否让我自己的平台独立的极简主义框架真的很辛苦?如果不是那么大的交易,我可能只是出于纯粹的好奇心来调查这个解决方案.
如果你有任何关于我自己与发现有用的东西的见解,我会全力以赴.
谢谢!
编辑:简而言之......
我目前正在撰写论文,主题是通过三重缓冲提高WebGL的渲染性能,或者只是避免同步.我目前正在尝试了解WebGL机器何时以及为何同步,因为在一个进程中等待另一个进程,无论是内部还是外部.
我基本上想要在WebGL/OpenGL渲染管道中找出任何潜在的瓶颈.
我还没有找到一本书或任何其他具有足够详细规格的来源.任何指示或解释?
我试图在同一特征中声明的函数中返回静态调度的特征,但编译器似乎无法在特征类型和具体类型之间进行映射.
例:
trait Money {
fn trade<M>(&self) -> M
where M: Money;
}
impl Money for Dollar {
fn trade<M>(&self) -> M
where M: Money
{
Dollar { amount: self.amount / 2 }
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处试用完整的示例:http://is.gd/alQGv0
在C中编码时的常见情况是编写返回指针的函数.如果在运行期间写入函数内发生某些错误,NULL
可能会返回以指示错误.NULL
只是特殊的内存地址0x0,除了表示特殊条件的出现之外,它从不用于任何东西.
我的问题是,是否有任何其他特殊的内存地址永远不会用于用户态应用程序数据?
我想知道这个的原因是因为它可以有效地用于错误处理.考虑一下:
#include <stdlib.h>
#include <stdio.h>
#define ERROR_NULL 0x0
#define ERROR_ZERO 0x1
int *example(int *a) {
if (*a < 0)
return ERROR_NULL;
if (*a == 0)
return (void *) ERROR_ZERO;
return a;
}
int main(int argc, char **argv) {
if (argc != 2) return -1;
int *result;
int a = atoi(argv[1]);
switch ((int) (result = example(&a))) {
case ERROR_NULL:
printf("Below zero!\n");
break;
case ERROR_ZERO:
printf("Is zero!\n");
break;
default:
printf("Is %d!\n", *result);
break;
}
return 0; …
Run Code Online (Sandbox Code Playgroud)