1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Threading ;
3
4
using System . Threading . Tasks ;
4
5
5
6
using Android . OS ;
6
7
using Android . Views ;
7
8
8
9
using Avalonia . Reactive ;
9
10
using Avalonia . Rendering ;
10
-
11
- using Java . Lang ;
11
+ using ThreadPriority = System . Threading . ThreadPriority ;
12
12
13
13
namespace Avalonia . Android
14
14
{
15
15
internal sealed class ChoreographerTimer : Java . Lang . Object , IRenderTimer , Choreographer . IFrameCallback
16
16
{
17
17
private readonly object _lock = new ( ) ;
18
-
19
- private readonly Thread _thread ;
18
+
19
+ private AutoResetEvent _event = new ( false ) ;
20
+ private long _lastTime ;
20
21
private readonly TaskCompletionSource < Choreographer > _choreographer = new ( ) ;
21
22
22
23
private readonly ISet < AvaloniaView > _views = new HashSet < AvaloniaView > ( ) ;
@@ -26,8 +27,14 @@ internal sealed class ChoreographerTimer : Java.Lang.Object, IRenderTimer, Chore
26
27
27
28
public ChoreographerTimer ( )
28
29
{
29
- _thread = new Thread ( Loop ) ;
30
- _thread . Start ( ) ;
30
+ new Thread ( Loop )
31
+ {
32
+ Priority = ThreadPriority . AboveNormal
33
+ } . Start ( ) ;
34
+ new Thread ( RenderLoop )
35
+ {
36
+ Priority = ThreadPriority . AboveNormal
37
+ } . Start ( ) ;
31
38
}
32
39
33
40
public bool RunsInBackground => true ;
@@ -86,17 +93,32 @@ private void Loop()
86
93
_choreographer . SetResult ( Choreographer . Instance ! ) ;
87
94
Looper . Loop ( ) ;
88
95
}
96
+
97
+ private void RenderLoop ( )
98
+ {
99
+ while ( true )
100
+ {
101
+ _event . WaitOne ( ) ;
102
+ long time ;
103
+ lock ( _lock )
104
+ {
105
+ time = _lastTime ;
106
+ }
107
+ _tick ? . Invoke ( TimeSpan . FromTicks ( time / 100 ) ) ;
108
+ }
109
+ }
110
+
89
111
90
112
public void DoFrame ( long frameTimeNanos )
91
113
{
92
- _tick ? . Invoke ( TimeSpan . FromTicks ( frameTimeNanos / 100 ) ) ;
93
-
94
114
lock ( _lock )
95
115
{
96
116
if ( _count > 0 && _views . Count > 0 )
97
117
{
98
118
Choreographer . Instance ! . PostFrameCallback ( this ) ;
99
119
}
120
+ _lastTime = frameTimeNanos ;
121
+ _event . Set ( ) ;
100
122
}
101
123
}
102
124
}
0 commit comments