Просмотр исходного кода

Create less objects.
Introduced event pool.
Cache eventqueue event objects.

woollybah 10 лет назад
Родитель
Сommit
381b927f0b
2 измененных файлов с 52 добавлено и 8 удалено
  1. 36 3
      event.mod/event.bmx
  2. 16 5
      eventqueue.mod/eventqueue.bmx

+ 36 - 3
event.mod/event.bmx

@@ -6,12 +6,15 @@ bbdoc: Events/Events
 End Rem
 Module BRL.Event
 
-ModuleInfo "Version: 1.03"
-ModuleInfo "Author: Mark Sibly"
+ModuleInfo "Version: 1.04"
+ModuleInfo "Author: Mark Sibly, Bruce A Henderson"
 ModuleInfo "License: zlib/libpng"
 ModuleInfo "Copyright: Blitz Research Ltd"
 ModuleInfo "Modserver: BRL"
 
+ModuleInfo "History: 1.04"
+ModuleInfo "History: Added event pool."
+ModuleInfo "History: Added EVENT_TOUCHDOWN, EVENT_TOUCHUP and EVENT_TOUCHMOVE."
 ModuleInfo "History: 1.03 Release"
 ModuleInfo "History: Added missing EVENT_HOTKEY ToString case"
 ModuleInfo "History: Added process events"
@@ -21,6 +24,18 @@ ModuleInfo "History: 1.01 Release"
 ModuleInfo "History: Added EVENT_KEYREPEAT"
 
 Import BRL.Hook
+Import BRL.LinkedList
+?threaded
+Import BRL.Threads
+?
+Private
+
+Global _eventPool:TList = New TList
+?threaded
+Global _eventLock:TMutex = TMutex.Create()
+?
+
+Public
 
 Rem
 bbdoc: Hook id for emitted events
@@ -80,6 +95,13 @@ Type TEvent
 	End Rem
 	Method Emit()
 		RunHooks EmitEventHook,Self
+?threaded
+		_eventLock.Lock()
+?
+		_eventPool.AddLast Self
+?threaded
+		_eventLock.Unlock()
+?
 	End Method
 
 	Rem
@@ -104,7 +126,18 @@ Type TEvent
 	returns: A new event object
 	End Rem
 	Function Create:TEvent( id,source:Object=Null,data=0,mods=0,x=0,y=0,extra:Object=Null )
-		Local t:TEvent=New TEvent
+		Local t:TEvent
+?threaded
+		_eventLock.Lock()
+?
+		If Not _eventPool.IsEmpty() Then
+			t = TEvent(_eventPool.RemoveFirst())
+		Else
+			t = New TEvent
+		End If
+?threaded
+		_eventLock.Unlock()
+?
 		t.id=id
 		t.source=source
 		t.data=data

+ 16 - 5
eventqueue.mod/eventqueue.bmx

@@ -6,12 +6,14 @@ bbdoc: Events/Event queue
 End Rem
 Module BRL.EventQueue
 
-ModuleInfo "Version: 1.01"
-ModuleInfo "Author: Mark Sibly"
+ModuleInfo "Version: 1.02"
+ModuleInfo "Author: Mark Sibly, Bruce A Henderson"
 ModuleInfo "License: zlib/libpng"
 ModuleInfo "Copyright: Blitz Research Ltd"
 ModuleInfo "Modserver: BRL"
 
+ModuleInfo "History: 1.02"
+ModuleInfo "History: Reuse TEvent objects."
 ModuleInfo "History: 1.01 Release"
 ModuleInfo "History: Fixed CurrentEvent being retained in queue array"
 ModuleInfo "History: 1.00 Release"
@@ -87,7 +89,6 @@ Function PollEvent()
 		EndIf
 	EndIf
 	CurrentEvent=queue[queue_get & QUEUEMASK]
-	queue[queue_get & QUEUEMASK]=Null
 	queue_get:+1
 	Return CurrentEvent.id
 End Function
@@ -107,7 +108,6 @@ Function WaitEvent()
 		WaitSystem
 	Wend
 	CurrentEvent=queue[queue_get & QUEUEMASK]
-	queue[queue_get & QUEUEMASK]=Null
 	queue_get:+1
 	Return CurrentEvent.id
 End Function
@@ -139,7 +139,18 @@ Function PostEvent( event:TEvent,update=False )
 		Wend
 	EndIf
 	If queue_put-queue_get=QUEUESIZE Return
-	queue[queue_put & QUEUEMASK]=event
+	Local q:TEvent = queue[queue_put & QUEUEMASK]
+	If Not q Then
+		q = New TEvent
+		queue[queue_put & QUEUEMASK] = q
+	End If
+	q.id = event.id
+	q.source = event.source
+	q.data=event.data
+	q.mods=event.mods
+	q.x=event.x
+	q.y=event.y
+	q.extra=event.extra
 	queue_put:+1
 End Function