我发现SDL_Delay
并不完全准确。程序等待的时间可以比作为函数参数传递的值多1或2毫秒。我读到这可能会发生,具体取决于所使用的操作系统。对于其他人来说,差距可能更小或更大。
要制作一个每秒显示约60帧的程序,需要在每帧之间调用SDL_Delay
,以便程序等待17 ms(1000/60 = 16.6666 ...),或者自上次调用SDL_Delay
以来,取决于其他操作所花费的时间。但是,通过使用这个函数,每帧之间的时间会略有不同,有时是17ms,有时是18ms,有时是19ms ......我想知道是否有任何方法可以重现SDL_Delay
的行为,但是一种更精确的方式,没有这种差距的不便。
答案 0 :(得分:2)
是的,有一些方法,但它变为特定于操作系统。
在 Linux 上,阅读time(7),nanosleep(2),poll(2)(或旧select(2)), clock_gettime(2),timer_create(2)(或许timerfd_create(2))
另请阅读Advanced Linux Programming(但此处未提及某些最近的Linux功能,因此请参阅intro(2)和syscalls(2))。
也许您可能对signal(7)感兴趣(特别是void showBrowsers() {
List<Intent> shareIntentsLists = new ArrayList<Intent>();
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
List<ResolveInfo> resInfos = getPackageManager().queryIntentActivities(browserIntent, 0);
if (!resInfos.isEmpty()) {
for (ResolveInfo resInfo : resInfos) {
String packageName = resInfo.activityInfo.packageName;
if (!packageName.toLowerCase().contains("YOURPACKAGE_NAME")) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(packageName, resInfo.activityInfo.name));
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
intent.setPackage(packageName);
shareIntentsLists.add(intent);
}
}
if (!shareIntentsLists.isEmpty()) {
Intent chooserIntent = Intent.createChooser(shareIntentsLists.remove(0), "Choose Browser");
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, shareIntentsLists.toArray(new Parcelable[]{}));
startActivity(chooserIntent);
} else
Log.e("Error", "No Apps can perform your task");
}
}
和setitimer(2)),但请务必阅读signal-safety(7)
在其他操作系统上它是不同的,你需要找出它。
当然,细节也与硬件相关(请参阅HPET,APIC timer,PIT)
SDL是free software,并且(就像所有图形工具包一样)Linux上有一些event loop(请参阅SDL_WaitEventTimeout)可能在poll(2)或select(2)附近,所以你可以深入实施。