在Nim中使用sdl2 / mixer播放音频的定时不可靠

时间:2018-11-28 06:40:02

标签: audio sdl-2 nim

我正在尝试构建一个简单的节拍器来学习nim编程语言,尽管我可以播放音频,但计时不起作用。我在Mac OSX上运行此程序,每三到四次“单击”总是有滞后时间

这是我的代码:

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     tools:context=".MainActivity"
     android:background="#212c3d">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView11"
        android:layout_width="150dp"
        android:layout_height="42dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp"
        android:text="Main Menu"
        android:textSize="30sp"
        android:textColor="#FFF"
        android:layout_margin="10dp"
        android:layout_gravity="center"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="3"
        android:layout_margin="10dp">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.551"
            app:layout_constraintStart_toStartOf="parent">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_weight="1">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_weight="1">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF"/>
        </LinearLayout>

    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="3"
        android:layout_margin="10dp">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:orientation="vertical">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_weight="1">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF"/>
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:gravity="center"
            android:layout_weight="1">
            <ImageView
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:src="@drawable/icon_setting"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Settings"
                android:textColor="#FFF"/>
        </LinearLayout>

    </LinearLayout>

</LinearLayout>

知道为什么会出现滞后吗?

(顺便说一下,click.wav文件只有一个通道,长度为0.2秒)

1 个答案:

答案 0 :(得分:0)

os.sleep(1)的调用作为高精度定时控制是不可靠的。在MacOSX上,它调用nanosleep,其中指出:

   If the interval specified in req is not an exact multiple of the
   granularity underlying clock (see time(7)), then the interval will be
   rounded up to the next multiple.  Furthermore, after the sleep
   completes, there may still be a delay before the CPU becomes free to
   once again execute the calling thread.

因此,您需要找到其他更可靠的等待方法,或者简单地删除该延迟并烧毁CPU cicle,以期变得更加精确(无论如何,您的程序仍可能被操作系统抢占)。