Uncompressed Game Graphics
Uncompressed Game Graphics
Looking for advice on storing uncompressed graphics efficiently for a game project. Bitmaps seem too bulky, and while a pallet/tile system could work, the conversion process seems labor-intensive. Are there alternative methods to minimize file size without resorting to JPEG or GIF formats for that I'm using jpeg compressor this is the great or there is another method? Appreciate any suggestions.
Re: Uncompressed Game Graphics
PNG work well for certain graphics. Not sure what the best PNG library for freebasic is at the moment however.
Re: Uncompressed Game Graphics
I made a little Targa library to load and save graphics files natively, that is, in pure FreeBasic. I frequently use it when I don't want to incorporate 3rd party libraries into my programs, especially small programs for which so much code doesn't make much sense to add. I've posted this library somewhere here, but I can find it or it again if necessary. Of course, these Targa images are compressed, just not requiring lots of (3rd-party) code and not lossy.
If you want speed, therefore, truly uncompressed images, and your images are all the same width, placing your images vertically in the "palette" will allow you to read them faster than if they're side by side (though the difference is minimal) and it'd be easier to write to code to read them. If you are loading the whole image palette into memory and then picking the images from there instead of from the file, the difference becomes even less important. But if you have a huge amount of images, having them in a file vertically would allow you to load them "randomly", which can be very convenient.
So this very much depends on what you prioritise, whether speed, space, amount of code, amount of work if you're going to do it yourself.
If you want speed, therefore, truly uncompressed images, and your images are all the same width, placing your images vertically in the "palette" will allow you to read them faster than if they're side by side (though the difference is minimal) and it'd be easier to write to code to read them. If you are loading the whole image palette into memory and then picking the images from there instead of from the file, the difference becomes even less important. But if you have a huge amount of images, having them in a file vertically would allow you to load them "randomly", which can be very convenient.
So this very much depends on what you prioritise, whether speed, space, amount of code, amount of work if you're going to do it yourself.
Re: Uncompressed Game Graphics
Both compress and uncompress are available in the windows fb distribution (zlib1.dll)
They are in the bin/win32 and bin/win64 folders.
I have put in a path to my 64 bit dll and loaded the dll at runtime.
Here is an example to save much space.
They are in the bin/win32 and bin/win64 folders.
I have put in a path to my 64 bit dll and loaded the dll at runtime.
Here is an example to save much space.
Code: Select all
Const path="C:\Users\wlhut\Desktop\fb\fb10.1\FreeBASIC-1.10.1-winlibs-gcc-9.3.0\FreeBASIC-1.10.1-winlibs-gcc-9.3.0\bin\win64\zlib1.dll"
'load the dll and get the symbols:
Var L=Dylibload(path)
Dim Shared compressBound As Function(Byval sourceLen As Ulong) As Ulong
Dim Shared uncompress As Function(Byval dest As Ubyte Ptr, Byval destLen As Uinteger Ptr, Byval source As Ubyte Ptr, Byval sourceLen As Ulong) As Long
Dim Shared compress As Function(Byval dest As Ubyte Ptr, Byval destLen As Uinteger Ptr, Byval source As Ubyte Ptr, Byval sourceLen As Ulong) As Long
If L=0 Then Print "dll not found":Sleep:End
compressBound = Dylibsymbol(L,"compressBound")
If compressBound=0 Then Print "symbol compressbound not found":Sleep:End
uncompress= Dylibsymbol(L,"uncompress")
If uncompress=0 Then Print "symbol uncompress not found":Sleep:End
compress=Dylibsymbol(L,"compress")
If compress=0 Then Print "symbol compress not found":Sleep:End
Function getpassedinfo(text As String,Byref passed_length As Integer) As String
Dim As String var1,var2
Dim As Integer pst
#macro splice(stri,char,var1,var2)
pst=Instr(stri,char)
var1="":var2=""
If pst<>0 Then
var1=Mid(stri,1,pst-1)
var2=Mid(stri,pst+1)
Else
var1=stri
End If
#endmacro
splice(text,"|",var1,var2)
text=var2
passed_length=Valint(var1)
Return text
End Function
'================= UNPACK ===============
Function unpack(file As String) As String
Dim As Integer passed_length
Dim As String text=getpassedinfo(file,passed_length)
Dim As Integer stringlength,destinationlength
stringlength=Len(text)
destinationlength =passed_length
Dim As Ubyte Ptr source
Dim As Ubyte Ptr destination =Callocate(destinationlength,1)
source=@text[0]
Var mistake=uncompress(destination,@destinationlength, source, stringlength)
If mistake<>0 Then Print "There was an error":Sleep:End
Dim As String uncompressed
uncompressed=String(destinationlength,0)
For i As Integer = 0 To destinationlength- 1
uncompressed[i]=(destination[i])
Next
Deallocate destination
Return uncompressed
End Function
'=================== PACK ============
Function pack(file As String) As String
Dim As String text=file
Dim As Integer stringlength,destinationlength
stringlength=Len(text)
destinationlength = compressBound(stringlength)
Dim As Ubyte Ptr source
Dim As Ubyte Ptr destination =Callocate(destinationlength,1)
source=@text[0]
Var mistake=compress(destination, @destinationlength, source, stringlength)
If mistake <>0 Then Print "There was an error"
Dim As String compressed
compressed=String(destinationlength,0)
For n As Integer=0 To destinationlength-1
compressed[n]=destination[n]
Next n
compressed=stringlength &"|"+compressed
Deallocate destination
Return compressed
End Function
Function savefile(filename As String,p As String) As String
Dim As Long n=Freefile
If Open (filename For Binary Access Write As #n)=0 Then
Put #n,,p
Close
Else
Print "Unable to save " + filename:Sleep:End
End If
Return filename
End Function
Function loadfile(file As String) As String
Dim As Long f=Freefile
If Open (file For Binary Access Read As #f)=0 Then
Dim As String text
If Lof(f) > 0 Then
text = String(Lof(f), 0)
Get #f, , text
End If
Close #f
Return text
Else
Print file;" not found":Sleep:End
End If
End Function
'=========================================================
Screen 20,32
Dim As Any Ptr i=Imagecreate(1024,768)
Circle i,(512,400),200,Rgb(0,0,200),,,,f
Draw String i,(500,400),"BITMAP"
Bsave "screen20.bmp",i
Var f=loadfile("screen20.bmp")
Var cf=pack(f)
Print "size of compressed bitmap" ;Len(cf)
Kill "screen20.bmp"
savefile("screen20.bmp.compressed",cf)
Print "check your folder for size of compressed file (screen20.bmp.compressed), then press any key"
Sleep
Var f2=loadfile("screen20.bmp.compressed")
Var upf2=unpack(f2)
savefile("screen20.bmp",upf2)
If Bload("screen20.bmp")=0 Then
Print "size of actual bitmap ";Len(loadfile("screen20.bmp"))
Else
Print "Failed to bload"
End If
Sleep
Imagedestroy(i)
Kill "screen20.bmp"
Re: Uncompressed Game Graphics
I remind you that PNG is a compressed format.
If you want to store uncompressed images, bitmap is the format, and yes, it's bulky. I suppose the reason you don't want to use jpeg format is the loss in quality that comes with it: this happens because jpeg is a so-called lossy compression format. Likely, what you are looking for is not an uncompressed format, but a lossless compressed format: if you want to look for information, you should look for it. PNG is one of those formats.
If you want to store uncompressed images, bitmap is the format, and yes, it's bulky. I suppose the reason you don't want to use jpeg format is the loss in quality that comes with it: this happens because jpeg is a so-called lossy compression format. Likely, what you are looking for is not an uncompressed format, but a lossless compressed format: if you want to look for information, you should look for it. PNG is one of those formats.