| 10-06-2005, 02:17 AM | #1 |
Is using game cache really worth it? Does it reduce lag or load time significantly? Should I remove all global integers, booleans, reals, and strings and store them in game cache instead? |
| 10-06-2005, 03:47 AM | #2 |
Multiplayer gamecache is mainly to make spells multiinstable and easier, i.e handle variables. The fact that you can store things in a handle basically through gamecache makes it invaluable. |
| 10-08-2005, 02:20 AM | #3 |
So is using game cache more efficient than using global variables? |
| 10-08-2005, 06:59 PM | #4 | |
Quote:
The point of game cache is that you can use it in combination with H2I() to store handle specific data, which in combination with local variables makes JASS so much more powerful than GUI. Global arrays can't do this due to the index limit that's around 8000, handle indexes go above that, so you can't use them as the array index, but you can use them as a cache missionkey if you convert them to a string. |
| 10-08-2005, 07:12 PM | #5 |
Gamecaches are just tables and are slower It should not replace local variables or global variables. It is better as a table, which is exactly what it is a table. It cannot perform other actions |
| 10-08-2005, 07:16 PM | #6 |
--- I used this block to test a lot of tags, now they seem to work, I can't delete posts... JASS://************************************************************************************************* // Caster System Free Attach Variables / Sets and Tables // // Requirement: gamecache global variable udg_cscache // //************************************************************************************************* //##Begin of CS Gamecache engine## //================================================================================================= // GameCache - Return bug module : Without gamecache or return bug, JASS would be a // retarded-limited scripting language. // //================================================================================================= // a.k.a H2I, changed name to CS_H2I to prevent conflicts with other systems (I intended this // system to be easy to copy // function CS_H2I takes handle h returns integer return h return 0 endfunction //================================================================================================= // Main Gamecache handler // function CSCache takes nothing returns gamecache if udg_cscache==null then call FlushGameCache(InitGameCache("CasterSystem.vx")) set udg_cscache=InitGameCache("CasterSystem.vx") call StoreInteger(udg_cscache,"misc","TableMaxReleasedIndex",100) //Makes table indexes start at 100, so they don't conflict with certain handle types. endif return udg_cscache endfunction //================================================================================================== // Attachable vars : Attacheable variables are what most other people call Handle Variables, they // allow to relate data with any handle, using a label, and its value, the stuff auto flushes if // the value is 0, false, "", or null . // // Differences between Attacheable variables and "Local Handle Variables" : // - The names of the functions // - The name of the function group does not cause confusion, it is difficult to say: // "you should set local handle variables to null at the end of a function" since // it sounds as if you were talking about the "Local Handle Variables" // - Also Have Attacheable Sets. // - And can work together with Tables. // // Notes: don't "attach" variables on texttags nor those handle types used mostly for parameters // (for example damagetype) , Although there is no reason to do so anyways // // Gamecache stuff are NOT Case Sensitive, don't ever use "" for label (Crashes game!) // //============================================================================================================ // For integers // function AttachInt takes handle h, string label, integer x returns nothing local string k=I2S(CS_H2I(h)) if x==0 then call FlushStoredInteger(CSCache(),k,label) else call StoreInteger(CSCache(),k,label,x) endif endfunction function GetAttachedInt_FromSet takes handle h, gamecache g returns integer return GetStoredInteger(g,I2S(CS_H2I(h))+";"+GetStoredString(g,"argpass","set"),GetStoredString(g,"argpass","seti")) endfunction function GetAttachedInt takes handle h, string label returns integer if (label=="") then return GetAttachedInt_FromSet(h,CSCache()) endif return GetStoredInteger(CSCache(), I2S(CS_H2I(h)), label) endfunction //============================================================================================================= function AttachReal takes handle h, string label, real x returns nothing local string k=I2S(CS_H2I(h)) if x==0 then call FlushStoredReal(CSCache(),k,label) else call StoreReal(CSCache(),k,label,x) endif endfunction function GetAttachedReal takes handle h, string label returns real return GetStoredReal(CSCache(),I2S(CS_H2I(h)),label) endfunction //============================================================================================================= function AttachBoolean takes handle h, string label, boolean x returns nothing local string k=I2S(CS_H2I(h)) if not x then call FlushStoredBoolean(CSCache(),k,label) else call StoreBoolean(CSCache(),k,label,x) endif endfunction function GetAttachedBoolean takes handle h, string label returns boolean return GetStoredBoolean(CSCache(),I2S(CS_H2I(h)),label) endfunction //============================================================================================================= function AttachString takes handle h, string label, string x returns nothing local string k=I2S(CS_H2I(h)) if x=="" then call FlushStoredString(CSCache(),k,label) else call StoreString(CSCache(),k,label,x) endif endfunction function GetAttachedString takes handle h, string label returns string return GetStoredString(CSCache(),I2S(CS_H2I(h)),label) endfunction //============================================================================================================= function AttachObject takes handle h, string label, handle x returns nothing local string k=I2S(CS_H2I(h)) if (x==null) then call FlushStoredInteger(CSCache(),k,label) else call StoreInteger(CSCache(),k,label,CS_H2I(x)) endif endfunction function GetAttachedObject takes handle h, string label returns handle return GetAttachedInt(h,label) return null endfunction function GetAttachedWidget takes handle h, string label returns widget return GetAttachedInt(h,label) return null endfunction function GetAttachedRect takes handle h, string label returns rect return GetAttachedInt(h,label) return null endfunction function GetAttachedRegion takes handle h, string label returns region return GetAttachedInt(h,label) return null endfunction function GetAttachedTimerDialog takes handle h, string label returns timerdialog return GetAttachedInt(h,label) return null endfunction function GetAttachedUnit takes handle h, string label returns unit return GetAttachedInt(h,label) return null endfunction function GetAttachedItem takes handle h, string label returns item return GetAttachedInt(h,label) return null endfunction function GetAttachedEffect takes handle h, string label returns effect return GetAttachedInt(h,label) return null endfunction function GetAttachedDestructable takes handle h, string label returns destructable return GetAttachedInt(h,label) return null endfunction function GetAttachedTrigger takes handle h, string label returns trigger return GetAttachedInt(h,label) return null endfunction function GetAttachedTimer takes handle h, string label returns timer return GetAttachedInt(h,label) return null endfunction function GetAttachedGroup takes handle h, string label returns group return GetAttachedInt(h,label) return null endfunction function GetAttachedTriggerAction takes handle h, string label returns triggeraction return GetAttachedInt(h,label) return null endfunction function GetAttachedLightning takes handle h, string label returns lightning return GetAttachedInt(h,label) return null endfunction function GetAttachedImage takes handle h, string label returns image return GetAttachedInt(h,label) return null endfunction function GetAttachedUbersplat takes handle h, string label returns ubersplat return GetAttachedInt(h,label) return null endfunction //============================================================================================================ // Attached Sets: Attachable Sets are handy in some situations and are a part of attachable variables, // you can add integers or objects to a set, order doesn't matter and adding the same object twice is // meaningless. CleanAttachedVars is always ready to clean every set owned by the handle. // //============================================================================================================ function AttachedSetAddInt takes handle h, string setn, integer int returns nothing local gamecache g=CSCache() local string k=I2S(CS_H2I(h)) local integer n local integer x=GetStoredInteger(g,k,"#setnumberof;"+setn) local integer y if x==0 then set y=GetStoredInteger(g,k,"#totalsets")+1 call StoreInteger(g,k,"#totalsets",y) call StoreInteger(g,k,"#setnumberof;"+setn,y) call StoreString(g,k,"#setName;"+I2S(y),setn) endif set k=k+";"+setn if not HaveStoredInteger(g,k,"Pos"+I2S(int)) then set n=GetStoredInteger(g,k,"n")+1 call StoreInteger(g,k,"n",n) call StoreInteger(g,k,I2S(n),int) call StoreInteger(g,k,"Pos"+I2S(int),n) endif set g=null endfunction function AttachedSetAddObject takes handle h, string setn, handle val returns nothing call AttachedSetAddInt(h,setn,CS_H2I(val)) endfunction //============================================================================================================ function AttachedSetHasInt takes handle h, string setn, integer int returns boolean return HaveStoredInteger(CSCache(),I2S(CS_H2I(h))+";"+setn,"Pos"+I2S(int)) endfunction function AttachedSetHasObject takes handle h, string setn, handle val returns boolean return AttachedSetHasInt(h,setn,CS_H2I(val)) endfunction //============================================================================================================ function GetAttachedSetSize takes handle h, string setn returns integer return GetStoredInteger(CSCache(),I2S(CS_H2I(h))+";"+setn,"n") endfunction //============================================================================================================ function AttachedSetRemInt takes handle h, string setn, integer int returns nothing local gamecache g=CSCache() local string k=I2S(CS_H2I(h))+";"+setn local integer n local integer x local integer y if HaveStoredInteger(g,k,"Pos"+I2S(int)) then set x=GetStoredInteger(g,k,"Pos"+I2S(int)) set n=GetStoredInteger(g,k,"n") if x!=n then set y=GetStoredInteger(g,k,I2S(n)) call StoreInteger(g,k,I2S(x),y) call StoreInteger(g,k,"Pos"+I2S(y),x) endif call FlushStoredInteger(g,k,"Pos"+I2S(int)) call FlushStoredInteger(g,k,I2S(n)) call StoreInteger(g,k,"n",n-1) endif set g=null endfunction function AttachedSetRemObject takes handle h, string setn, handle val returns nothing call AttachedSetRemInt(h,setn,CS_H2I(val)) endfunction //============================================================================================================ function FromSetElement takes string setn, integer index returns string local gamecache g=CSCache() call StoreString(g,"argpass","set",setn) call StoreString(g,"argpass","seti",I2S(index)) set g=null return "" endfunction //============================================================================================================ function ClearAttachedSet takes handle h, string setn returns nothing call FlushStoredMission(CSCache(),I2S(CS_H2I(h))+";"+setn) endfunction function CleanAttachedVars takes handle h returns nothing local gamecache g=CSCache() local string k=I2S(CS_H2I(h)) local integer n=GetStoredInteger(g,k,"#totalsets") local integer i=1 loop exitwhen i>n call FlushStoredMission(g,k+";"+GetStoredString(g,k,"#setName;"+I2S(i))) set i=i+1 endloop call FlushStoredMission(g, k ) set g=null endfunction //============================================================================================= // Tables // // Tables are lame, the real name would be hash tables, they are just abbreviated usage // of gamecache natives with the addition that you can also Copy the values of a table to // another one, but don't expect it to be automatic, it must use a FieldData object to know // which fields and of wich types to copy, Copying a table to another, with a lot of Fields, // should surelly be lag friendly. // // The other thing about tables is that I can say that the Attached variables of a handle work // inside a table and GetAttachmentTable which is just return bug and I2S , works to allow you // to manipulate a handle's attached variables through a table. // // NewTable and DestroyTable were created to allow to create tables in the fly, but you can // simply use strings for tables, but place the table names should be between "("")" or "[""]" // for example: "[mytable]" to avoid conflicts with other caster system stuff. // function NewTableIndex takes nothing returns integer local gamecache g=CSCache() local integer n=GetStoredInteger(g,"misc","FreeTableTotal") local integer i if (n>0) then set i=GetStoredInteger(g,"misc","FreeTable1") if (n>1) then call StoreInteger(g,"misc","FreeTable1", GetStoredInteger(g,"misc","FreeTable"+I2S(n)) ) call FlushStoredInteger(g,"misc","FreeTable"+I2S(n)) endif call StoreInteger(g,"misc","FreeTableTotal", n-1) else set i=GetStoredInteger(g,"misc","TableMaxReleasedIndex")+1 call StoreInteger(g,"misc","TableMaxReleasedIndex",i) endif call StoreBoolean(g,"misc","Created"+I2S(i),true) set g=null return i endfunction function NewTable takes nothing returns string return I2S(NewTableIndex()) endfunction function GetAttachmentTable takes handle h returns string return I2S(CS_H2I(h)) endfunction //============================================================================================================ function DestroyTable takes string table returns nothing local gamecache g=CSCache() local integer i=S2I(table) local integer n if (i!=0) and (GetStoredBoolean(g,"misc","Created"+table)) then call FlushStoredBoolean(g,"misc","Created"+table) set n=GetStoredInteger(g,"misc","FreeTableTotal")+1 call StoreInteger(g,"misc","FreeTableTotal",n) call StoreInteger(g,"misc","FreeTable"+I2S(n),i) endif call FlushStoredMission(g,table) set g=null endfunction //============================================================================================================ function SetTableInt takes string table, string field, integer val returns nothing local gamecache g=CSCache() if (val==0) then call FlushStoredInteger(g,table,field) else call StoreInteger(g,table,field,val) endif set g=null endfunction function GetTableInt takes string table, string field returns integer return GetStoredInteger(CSCache(),table,field) endfunction //============================================================================================================ function SetTableReal takes string table, string field, real val returns nothing local gamecache g=CSCache() if (val==0) then call FlushStoredReal(g,table,field) else call StoreReal(g,table,field,val) endif set g=null endfunction function GetTableReal takes string table, string field returns real return GetStoredReal(CSCache(),table,field) endfunction //============================================================================================================ function SetTableBoolean takes string table, string field, boolean val returns nothing local gamecache g=CSCache() if (not(val)) then call FlushStoredBoolean(g,table,field) else call StoreBoolean(g,table,field,val) endif set g=null endfunction function GetTableBoolean takes string table, string field returns boolean return GetStoredBoolean(CSCache(),table,field) endfunction //============================================================================================================ function SetTableString takes string table, string field, string val returns nothing local gamecache g=CSCache() if (val=="") or (val==null) then call FlushStoredString(g,table,field) else call StoreString(g,table,field,val) endif set g=null endfunction function GetTableString takes string table, string field returns string return GetStoredString(CSCache(),table,field) endfunction //============================================================================================================ // You may ask why am I using thousands of functions instead of multi-use return bug exploiters? Well, // these make the thing much easier to read (in my opinion) and it is also better in performance since we // have less function calls (H2U(GetTableObject("table","unit"))) would be worse than GetTableUnit that is // quite direct. // function SetTableObject takes string table, string field, handle val returns nothing local gamecache g=CSCache() if (val==null) then call FlushStoredInteger(g,table,field) else call StoreInteger(g,table,field,CS_H2I(val)) endif set g=null endfunction function GetTableObject takes string table, string field returns handle return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableWidget takes string table, string field returns widget return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableRect takes string table, string field returns rect return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableRegion takes string table, string field returns region return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableTimerDialog takes string table, string field returns timerdialog return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableUnit takes string table, string field returns unit return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableItem takes string table, string field returns item return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableEffect takes string table, string field returns effect return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableDestructable takes string table, string field returns destructable return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableTrigger takes string table, string field returns trigger return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableTimer takes string table, string field returns timer return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableGroup takes string table, string field returns group return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableTriggerAction takes string table, string field returns triggeraction return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableLightning takes string table, string field returns lightning return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableImage takes string table, string field returns image return GetStoredInteger(CSCache(),table,field) return null endfunction function GetTableUbersplat takes string table, string field returns ubersplat return GetStoredInteger(CSCache(),table,field) return null endfunction //============================================================================================================ // Returns true if the fiel contains a value different from 0, false, null, or "" (depending on the type) // it is worthless to use this with boolean, since it would be the same as reading the boolean value // function HaveSetField takes string table, string field, integer fieldType returns boolean if (fieldType == bj_GAMECACHE_BOOLEAN) then return HaveStoredBoolean(CSCache(),table,field) elseif (fieldType == bj_GAMECACHE_INTEGER) then return HaveStoredInteger(CSCache(),table,field) elseif (fieldType == bj_GAMECACHE_REAL) then return HaveStoredReal(CSCache(),table,field) elseif (fieldType == bj_GAMECACHE_STRING) then return HaveStoredString(CSCache(),table,field) endif return false endfunction //============================================================================================================ // Allows to copy a table to another one, but it needs a FieldData object to know which fields of which type // it is supposed to copy. // function CopyTable takes integer FieldData, string sourceTable, string destTable returns nothing local gamecache g=CSCache() local integer i=1 local string k=I2S(FieldData) local string k2 local string k3 local integer n=GetStoredInteger(g,k,"N") local integer t loop exitwhen (i>n) set k2=I2S(i) set t=GetStoredInteger(g,k,k2) set k3=GetStoredString(g,k,k2) if (t==bj_GAMECACHE_BOOLEAN) then if (HaveStoredBoolean(g,sourceTable,k3)) then call StoreBoolean(g,destTable,k3,GetStoredBoolean(g,sourceTable,k3)) else call FlushStoredBoolean(g,destTable,k3) endif elseif (t==bj_GAMECACHE_INTEGER) then if (HaveStoredInteger(g,sourceTable,k3)) then call StoreInteger(g,destTable,k3,GetStoredInteger(g,sourceTable,k3)) else call FlushStoredInteger(g,destTable,k3) endif elseif (t==bj_GAMECACHE_REAL) then if (HaveStoredReal(g,sourceTable,k3)) then call StoreReal(g,destTable,k3,GetStoredReal(g,sourceTable,k3)) else call FlushStoredReal(g,destTable,k3) endif elseif (t==bj_GAMECACHE_STRING) then if (HaveStoredString(g,sourceTable,k3)) then call StoreString(g,destTable,k3,GetStoredString(g,sourceTable,k3)) else call FlushStoredString(g,destTable,k3) endif endif set i=i+1 endloop set g=null endfunction //============================================================================================= // FieldData inherits from Table, was just designed to be used by CopyTable. // function FieldData_Create takes nothing returns integer return NewTableIndex() endfunction //============================================================================================================ // valueType uses the same integer variables from blizzard.j : // bj_GAMECACHE_BOOLEAN, bj_GAMECACHE_INTEGER, bj_GAMECACHE_REAL and bj_GAMECACHE_STRING // function FieldData_AddField takes integer fielddata, string field, integer valueType returns nothing local gamecache g=CSCache() local string k=I2S(fielddata) local integer n=GetStoredInteger(g,k,"N")+1 local string k2=I2S(n) call StoreString(g,k,k2,field) call StoreInteger(g,k,k2,valueType) call StoreInteger(g,k,"N",n) set g=null endfunction //============================================================================================= // Destroys Field Data function FieldData_Destroy takes integer fielddata returns nothing call DestroyTable(I2S(fielddata)) endfunction //##End of CS Gamecache engine## |
