有没有办法比SDL_Delay更精确地延迟程序?

时间:2017-09-21 17:56:45

标签: c sdl delay

我发现SDL_Delay并不完全准确。程序等待的时间可以比作为函数参数传递的值多1或2毫秒。我读到这可能会发生,具体取决于所使用的操作系统。对于其他人来说,差距可能更小或更大。

要制作一个每秒显示约60帧的程序,需要在每帧之间调用SDL_Delay,以便程序等待17 ms(1000/60 = 16.6666 ...),或者自上次调用SDL_Delay以来,取决于其他操作所花费的时间。但是,通过使用这个函数,每帧之间的时间会略有不同,有时是17ms,有时是18ms,有时是19ms ......我想知道是否有任何方法可以重现SDL_Delay的行为,但是一种更精确的方式,没有这种差距的不便。

1 个答案:

答案 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)

在其他操作系统上它是不同的,你需要找出它。

当然,细节也与硬件相关(请参阅HPETAPIC timerPIT

SDL是free software,并且(就像所有图形工具包一样)Linux上有一些event loop(请参阅SDL_WaitEventTimeout)可能在poll(2)select(2)附近,所以你可以深入实施。