NicTheQuick hat geschrieben:
Wenn man dann ganz wild darauf is, Speicher zu sparen, kann man statt des Long-Arrays auch ein Byte-Array nutzen.
Nur einmal zum Vergleich:
- ein Long-Array benötigt 255 * 4 Bytes = 1020 Bytes, um 255 Bits zu speichern
- ein Byte-Array benötigt nur 255 Bytes
- eigentlich benötigt man ja nur 8 Bytes (= 256 Bits) zur platzsparendsten Speicherung
Ich habe daher einmal ein Code-Beispiel erstellt, das mit den 8 Bytes auskommt und das ganze in Assembler realisiert, um durch den Umrechnungsaufwand nicht zu sehr Performance zu verlieren. Letztendlich muß jeder selbst entscheiden, was ihm wichtiger ist: Platzverbrauch oder Performance
Code: Alles auswählen
Procedure ReadKeyBit(ByteOffset.L, BitOffset.L)
!PUSH EBX
!XOR EAX,EAX
!MOV EBX,DWORD[ESP+12]
!BT DWORD[ESP+8],EBX
!JNC $+3
!INC EAX
!POP EBX
ProcedureReturn
EndProcedure
Procedure ClearKeyBit(ByteOffset.L, BitOffset.L)
!MOV EAX,DWORD[ESP+8]
!BTR DWORD[ESP+4],EAX
EndProcedure
Procedure SetKeyBit(ByteOffset.L, BitOffset.L)
!MOV EAX,[ESP+8]
!BTS DWORD[ESP+4],EAX
EndProcedure
Procedure.L KeyHit(KeyCode.L)
Static KeyBuffer.S{8}
Protected BitOffset.L = KeyCode % 32
Protected ByteOffset.L = @KeyBuffer + KeyCode / 32
If KeyboardPushed(KeyCode)
If ReadKeyBit(ByteOffset, BitOffset) = 0
SetKeyBit(ByteOffset, BitOffset)
ProcedureReturn #True
EndIf
Else
ClearKeyBit(ByteOffset, BitOffset)
ProcedureReturn #False
EndIf
EndProcedure