Copy dynamic array to another

What is the fastest way (execution time) to copy the contents of a
dynamic array to another dynamic array (of the same size and type), so
that changes to one of them will not affect the other one?  Is
anything significantly faster than looping through the array?
0
Jud
7/25/2013 4:40:18 PM
embarcadero.delphi.general 4258 articles. 0 followers. Follow

13 Replies
5067 Views

Similar Articles

[PageSpeed] 29

Jud wrote:

> What is the fastest way (execution time) to copy the contents of a
> dynamic array to another dynamic array (of the same size and type),
> so that changes to one of them will not affect the other one?  Is
> anything significantly faster than looping through the array?

That depends on what is actually in the array.  If the array contain only 
POD types (ordinal types, etc), then you can simply Move() an entire array 
to the another array in a single operation.  But if the array contains any 
managed types (strings, interfaces, other dynamic arrays, etc), then you 
have to copy each array element one at a time in a loop so the managed items 
get copied correctly.

--
Remy Lebeau (TeamB)
0
Remy
7/25/2013 5:20:49 PM
On Thu, 25 Jul 2013 10:20:49 -0700, Remy Lebeau (TeamB)
<no.spam@no.spam.com> wrote:

>That depends on what is actually in the array.  If the array contain only 
>POD types (ordinal types, etc), then you can simply Move() an entire array 
>to the another array in a single operation.  

It is that type, but that doesn't work for a dynamic array, does it?
One of the dynamic array starts out as a copy of the other, but then
one is to be changed, leaving the other unchanged.
0
Jud
7/25/2013 5:37:19 PM
Jud wrote:

> It is that type, but that doesn't work for a dynamic array, does it?

Yes, it does, because you are making a byte-for-byte copy of the contents 
of the first array into the existing memory of the second array, eg:

{code:delphi}
var
  Arr1, Arr2: array of Integer;
  I: Integer;
begin
  SetLength(Arr1, 100);
  for I := 0 to High(Arr1) do
    Arr1[I] := I+1;
  
  SetLength(Arr2, Length(Arr1));
  Move(Arr1[0], Arr2[0], SizeOf(Integer) * Length(Arr1));
end;
{code}

An alternative is to use Copy() instead of Move().  You still get a unique 
copy of the source array, but Copy() is smart enough to know when it is safe 
to use a simple Move() to copy the array and when a per-element loop is needed 
instead for copying managed types, eg:

{code:delphi}
var
  Arr1, Arr2: array of Integer;
  I: Integer;
begin
  SetLength(Arr1, 100);
  for I := 0 to High(Arr1) do
    Arr1[I] := I+1;
  
  Arr2 := Copy(Arr1, 0, Length(Arr1));
end;
{code}

--
Remy Lebeau (TeamB)
1
Remy
7/25/2013 6:36:32 PM
On Thu, 25 Jul 2013 11:36:32 -0700, Remy Lebeau (TeamB)
<no.spam@no.spam.com> wrote:

>Yes, it does, because you are making a byte-for-byte copy of the contents 
>of the first array into the existing memory of the second array, eg:

OK, thanks.  With a dynamic array, if you extend it by setting the
length to a higher number, can you be sure that the array still
occupies a continuous part of RAM?
0
Jud
7/25/2013 8:38:09 PM
Jud wrote:

> OK, thanks.  With a dynamic array, if you extend it by setting
> the length to a higher number, can you be sure that the array
> still occupies a continuous part of RAM?

Yes.  Dynamic arrays in Delphi are always allocated as a single contigious 
block of memory.  However, resizing an array may cause it to move to a different 
section of RAM if the existing memory block cannot be resized inline.

--
Remy Lebeau (TeamB)
0
Remy
7/25/2013 8:46:11 PM
On Thu, 25 Jul 2013 13:46:11 -0700, Remy Lebeau (TeamB)
<no.spam@no.spam.com> wrote:

>Yes.  Dynamic arrays in Delphi are always allocated as a single contigious 
>block of memory.  However, resizing an array may cause it to move to a different 
>section of RAM if the existing memory block cannot be resized inline.

Thanks.  I thought it might be like a linked list.
0
Jud
7/25/2013 9:07:28 PM
Jud McCranie wrote:

> What is the fastest way (execution time) to copy the contents of a
> dynamic array to another dynamic array (of the same size and type), so
> that changes to one of them will not affect the other one?  Is
> anything significantly faster than looping through the array?

Simply do:

  MyOtherArray := Copy(MyOriginalArray);

This will create a unique array with copies of the contents of the
original one, so modifying MyOtherArray does not affect the original
one, and vice versa.

-- 
Rudy Velthuis (TeamB)    http://www.teamb.com

"A low voter turnout is an indication of fewer people going to 
 the polls." -- George W. Bush
0
Rudy
7/26/2013 7:52:34 AM
Jud McCranie wrote:

> On Thu, 25 Jul 2013 10:20:49 -0700, Remy Lebeau (TeamB)
> <no.spam@no.spam.com> wrote:
> 
> > That depends on what is actually in the array.  If the array
> > contain only POD types (ordinal types, etc), then you can simply
> > Move() an entire array to the another array in a single operation.  
> 
> It is that type, but that doesn't work for a dynamic array, does it?

Yes it does, but why don't you simply use Copy? That is much easier and
not much slower.

Anyway, if you do a Move, use the first element as source and
destination, so:

  Move(SourceArray[0], DestArray[0], 
         SizeOf(SourceArray[0]) * Length(SourceArray));

In other words, DON'T do:

  Move(SourceArray, DestArray, Sizeof etc..);

-- 
Rudy Velthuis (TeamB)    http://www.teamb.com

"Whatever you do will be insignificant, but it is very
 important that you do it."
 -- Mohandas Gandhi
0
Rudy
7/26/2013 9:12:21 AM
Jud McCranie wrote:

> On Thu, 25 Jul 2013 13:46:11 -0700, Remy Lebeau (TeamB)
> <no.spam@no.spam.com> wrote:
> 
> > Yes.  Dynamic arrays in Delphi are always allocated as a single
> > contigious block of memory.  However, resizing an array may cause
> > it to move to a different section of RAM if the existing memory
> > block cannot be resized inline.
> 
> Thanks.  I thought it might be like a linked list.

Not at all. But note that multidimensional dynamic arrays are not one
contiguous block. In other words:

  type
    TX = array of array of Integer;

should be seen as (invalid syntax, but I think it shows how to read it):

    TX = array of (array of Integer);

In other words, a TX is simply a single dimensional dynamic array with
each element a dynamic array of its own. It is equivalent to:

    TIntArray = array of Integer;
    TX = array of TIntArray;

This also means that each TIntArray can have it own size. This is a so
called "ragged array".

The syntax

  SetLength(myTX, 17, 32)

allocates 17 TIntArrays of each 32 integers and places their pointers
in myTX. That is why myTX[0] is a TIntArray, and myTX[0, 11] is an
Integer, and

  myInteger := myTX[0, 11];

is equivalent to:

  helpIntArray := myTX[0];
  myInteger := helpIntArray[11];

http://rvelthuis.de/articles/articles-pointers.html#multidynarrays

-- 
Rudy Velthuis (TeamB)    http://www.teamb.com

"Now comes the mystery" 
 -- Henry Ward Beecher, dying words, March 8, 1887
0
Rudy
7/26/2013 12:35:36 PM
On Fri, 26 Jul 2013 02:12:21 -0700, Rudy Velthuis (TeamB)
<newsgroups@rvelthuis.de> wrote:

>Yes it does, but why don't you simply use Copy? That is much easier and
>not much slower.

I didn't know if it would always work on a (one-dimensional) dynamic
array.  In my test, copy takes about 70% longer than move.
0
Jud
7/26/2013 5:04:10 PM
Jud wrote:

> I didn't know if it would always work on a (one-dimensional) dynamic
> array.  In my test, copy takes about 70% longer than move.

Copy() has to allocate new memory, and then uses Move() to copy data into 
that memory when possible (arrays of POD types), however it does have to 
perform some RTTI lookups to determine whether Move() is safe to use or not.

--
Remy Lebeau (TeamB)
0
Remy
7/26/2013 7:21:03 PM
Jud McCranie wrote:

> On Fri, 26 Jul 2013 02:12:21 -0700, Rudy Velthuis (TeamB)
> <newsgroups@rvelthuis.de> wrote:
> 
> > Yes it does, but why don't you simply use Copy? That is much easier
> > and not much slower.
> 
> I didn't know if it would always work on a (one-dimensional) dynamic
> array.  In my test, copy takes about 70% longer than move.

It depends on the array.

-- 
Rudy Velthuis (TeamB)    http://www.teamb.com

"Some men, in order to prevent the supposed intentions of their
 adversaries, have committed the most enormous cruelties."
 -- Clearchus, in Xenophon
0
Rudy
7/27/2013 9:29:56 AM
Remy Lebeau (TeamB) wrote:

> Jud wrote:
> 
> > I didn't know if it would always work on a (one-dimensional) dynamic
> > array.  In my test, copy takes about 70% longer than move.
> 
> Copy() has to allocate new memory, and then uses Move() to copy data
> into that memory when possible (arrays of POD types), however it does
> have to perform some RTTI lookups to determine whether Move() is safe
> to use or not.

I bechnmarked that, and even wrote my own version of the dynarray
management functions for TBytes, in order to avoid the RTTI lookup, but
soon found out there was no significant difference in performance. If
his code is much faster than Copy, something is wrong.

-- 
Rudy Velthuis (TeamB)    http://www.teamb.com

"Christians are supposed not merely to endure change, nor even
 to profit by it, but to cause it."
 -- Harry Emerson Fosdick
0
Rudy
7/29/2013 6:38:21 AM
Reply:

Similar Artilces:

Copy an array to another array by Pointer
Hi All, I have a lot of arrays like SomeArray1: Array[1..NumberOfElements1] of String = ('element1', 'element2', 'element3', 'element4' ....... SomeArray2: Array[1..NumberOfElements2] of String = ('element1', 'element2', 'element3', 'element4' ....... SomeArray3: Array[1..NumberOfElements3] of String = ('element1', 'element2', 'element3', 'element4' ....... SomeArray4: Array[1..NumberOfElements4] of String = ('element1', 'element2', 'element3', 'element4&...

AllocMem vs Dynamic Array Speed Test (see .Delphi.General)
This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --JivePart=_3c5a0.zeB8CwDOH5aMJzMl Content-Type: text/plain; charset="Utf-8" --JivePart=_3c5a0.zeB8CwDOH5aMJzMl Content-Type: application/zip; name="AllocMem Speed Test.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="AllocMem Speed Test.zip" UEsDBBQAAAAIACxKyDybs5DTnQAAAAwBAAANAAAAU3BlZWRUZXN0LmRwcmVOSwrCMBDdB3KHWQhV KTmAxYUIBRci1FxgascSbNMwSTeW3t3GRakWZvF+83iOu5qxhbsjqjT5k...

problem with dynamic array of dynamic array
var a:array of array of integer; begin setlength(a,2); setlength(a[0],1); setlength(a[1],2); a[0,0]:=1; //it is ok a[0,1]:=2; //it is not ok in my understanding a[0,1]:=2 is not ok because a[0] has only one element as i declared setlength(a[0],1) so i dont understand why this code exemple is compiled and run just fine ? > {quote:title=Yossi Rozenberg wrote:}{quote} > in my understanding a[0,1]:=2 is not ok because a[0] has only one element as i declared setlength(a[0],1) so i dont understand why this code exemple is compiled and run just fine ? By default, acces...

MOVED: problem with dynamic array of dynamic array
Moved to: embarcadero.public.delphi.language.delphi.general or: https://forums.embarcadero.com/thread.jspa?threadID=57076 -- Rudy Velthuis Rudin's Law: In a crisis that forces a choice to be made among alternative courses of action, people tend to choose the worst possible course. ...

Copying a 2D array to another one
Hello, I have an 2D array like this MyArray:array of array of boolean; what is the fastest way to copy all the datas from this array to another 2D array of same size ? Thanks John A Move with a SizeOf ? DH how do you use it with a 2D array ? for _each := Low(source) to High(source) do move(source[_each], _target[_each], Length(source)*sizeof(boolean)); That only works if the array sizes are the same and if the arrays are already allocated ! DH John Terry wrote: > Hello, > > I have an 2D array like this MyArray:array of array of boolean; ...

Dynamic Arrays / Static Arrays
If I call SetLength on a dynamic array, does it become more or less a static array? In use is there much difference between a dynamic and a static array? The reason I ask is becaue I don't seem to have had much use for dynamic arrays in what I've created in the past but due to a change of approach in one program I now need to declare an array without knowing how many elements it will have. In the previous incarnation I always knew in advance that the array would have 15 elements. I don't know why I've not had to ask this question before, but as usual, when I do have to...

Adding array to another array
Hi people :) I have two web methods that are returning two different arrays from web service.Now, is there a possibility that I add those returning arrays to one completely new array? How should I do this? My methods are returning arrays of custom structures.    Break Down the Wall  I'm going to assume Array and not an ArrayList or something like that. Just use the Array.Copy() method.______________________________________Robert Lindley | Sr. Software Engineer - MCP, MCADASTRA Innovations, Ltd. - Better Solutions by Design.---------------------------------...

Arrays, Arrays, Arrays
I mainly come from a JScript classic ASP background and I'm liking both C#.net and JScript.net. Now I have to say... "What's happened to arrays?" They used to be so flexible and easy to use. Here are my quick questions... Am I allowed to create an array with a non specified length so that I can add to it? If not then how can I modify an array's length? Can I create an array with a named index eg myArray["apple"] = "tasty"; or is the hash table the equivalent for this now? The classic array methods and properties like pop(), push(), length etc... are these no longer? Does one have to create their own custom class for these? To be honest, I really don't come from a coding background, self-taught you might say. All I really need is a good reference source then I'd be happy as larry. Are there and good referece sites out there for C# (or JScript.net)? At the moment I think I am cheating coz I'm using Classic Jscript ASP (I think) in my .net files unless there is nothing wrong with this? I do like the String and Array methods like split(), join(), indexof() etc... Surely these or their equivalent must exist for C#? Again, many thanks in advance. Hi, Checkout ArrayList. It has a lot more features when compared to Arrays. --Shravan Addaypally MCP Hi Am I allowed to create an array with a non specified length so that I can add to it? If not then how can I modify an array's length?? Well as someone said you c...

How would you expect a dynamic array deep copy to be named?
A small question as a small break from the XE2 news ;-) How would you expect a dynamic array deep copy to be named? To keep things in context, Copy() in Delphi only does shallow copy. You would expect it to be name DeepCopy? Clone? Something else? How is it named in other languages you know? Eric On 2011-08-03 09:01:16, Eric Grange wrote: > How would you expect a dynamic array deep copy to be named? Clone(); On 08/03/2011 20:01, Eric Grange wrote: > How would you expect a dynamic array deep copy to be named? > > To keep things in context, Copy() in Delph...

How to quickly delete an interface in a dynamic array? Delphi 2007
Hello all, I have a very large dynamic array that contains a list of interfaces. I want to delete one interface from the list quickly and the list must remain sorted. What's the best/fastest/most elegant way to do it? Everything I can think of involves Move() and pointer arithmetic. I was hoping for an elegant array.delete() function but the helpfile lets me down. My current sloooow method is to move the element that I want to delete to the end of the array (consecutively swapping it with the next element) and then calling setlength() to truncate the array, hoping/prayin...

How to Copy Different Length Arrays To Another One? [Edit]
I have a routine that uses elements of different length arrays. Let's say: {code} List1 : Array[1..1] Of String = ('A'); List2 : Array[1..4] Of String = ('B', 'C', D', 'E'); List3 : Array[1..3] Of String = ('F', 'G', H'); {code} I wish I could simply copy the content of each array to a common one according to my needs, instead of having to write different procedures for each List1, List2 and List3. Something like "*If xxx then List = List1 else List = List2*". And then use: {code} begin for i := 1 to Length(List...

Delphi 7 Copy Array of Byte to Variant [Edit]
Hello I'm using Delphi 7 and need to copy an array of byte to a variant. The use case is to copy a file on disk to a variant. What I doing now is shown below, but it would seem that the start of the file is not transferred to the variant correctly: The buffer which contains the file would seem to be ok but there is something wrong with the variant. Thanks in advance for any help. Paul var afile: file of byte; buffer: array of byte; i: Integer; vv : variant; begin // read the file into an array of byte AssignFile(afile, LocalPath+LocalFile...

Help converting Delphi code using dynamic array
I am converting some Delphi code into C++Builder XE4. I don't know the proper way to decline and resize the dynamic array " lines" which is an array of "TLines". Can you show the c++ code to declare cpp_TLine cpp_lines; and then resize the array cpp_lines in the function cpp_Addline. Thanks //-----Start Delphi Code----- tpoint3d = record x,y,z: real; end; TLine = record p1,p2: tpoint3d; end; var lines: array of TLine; procedure Addline(ln1: TLine); begin SetLength(lines,high(lines)+2); lines[high(lines)]:=...

Delphi XE3
I have a ADO dataset (DataSet1) with TBytesField and the DataSize of the field is 12. I want to copy the TBytesField data to another DataSet having a TBytesField with DataSize 12. I used the given below line of code to copy the field value from DataSet1 to DataSet2: DataSet2.Fields[0].Value := DataSet1.Fields[0].Value. This code was working in Delphi 2009. But after migrating to Delphi XE3, this is not working anymore. It raises an error "Invalid variant type" while trying to set the value. I tried to use GetData and SetData but same error comes. I think there is a bug with D...

Delphi 2010 RTTI Set length dynamic array [Edit]
Good day, I have a problem, i had searched this on google, and EDN but i didn't find a good source, or complet. var x,y:TValue; a:array [0..100] of integer; begin x:=TValue.From(v); y:=TValue.From(a); y.SetArrayElement(0,2); y.SetArrayElement(1,2); end; It works. because the compiler had allocated 100*32 bits in the heap memory. How i will procede for a dynamic array a:array of integer? I want: var y:TValue; a:array of integer; begin y:=TValue.From(a); y.SetArrayElement(y.GetArrayLength+1); Thank you very much and have a nice day. ...

Arrays in Config::General without resorting to copy/paste OR yaml
I'm trying to set a configuration file with Config::General and apparently to set an Array, I need to the following example: <example> lamp = linux lamp = apache lamp = mysql lamp = perl </example> When using keys that are long, it's simply a copy paste issue. Isn't the a more comfortable way? These don't work either: <lamp> linux, apache, mysql, perl </lamp> -- <lamp> linux apache mysql perl </lamp> Anyone? * On Wed, Oct 29 2008, Sawyer X wrote: > I'm trying to set ...

Delphi XE6 FireDAC SQLite copy a table from one database to another
How do I copy a single table from one SQLite database to another? Is there a simple command to do this? Thanks! > How do I copy a single table from one SQLite database to another? Is there a simple command to do this? Thanks! You should use ATTACH command. For example: {code} ATTACH 'c:\secondDB.sdb' AS sec; INSERT INTO SomeTab SELECT * FROM sec.SomeTab; {code} -- With best regards, Dmitry Arefiev / FireDAC Architect Thanks! > {quote:title=Dmitry Arefiev wrote:}{quote} > > How do I copy a single table from one SQLite database to another? Is there a...

help with array within another array
Hi: I just can't seem to figure this out. I am trying to declare two associative array (%nodeowner and %nodeseverity) within another array called %SESSION For example %nodeowner = ("node1", "john", "node2", "nancy"); %nodeseverity = ("node1", 5, "node2", 10); How do I declare %SESSION containing %nodeowner and %nodeseverity. And how do I access say the value John give node1 from the nodeowner array that is in SESSION? TIA Ravi _______________________________________________________________________________...

array of dates placed in dynamic array
Ok---I want to take an array of dates and load it into a dynamic array.  The reason I have duplicate dates in my dataset.  This means when it loads the 2nd or even 3rd date for that date. It just overrides the previous date's text.  So I need to load the date along w/the string into a dynamic array, so I can access it Right now to load the date I do the following: For rowCount = 0 To DsVacationData1.RequestDataManager.Rows.Count - 1row = DsVacationData1.RequestDataManager.Rows(rowCount)sDate = CStr(CDate(row.Item(1)))sEmployee = row.Item(8).ToString + " " + row.Item(9).ToStr...

Array.copy vs Array.clone
can any one give the Difference between Array.copy and Array.clone  with an example   Thanks in Advance Clone() just implements the ICloneable interface. It creates new instance of array holding the same elements, but returns object you have to cast. ArrayCopy() is static helper method. It copies elements from one array to another. The destination array has to be already created with right dimension. You can use this method instead for loop.Don't forget to click "Mark as Answer" on the post that helped you. Hi Praveen, ... and welcome to our forum ...! ar...

copy 3D array to 2D array
hi, i am trying to copy a three dimensional array to a two dimentional one this: @AoA = ( [2, 3], [4, 5, 7], [0] ); to this @A = qw(2 3 4 5 7 0); i know the answer is staring at me in perldoc perldsc but i cant see it! thanks rob On Tue, Feb 10, 2009 at 11:13, Rob Canning <robcanning@eircom.net> wrote: > hi, > > i am trying to copy a three dimensional array to a two dimentional one > > this: > > @AoA = ( [2, 3], [4, 5, 7], [0] ); > > to this > > @A = qw(2 3 4 5 7 0); > > i know the answer is staring at me in pe...

C++ Array of Rect to Delphi Array of Rects
Hello! Does anyone know how is the correct way to send an array of Rect from C++ (dll) to the delphi ? I'm using callbacks to receive the information. Thank you in advance! Regards, Everton Soares Manso > Does anyone know how is the correct way to send an array of Rect from C++ (dll) to the delphi ? I'm using callbacks to receive the information. assuming you have an array of Rect and the number of elements as an int, you can use following function on the caller side: void __cdecl PassRects(int count, Rect* rects) You can call it like this: Rect rects[1...

Creating a Dynamic button from another Dynamic Button
Hi, I have created a button Dynamically as follows: Button b=new Button(); b.Text="Hello"; this.Controls.Add(b); b.Show(); How to create another Button(some Button) when clicked on the above created button. You have to handle the on click event of the dynamic button. In the onclick event you can create another button in the same way as you have done. Remember to create the dynamic button on every post back other wise you will not be able to capture the click event..Vikram www.vikramlakhotia.comPlease mark the answer if it helped you try this link: http://support.mic...

How to insert an array in to the middle of another array after a certain pattern
------=_Part_13037_4432203.1176492002967 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello everyone, I'm a Perl beginner and I've been trying for a while to to insert an array in to the middle of another array after a certain pattern. Here is what I'm trying to do...I have the Linux Iptables configuration file, which has a custom chain called MAC which hold all the IP to MAC entries mappings. Since I update the list manually, I usually end up with IP addresses here and there...I managed to put...

Web resources about - Copy dynamic array to another - embarcadero.delphi.general

Dynamics - Wikipedia, the free encyclopedia
Brownian dynamics , the occurrence of Langevin dynamics in the motion of particles in solution (e.g. a grain in water, as was first seen by Brown); ...

Datacenter Dynamics
Datacenterdynamics for data center information, conferences, news, videos, whitepapers and reports globally

Dynamic Chiropractic - chiropractic, news, articles, research & information for chiropractors - Find ...
Dynamic Chiropractic - chiropractic, news, articles, research & information for chiropractors - Find a Chiropractor

Malcolm Turnbull announces 'dynamic' ministry
Prime Minister Malcolm Turnbull announces the results of a ministerial reshuffle, to feature six women in cabinet, in the wake of several retirements ...

Cabinet reshuffle: Malcolm Turnbull unveils 'dynamic' new ministry as Mal Brough resigns
Prime Minister Malcolm Turnbull announces his new frontbench, emphasising the roles of his younger and female colleagues.

The Master & Dynamic MW60 Wireless Headphones impress
... life. Bluetooth audio technology is slowly improving, however, if youre willing to spend the money. Based in New York City, Master & Dynamic ...

Lenovo and Apple: PCs’ Dynamic Duo, Gobbling Up Share in Downbeat Market
... in units sold, with gains in market share for top vendor Lenovo Group ( 0992HK ), and for Apple ( AAPL ), who turned out to be the Dynamic Duo ...

Seattle Councilmember O'Brien: Power dynamic between Uber, drivers is out of balance
Seattle is the first city in the U.S. to give Uber drivers the right to form a union, but whether that actually happens might be up to the courts. ...

Steel Dynamics, Inc. (STLD) Rating Lowered to Hold at TheStreet
Steel Dynamics, Inc. (NASDAQ:STLD) was downgraded by research analysts at TheStreet to a “hold” rating in a research note issued to investors ...

Dynamic difficulty tuning is coming to Killing Floor 2
Killing Floor has a fairly hardcore following: these folks build wikis to know every single damage value in the game, and pore over enemy animations ...

Resources last updated: 2/21/2016 11:01:24 AM