0

画面上で赤い線 (スタッターなし) を動かそうとしていますが、あらゆる種類のアプローチを試しました。GDI+ のダブルバッファリング (BufferedGraphicsクラスを使用) から WPF のWriteableBitmapまで、すべて失敗しました。使用しているタイマーが十分に正確でない可能性があります。v-sync ティアリングが発生する可能性がありますが、不可能に思えます。今は 2013 年ですが、ハイエンドの GPU を使用していますが、古い 8 ビット SNES で問題がなかったものを再現できません。

誰かが 100% スムーズでちらつきのない WinForms コード例を持っていますか、それとも DirectX なしではミッション不可能ですか?

4

1 に答える 1

0

WPF では、単純に Line コントロールをアニメーション化できます。

<Canvas>
    <Line x:Name="line"
        X2="{Binding X1, RelativeSource={RelativeSource Mode=Self}}"
        Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4">
    </Line>
</Canvas>

次のようなメソッドでアニメーションを作成して開始します。

private void StartAnimation()
{
    var animation = new DoubleAnimation
    {
        To = ActualWidth, // width of the window
        Duration = TimeSpan.FromSeconds(ActualWidth / 32),
        RepeatBehavior = RepeatBehavior.Forever
    };

    line.BeginAnimation(Line.X1Property, animation);
}

X1Line のプロパティをアニメーション化してプロパティをX2バインディングに追従させる代わりに、Line の RenderTransform をアニメーション化することもできます。

<Canvas>
    <Line Y2="{Binding ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Canvas}}" Stroke="Red" StrokeThickness="4">
        <Line.RenderTransform>
            <TranslateTransform x:Name="transform"/>
        </Line.RenderTransform>
    </Line>
</Canvas>

StartAnimation メソッドは次のようになります。

private void StartAnimation()
{
    var animation = new DoubleAnimation
    {
        To = ActualWidth, // width of the window
        Duration = TimeSpan.FromSeconds(ActualWidth / 32),
        RepeatBehavior = RepeatBehavior.Forever
    };

    transform.BeginAnimation(TranslateTransform.XProperty, animation);
}
于 2013-01-29T09:52:33.477 に答える