Streamed Loader
Übersicht

![]() |
Silver_KneeBetreff: Streamed Loader |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo. Um den allgemeinen Beschwerden mal ein wenig Luft zu machen habe ich einen StreamedLoader Geschrieben. Natürlich habe ich mich ersteinmal mit dem einfachsen Format, der Bitmap, beschäftigt. Der Loader ist allerdings so geschrieben, dass er einfach erweitert werden kann. Im Moment unterstützt der Loader also nur .bmp/.dib files und (dank meiner Faulheit) nur welche, die von unten nach oben oder von oben nach unten aufgebaut werden. Ohne Komprimierung oder ähnliches. Die ganzen Ints die ich dabei "überlese" werden in den Debuglog geworfen.
Code: [AUSKLAPPEN] vvvvv New Version vvvvv
Wer sich den code mal durchließt, sieht dass ich WritePixel anstatt WritePixelFast verwende habe. WritePixelFast lief bei meinem (ehemaligen) 100*100 FS-COM-Logo ohne Probleme. Doch die Grüne Idylle(die ich im Beispielcode auch genutzt habe) verursachte bei mir einen MAV sogar im Debugmodus. Ich hab also Buffer gelocked und WritePixel genommen. Ihr könnts ja mal bei euch mit WritePixelFast ausprobieren. Evtl Findet ihr eine Erklärung. Nun denn nur bmp nutzt relativ wenig. Ich probiere mich mal am PNG oder ihr könnt ja auch mal ein paar Formate Integrieren wenn ihr wollt, bzw das bmp Format etwas erweitern. -- StreamedLoader v1.0 Stablished (hört sich an wie irgend so ne Linux abart) Code: [AUSKLAPPEN] vvvvv New Version vvvvv
Der testcode hampelt nun noch etwas mir dem Image rum damit man sieht dass es ein normales Image ist.... Ansonsten sind die Bilder größen nun Richtig und die Bildgrenzen werden eingehalten auch wenn mir immer noch nicht klar ist warum er bei 672 abgebrochen hat....ob der debugger das Ende (x wäre fälschlicherweise wirklich 800 geworden^^) kommen sah? -- Nun denn. Ich habe nun die Versionsnummern unabhängig gemach sodass jeder der hier mitmachen will auch seine eigene Version hat. Das grundgerüst dass nun mit Banks und Konstanten arbeitet ist nun auf V2 wohingegen meine BMP-Lösung nun als v1.1 gilt. Also, siehe hier: Code: [AUSKLAPPEN] ;Lizenz:
;Darf jeder frei kopieren, verändern und als Ganzes oder teilweise einbauen. ;Sollte man für andere Formate Wege finden, sie hier einzubauen, bitte ich, sie im Blitzforum-Codearchiv in folgendem Thread zu veröffentlichenn: ;http://www.blitzforum.de/forum/viewtopic.php?t=26812 ;Ich werde immer wieder versuchen alle Versionen mit verschiedenen Formaten zu koppeln und so einen einhitliche Version zu erhalten. ; ;Grundgerüst(v2) & BMP(v1.1) von Silver_Knee(www.FS-COM.com). ;>>>>>FUNCTIONS Const SMD_max_STREAMs=1;<<Anpassen. Gibt die Anzahl der maximal gleichzeitig verwendeten Streams an. Dient um den Speicher zu reservieren. Dim SMD_BANK(0) Const SMD_STREAM=0,SMD_IMAGE=4,SMD_STATUS=8;Die Format-Unabhängigen Adressen. Const SMD_BMP_Y=12;<<Adresse beim BMP-FORMAT Const SMD_BMP_BANKSIZE=16;<<Größe der Bank. Bei BMP-FORMAT fest. Const SMD_BMP_STATUS1=1,SMD_BMP_STATUS2=2;<<Bei der Namenswahl war ich nun etwas faul... Function InitStreams() Dim SMD_BANK(SMD_max_STREAMs-1) For count=0 To SMD_max_STREAMs-1 SMD_BANK(count)=CreateBank(12) Next End Function Function UnInitStreams() For count=0 To SMD_max_STREAMs-1 FreeBank SMD_BANK(count) Next Dim SMD_BANK(0) End Function Function StartImageStream(stream) For count=0 To SMD_max_STREAMs-1 If PeekInt(SMD_BANK(count),SMD_STREAM)=0 Exit Next If count>SMD_max_STREAMs Return -1;-1=cache zu klein ResizeBank SMD_BANK(count),12 PokeInt(SMD_BANK(count),SMD_STATUS,0) PokeInt(SMD_BANK(count),SMD_STREAM,stream) End Function Function StopImageStream(id) PokeInt(SMD_BANK(id),SMD_STREAM,0) Return PeekInt(SMD_BANK(id),SMD_IMAGE) End Function Function LoadImageStreamed(id) Select PeekInt(SMD_BANK(id),SMD_STATUS) Case 0;just loaded short=ReadShort(PeekInt(SMD_BANK(id),SMD_STREAM)) Select short Case 19778 DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) tmp1=ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) tmp2=ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) PokeInt(SMD_BANK(id),SMD_IMAGE,CreateImage(tmp1,Abs(tmp2))) DebugLog PeekInt(SMD_BANK(id),SMD_STREAM)+" - Banksize"+BankSize(SMD_BANK(id)) ResizeBank SMD_BANK(id),SMD_BMP_BANKSIZE If tmp2<0 PokeInt(SMD_BANK(id),SMD_STATUS,SMD_BMP_STATUS2) Else PokeInt(SMD_BANK(id),SMD_STATUS,SMD_BMP_STATUS1) PokeInt(SMD_BANK(id),SMD_BMP_Y,tmp2-1) EndIf DebugLog PeekInt(SMD_BANK(id),SMD_STREAM)+" - Banksize"+BankSize(SMD_BANK(id)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) DebugLog ReadInt(PeekInt(SMD_BANK(id),SMD_STREAM)) End Select Case SMD_BMP_STATUS1;bmp von unten nach oben (häufigste bmp) LockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) For count=1 To ImageWidth(PeekInt(SMD_BANK(id),SMD_IMAGE));zeilenweise in einem Frame geladen b=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) g=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) r=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) WritePixelFast count-1,PeekInt(SMD_BANK(id),SMD_BMP_Y),r*$10000+g*$100+b,ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) Next UnlockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) PokeInt(SMD_BANK(id),SMD_BMP_Y,PeekInt(SMD_BANK(id),SMD_BMP_Y)-1) If PeekInt(SMD_BANK(id),SMD_BMP_Y)<0 PokeInt(SMD_BANK(id),SMD_STATUS,-1) EndIf Return Float(ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))-PeekInt(SMD_BANK(id),SMD_BMP_Y))/ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))*100 Case SMD_BMP_STATUS2;bmp von oben nach unten. ungetestet. LockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) For count=1 To ImageWidth(PeekInt(SMD_BANK(id),SMD_IMAGE));zeilenweise in einem Frame geladen g=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) r=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) b=ReadByte(PeekInt(SMD_BANK(id),SMD_STREAM)) WritePixelFast count-1,PeekInt(SMD_BANK(id),SMD_BMP_Y),$FF000000+r*$10000+g *$100+b,ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) Next UnlockBuffer ImageBuffer(PeekInt(SMD_BANK(id),SMD_IMAGE)) PokeInt(SMD_BANK(id),SMD_BMP_Y,PeekInt(SMD_BANK(id),SMD_BMP_Y)+1) If PeekInt(SMD_BANK(id),SMD_BMP_Y)>ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE)) PokeInt(SMD_BANK(id),SMD_STATUS,-1) EndIf Return Floor(Float(ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE))-PeekInt(SMD_BANK(id),SMD_BMP_Y))/ImageHeight(PeekInt(SMD_BANK(id),SMD_IMAGE)))*100 End Select End Function ;<<<<<FUNCTIONS ;>>>>>TESTCODE Graphics 800,600,0,2 SetBuffer BackBuffer() WaitKey stream=ReadFile("C:\WINDOWS\Web\Wallpaper\Grüne Idylle.bmp") InitStreams() id=StartImageStream(stream);Streamed-Loading Starten. If id=-1 RuntimeError "zu wenig Speicher Vorreserviert" Repeat pro=LoadImageStreamed(id) AppTitle pro+"%" DrawImage PeekInt(SMD_BANK(id),SMD_IMAGE),0,0;PeekInt(SMD_BANK(id),SMD_IMAGE) kann man verwenden während die Image noch geladen wird. Until PeekInt(SMD_BANK(id),SMD_STATUS)=-1;PeekInt(SMD_BANK(id),SMD_STATUS) wird auf -1 gesetzt wenn die Image fertig gelden wurde. Alternativ geht auch "pro=100" image=StopImageStream(id);Hier wird der Cache Freigegeben und die ImageHandle zurück gegeben. UnInitStreams() MidHandle image Repeat DrawImage image,MouseX(),MouseY() Flip Cls Until KeyHit(1) End ;<<<<<TESTCODE Die bank ist wie folgt aufgebaut: 1Int für den Stream, 1Int für die Imagehandle, 1Int für den Status. mach nach Adam Riese 3*4=12 Bytes. Status kann folgende werte annehmen: -1=Fertig. 0=gerade gestartet(1. Frame) alle anderen Werte kann man für seine Formate definieren. "Fest" ist bis jetzt 1 und 2 für BMP. Baut am besten ne Konstante ein wie ich. nicht dass dann 2 die 3 haben wollen und denn muss man den halben code umschreiben. Ansonsten habt ihr freie Wahl... Macht banks größer kleiner wie auch immer. nur behaltet halt die ersten 12 bytes im auge. Bmp braucht zB noch eine Zusatzangabe: der Y-Wert. Er wird auch in der Bank gespeichert. dazu hab ich sie mal eben um 4 Bytes vergrößert... |
||
- Zuletzt bearbeitet von Silver_Knee am Do, Jan 17, 2008 15:35, insgesamt 4-mal bearbeitet
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nicht schlecht! ![]() Bei mir kommt aber auch ein MAV wenn ich WritePixelFast verwende, aber es ist ja auch mit WritePixel schnell genug, denke ich. Zitat: Ich probiere mich mal am PNG
Hehe, viel Glück. Du wirst es brauchen. Das hier ist die kleinstmögliche Implementierung von PNG -> http://members.gamedev.net/lode/projects/LodePNG/ ![]() |
||
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Man muss bei Writepixelfast einfach nur schauen, dass der X - Wert (bei diesem Bild) kleiner als 799 und der Y - Wert kleiner als 599 ist.
Ich hab das bei mir kurz ausprobiert und dann funktionierts auch mit WritePixelFast. Das ganze ist wirklich sehr praktisch, aber wenn nur Bitmaps gehen, dann siehts düster aus für die Verwendung in späteren BB - Spielen ![]() Trotzdem *thumbs up* |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
warte mal. du hast ne abfrage eingebaut und dann gings???? Ich hab mal den Debugger drüber laufen lassen und mir den X,Y-Arrays geben lassen:
Code: [AUSKLAPPEN] 672,599
Code: [AUSKLAPPEN] zum Nachmachen vor die zeile mit Writepixel
DebugLog SMD_X(id)+","+SMD_Y(id) schreiben und writepixelfast hin. Noch etwas: [quote=Wikipedia und andere Quelllen]24 bpp: Die Daten jedes Pixels bestehen aus jeweils einem Byte für den Blau-, Grün- und Rot-Kanal (in dieser Reihenfolge!). [/quote] aber: Code: [AUSKLAPPEN] g=ReadByte(SMD_STREAM(id))
r=ReadByte(SMD_STREAM(id)) b=ReadByte(SMD_STREAM(id)) Irgend etwas stinkt da. Das einschnuppern in PNG bei dieser seite verlief..... ernüchternd^^ ich mach deshalb erstmal eine Umdisponierung von den Arrays in einen Bank Array. Dadurch kann jedes Format seinen eigenen Speicher benutzen, denn mir fiel auf dass SMD_X im Laufe der entwicklung von StreamedImage völlig sinnlos wurde... PNG hingegen wird wahrscheinlich viel mehr Variablen Brauchen... eine Bank wird also her müssen. @noobody Ich schlage vor du tust etwas dafür dass es in späreren BB-Spielen verwendung findest und machst zB ne JPEG schnittstelle rein.... warte aber bis ich die Bank-version draußen hab dass du dir ne für umsonst Arbeit machst ![]() |
||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, man darf nicht auf die Reihen Spalten rechts aussen bzw. unten zeichnen (bei dem Bild ist also Y = 599 das erste mal, dass der Error eintritt).
Daher muss da ne Abfrage hin, da man das Bild selbst nicht ein Pixel grösser machen sollte (ich habs getan und es wurde böse verzerrt ![]() Ich les mich gerade in Grafikformate ein, aber es ist zu komplex, das mal so eben einzubauen. Mal schauen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
moment
also mein bild siehts so aus Code: [AUSKLAPPEN] ACDEO
FGTSO DDRGO TRDEO OOOOO Jeder Buchstabe soll ein pixel darstellen. Das bild fängt unten links an. Der error kommt bei x=672 und y=599. y=599 heißt diese wagerechte O-Reihe und 627ist irgendwo.... das ist kein besonderer wert villeicht das 2./3. O ... nichts.... der wert steht in keinem Zusammenhang mit 800, der Breite... ich kapiere nicht warum das nicht gehen soll -.- aber nun gut ich setzte mich an banks..... und ich weiß dass mal eben einbauen nich is^^ icch bin beim einlesen von PNG schon aufm stuhl umgekippt^^ EDIT BUGFIX Der Code war an 3(!) Stellen Falsch. Die Fehler Haben sich so ausgeglichen das es einem So vorkam als würde er stimmen. Alle Fragen sind damit beantwortet: ich lese nun gbr Writepixelfast läuft und es gibt keine Bild-Verzerrung. Neuer Code im Ersten Post ... immernoch array based EDIT Nun denn da sind die Banks. Viel spaß beim rumbasteln ich mach mich vorerst an mein Giga Projekt zurück..... hmmmm ob das wirklich das kleinere übel ist..... äää ...*hust* |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group