ImageBuffer "Hack"? // Neu: UDP Problem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Xaymar

ehemals "Cgamer"

Betreff: ImageBuffer "Hack"? // Neu: UDP Problem

BeitragFr, März 12, 2010 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hatte irgendwo mal gelesen wie man in BB direkt den ImageBuffer anspricht. Nur habe ich nun vergeblich danach gesucht. Hat irgendwer nen Link bzw Code dazu?
Warbseite
  • Zuletzt bearbeitet von Xaymar am Sa, März 13, 2010 1:48, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragFr, März 12, 2010 20:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Was genau willst du denn machen? Ist Setbuffer imagebuffer nicht ausreichend?
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Xaymar

ehemals "Cgamer"

BeitragFr, März 12, 2010 20:44
Antworten mit Zitat
Benutzer-Profile anzeigen
ReadPixelFast ist zu langsam. Ich brauche nämlich immer einen Auschnitt eines Bildes in einer Bank und diese wird per netzwerk übertragen(komprimiert natürlich Smile ).

Edit:
Ich sollte meine Archive besser durchsuchen...
BlitzBasic: [AUSKLAPPEN]
;TEST
Graphics 1024, 768,32,2
SetBuffer BackBuffer()

Gbank = CreateBank(800*600*LockedFormat())
While Not KeyHit(1)
Cls

msec = MilliSecs()
LockBuffer
msec1 = MilliSecs()
CopyBufferToBank(GBank)
msec1 = MilliSecs()-msec1
SX = SX + 5
If SX >= 512
SY = SY + 5
SX = 0
EndIf
If SY >= 512
SY = 0
EndIf
For Y = 0 To 128
For X = 0 To 128
Pos = (SY * 1024*4) + (Y * 1024*4) + (SX * 4) + (X * 4)
PokeByte GBank, Pos, X * Y
PokeByte GBank, Pos+1, SX * X * Y
PokeByte GBank, Pos+2, SY * X * Y
PokeByte GBank, Pos+3, SX * SY + X * Y
Next
Next
msec2 = MilliSecs()
CopyBankToBuffer(GBank)
msec2 = MilliSecs()-msec2
UnlockBuffer
msec = MilliSecs()-msec

CopyRectToBank(20, 20, 100, 100, GBank, BackBuffer())

Text 0,0, msec
Text 0,15, msec1
Text 0,30, msec2
Text 0,45, SX
Text 0,30, SY
Flip
Wend
End

;ENDTEST
Function LockedFormat(buffer = 0)
Local bnkFormat, format

If buffer = 0 Then buffer = GraphicsBuffer()
bnkFormat = CreateBank(4)
apiRtlMoveMemory bnkFormat, buffer+104, 4
format = PeekInt(bnkFormat, 0)
FreeBank bnkFormat

Return format
End Function

Function LockedPitch(buffer = 0)
Local bnkPitch, pitch

If buffer=0 Then buffer = GraphicsBuffer()
bnkPitch = CreateBank(12)
apiRtlMoveMemory bnkPitch, buffer+92, 12
pitch = PeekInt(bnkPitch, 0)*PeekInt(bnkPitch, 8)/8
FreeBank bnkPitch

Return pitch
End Function

Function BufferWidth(buffer = 0)
Local bnkWidth, width

If buffer = 0 Then Return GraphicsWidth()
bnkWidth = CreateBank(4)
apiRtlMoveMemory bnkWidth, buffer+92, 4
width = PeekInt(bnkWidth, 0)
FreeBank bnkWidth

Return width
End Function

Function BufferHeight(buffer = 0)
Local bnkHeight, height

If buffer = 0 Then Return GraphicsHeight()
bnkHeight = CreateBank(4)
apiRtlMoveMemory bnkHeight, buffer+96, 4
height = PeekInt(bnkHeight, 0)
FreeBank bnkHeight

Return height
End Function

Function CopyRectToBank(X, Y, W, H, bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = W*H*PeekInt(bnkInfo, 28)/8

End Function

Function CopyBufferToBank(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory bank, PeekInt(bnkInfo, 0), size
FreeBank bnkInfo
Return True
EndIf
End Function

Function CopyBankToBuffer(bank, buffer = 0)
Local bnkInfo, size

If buffer=0 Then buffer = GraphicsBuffer()
bnkInfo = CreateBank(32)
apiRtlMoveMemory bnkInfo, buffer+72, 32
size = PeekInt(bnkInfo, 20)*PeekInt(bnkInfo, 24)*PeekInt(bnkInfo, 28)/8

If BankSize(bank)<size Or PeekInt(bnkInfo, 0)=0 Then
FreeBank bnkInfo
Return False
Else
apiRtlMoveMemory2 PeekInt(bnkInfo, 0), bank, size
FreeBank bnkInfo
Return True
EndIf
End Function
Warbseite

ozzi789

BeitragFr, März 12, 2010 21:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Machst du so was wie Remotedesktop?
Wenn dus auf die Reihe bringst gute FPS zu bekommen, meine war zu langsam, mach die Funktion Opensource plz, bräuchte das für ein älteres Projekt Very Happy
0x2B || ! 0x2B
C# | C++13 | Java 7 | PHP 5

Xaymar

ehemals "Cgamer"

BeitragFr, März 12, 2010 22:19
Antworten mit Zitat
Benutzer-Profile anzeigen
Kontaktier mich über ICQ: 417464565

Ich habe derzeit starke Probleme mit TCP. Irgendwas funkt da wieder zwischen die Blitzverbindung Sad (Verbunden->Verbindung verloren, auf beiden seiten.).
Warbseite
 

barratator

BeitragFr, März 12, 2010 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Du kannst mit LockedPixels arbeiten...Ich bezweifel aber, dass es trotzdem schnell genug sein wird.

Über TCP würde ich das auch nicht probieren, nehm lieber UDP für so eine Übertragung.


Gruß
Bastian

Xaymar

ehemals "Cgamer"

BeitragFr, März 12, 2010 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe nu rausgefunden, dass das BlitzTCP eine Wartezeit zwischen senden-senden von mindestens 250ms haben will. Kann das jemand bestätigen?
Warbseite

Starwar

BeitragFr, März 12, 2010 23:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Du wirst TCP so wie so nie schnell genug bekommen. die Lösung ist UDP.

Hummelpups

BeitragSa, März 13, 2010 1:35
Antworten mit Zitat
Benutzer-Profile anzeigen
dann bin ich ja beruhigt das es nicht an meinem Quiz Client lag das du ständig geflogen bist :>

Kann mir nich so richtig vorstellen das das SO langsam sein soll?

UDP is wirklich ne schöne sache, warum nutzt du nicht Max und ENet?

Micha
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Xaymar

ehemals "Cgamer"

BeitragSa, März 13, 2010 1:48
Antworten mit Zitat
Benutzer-Profile anzeigen
@hummelpups: *Hust* <_< Pixmaps >_> *Hust*

@Topic: Habe jetzt mal versucht das auf UDP zu übertragen. Leider ohne erfolg, der Server/Client Datentransfer bleibt bei 0. Warum?



BlitzBasic: [AUSKLAPPEN]
;Constants
Const PACKET_NEWCLIENT = $01
Const PACKET_PING = $1F
Const PACKET_LEAVE = $0F
Const PACKET_ACKNOWLEDGED = $FF
Const PACKET_QUADDATA = $3F
Const PACKET_QUADSIZE = $4F

Const ROLE_CLIENT = 1
Const ROLE_SERVER = 2
Const ROLE_CANCEL = 0

;Globals
Global ConnectionIP$
Global ConnectionPort = 6666, ConnectionPortCL = 6777
Global Connection

Global Timer = CreateTimer(30)

;Type
Type Client
Field IP, Port
Field QuadSize[2]
Field QuadX, QuadY
Field Ping, Pinging
End Type

Local Mode = RequestMode();Und was bist du?
Select Mode
Case ROLE_CLIENT
ConnectionIP = RequestIP()
Goto Client
Case ROLE_SERVER
Goto Server
End Select

ExitProcess(0)

;Hier die Includes
.Server
Include "ServerRD.bb"
ExitProcess(0)

.Client
Include "ClientRD.bb"
ExitProcess(0)


ServerRD
BlitzBasic: [AUSKLAPPEN]
;Server

;Erstellen des Servers
Connection = CreateUDPStream(ConnectionPort)
If Connection = 0 Then RuntimeError "Failed to setup Server"
...
Local Ret = RecvUDPMsg(Connection)
Matched = False
For Cnt.Client = Each Client
If Ret = Cnt\IP
;Read Avail Data
While Not Eof(Connection)
PacketID = ReadByte(Connection)
Select PacketID
Case PACKET_PING
If Cnt\Pinging = True
Cnt\Ping = MilliSecs()-Cnt\Ping
Cnt\Pinging = False
For A = 0 To CountGadgetItems(SV_Clients)
If Instr(GadgetItemText(SV_Clients,A),RSet(Cnt\IP,12)+" | "+RSet(Cnt\Port,5)) > 0
ModifyGadgetItem SV_Clients,A,"| "+RSet(Cnt\IP,12)+" | "+RSet(Cnt\Port,5)+" | "+RSet(Cnt\Ping,15)+" |"
EndIf
Next
Else
Cnt\Pinging = True
Cnt\Ping = MilliSecs()
WriteByte Connection, PACKET_PING
SendUDPMsg Connection,Cnt\IP,Cnt\Port
AddNetStats(0,1)
EndIf
AddNetStats(1,0)
Case PACKET_NEWCLIENT
WriteByte Connection, PACKET_ACKNOWLEDGED
SendUDPMsg Connection,Cnt\IP,Cnt\Port
AddNetStats(0,1)
AddGadgetItem SV_Clients, "| "+RSet(UDPMsgIP(Connection),12)+" | "+RSet(UDPMsgPort(Connection),5)+" | "+RSet(Cnt\Ping,15)+" |"
Case PACKET_LEAVE
Delete Cnt
WriteByte Connection, PACKET_ACKNOWLEDGED
SendUDPMsg Connection,Cnt\IP,Cnt\Port
AddNetStats(0,1)

For A = 0 To CountGadgetItems(SV_Clients)
If Instr(GadgetItemText(SV_Clients,A),RSet(UDPMsgIP(Connection),12)+" | "+RSet(UDPMsgPort(Connection),5)) > 0
RemoveGadgetItem SV_Clients, A
EndIf
Next

Exit
Case PACKET_QUADSIZE
Cnt\QuadSize[0] = ReadShort(Connection)
Cnt\QuadSize[1] = ReadShort(Connection)
End Select
Wend
Matched = True
EndIf
Next
;wurde nicht gefunden, also neuer Client. Es kommt aber einfach bei beiden nichts an.
If Matched = False
PacketID = ReadByte(Connection)
DebugLog PacketID
If PacketID = PACKET_NEWCLIENT
Cnt.Client = New Client
Cnt\IP = UDPMsgIP(Connection)
Cnt\Port = UDPMsgPort(Connection)
WriteByte Connection, PACKET_ACKNOWLEDGED
SendUDPMsg Connect, Cnt\IP, Cnt\Port
AddNetStats(1,1)
EndIf
EndIf
...
CloseUDPStream Connection


ClientRD
BlitzBasic: [AUSKLAPPEN]
;Client

;Erstelle Client und "Handshake"e
Connection = CreateUDPStream(ConnectionPortCL)

;Handshake
WriteByte Connection, PACKET_NEWCLIENT
SendUDPMsg Connection, ConnectionIP, ConnectionPort
MS = MilliSecs()
Repeat
Recv = RecvUDPMsg(Connection)
If Recv = ConnectionIP
PacketID = ReadByte(Connection)
If PacketID = PACKET_ACKNOWLEDGED
Exit
EndIf
EndIf

If MilliSecs()-MS > 2500
RuntimeError "Could not connect"
EndIf

WaitTimer Timer
Forever
;Handshake end (bis dahin kommt er nichmal...)
...
;Update Network
Recv = RecvUDPMsg(Connection)
...
CloseUDPStream Connection


Benötigt evtl:
ZlibApi, Kernel32.decls,User32.decls

Kernel32.decls Modifikation:
Code: [AUSKLAPPEN]
apiRtlMoveMemoryTo(Destination,Source*,Length):"RtlMoveMemory"
apiRtlMoveMemoryFrom(Destination*,Source,Length):"RtlMoveMemory"
apiRtlCopyMemoryTo(Destination,Source*,Length):"RtlCopyMemory"
apiRtlCopyMemoryFrom(Destination*,Source,Length):"RtlCopyMemory"
Warbseite
  • Zuletzt bearbeitet von Xaymar am Sa, März 13, 2010 12:43, insgesamt einmal bearbeitet

Starwar

BeitragSa, März 13, 2010 10:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Das kann man so nicht mehr Überblicken. Reduziere mal auf das Nötigste und kommentiere ein wenig.
MFG

Xaymar

ehemals "Cgamer"

BeitragSa, März 13, 2010 12:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Habe es jetzt auf nur den UDP Kram gekürzt und ein wenig Kommentiert. Sollte nun übersichtlicher sein.

Edit: Nach entfernen der winsocks userlib gehts... Irgendeinen Befehl hats wohl doppelt gegeben
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group