[vtkusers] c# port of VTK

Sean McInerney seanm at nmr.mgh.harvard.edu
Mon Aug 2 21:13:41 EDT 2004


Andy,

   I can only conclude that C# is evil. My advice is to forswear all 
things Microsoft and move to a mountain commune. Save your soul and use 
the Python wrappers if you want the advantages of a "managing" language. 
.Net is just another of many MS products designed to "cut off the air 
supply" of existing solutions.

;-)

   That said, a C# wrapper should experience only the most minor of 
performance hits like those of the Python and Tcl wrappers. All of the 
heavy lifting is done by compiled C/C++ code. You wouldn't be 
implementing in C#, only accessing the VTK interfaces. Unless you can 
convince Kitware (and all the users of VTK) to switch to C# for library 
implementation, you should really take another look at wrappers.

-Sean

Andy Somogyi wrote:
> Originally, I thought of creating a wrapper. I investigated both
> managed c++ and c wrappers, but I determined that both approaches are
> unacceptable.
> 
> 1: managed c++ is EXTREMLY ugly and very non-portable, it is a windows only
> solution.
> 
> 2: A C wrapper is cross platform, and is a much better solution than 
> managed
> c++.
> 
> The problem with both approaches is virtuals, VTK has tons of them. In 
> order to
> create a proper .net binding, every single derived most class must be 
> inherited
> from (in c++ land), and every single virtual must be overriden to first 
> check if
> a c# class has overridden the virtual, and if so call the c# method, 
> otherwise,
> call the original c++ function.
> 
> As you can imagine, performance would be absolutly abysmal, as the c++ / c#
> transition is VERY costly. Calling C functions from c# is cheap, it only 
> takes
> an extra 2 instructions over calling a standard c# function, but the 
> other way
> around, calling a c# function (it has be registered as a callback) from 
> c or c++
> is VERY expensive. Not to mention that the c# side of the wrapper would 
> also be
> extremly ugly, as a callback (event in c#) must be created for every single
> virtual in c++, and this c# callback would then have to call a virtual 
> on the c#
> side.
> 
> Therefore, a 'wrapper' has been ruled out.
> 
>> I am not C# savvy, but are you saying that you cannot just pass a good 
>> old array of 3 doubles? Whatever you pass in (array[3] or 3 doubles), 
>> the point coordinates are *copied* into the internal instance of 
>> vtkDataArray. There is no need to be allocating a new array[3] each 
>> time you call SetPoint. For example, you could implement the first 
>> version of SetPoint using the second:
> 
> 
> Yes, you can pass an array of 3 doubles. c# can deal with 2 kinds of 
> arrays,
> managed and un-managed. Managed arrays are native .net types, they are 
> syntacally
> almost identical to c++ style arrays, except that they all have a 
> 'Length' property
> indicating the length of the array, so you would write code like:
> 
> for(int i = 0; i < myArray.Length; i++)
> {
>     myArray[i] = something;
> }
> 
> Managed arrays are allways allocated on the garbage collected heap, and 
> they also
> contain an extra 12 bytes of data to store a garbage collection handle, 
> run time
> type info, length and so forth.
> 
> Unmanged arrays are simply pointers to a raw block or memory, they can 
> be either
> stack or heap allocated, but if heap allocated, must be cleaned up. If 
> they are stack
> allocated, they can be be kept around after the function finishes, other 
> than by copying
> its contents.
> 
> The big problem with unmanged arrays is that they are passed as a raw 
> pointer (double*).
> In c++, you can give some hints as the size of the array, such as :
> void SetPoint(const double x[3])
> Even though this is still passed as a pointer in c++, the array size 
> x[3] is 'hinted' in the
> function declaration.
> 
> Passing an unmanged array in c# looks like:
> void SetPoint(double* x)
> There is not even a hint that this is of length 3, therefore it is very 
> error prone.
> 
> It is true that the SetPoint just coppies the values into a memory 
> block, I'm more
> concerned about getting values out, and not unnecessarily copying the 
> values
> over and over again.
> 
>>
>> void SetPoint(vtkIdType id, const double a[3])
>>   { this->SetPoint(id, a[0], a[1], a[2]); }
>>
>>> That is why I am considering changing the interface to use a Vector
>>
>>
>>  > struct instead of a managed array. A struct in c# is a value type, it
>>  > is allways allocated on the stack, and has virtually no overhead. It
>>  > behaves just like a good old C style struct.
>>
>>>
>>> So, using a Vector struct, the new method signatures would look like:
>>> public void SetPoint(IdType id, Vector3 x) ;
>>> public void SetPoint(IdType id, double x, double y, double z);
>>>
>>> The other advantage of useing a struct is that in time critical
>>
>>
>>  > sections, it can be cast as a double* and accessed just like a raw
>>  > memory block.
>>
>>>
>>> The biggest disadvantage of using a Vector struct is that in
>>
>>
>>  > introduces an unfarmiliar syntax to current VTK users who are used to
>>  > using a double x[3] array in c++.
>>
>>>
>> Well ... in the case that my assessment above is wrong *and* since you 
>> are porting rather than wrapping VTK ... I suppose making API changes 
>> is not out of the question. Just consider that the road that you are 
>> going down is similar to that of the Mesa port of OpenGL. You may find 
>> that this is more than a one man show. The point at which you port 
>> from C++ will be a separate branch of development. This is what I mean 
>> by difficult to maintain.
>>
>> I think that you really should consider an automated wrapping approach.
>>
>> -Sean
>>
>>>> Andy,
>>>>
>>>>   I am sure that a C# port could be very popular. Are you using a 
>>>> wrapping approach or are you parsing C++ code to generate C#?
>>>>
>>>>   Also, I am unsure of where you are encountering the problem that 
>>>> you describe in your message. Could you provide a few specific 
>>>> instances?
>>>>
>>>> -Sean
>>>>
>>>> Andy Somogyi wrote:
>>>>
>>>>> Hello VTK users
>>>>>
>>>>> I am in the process of completly porting VTK (4.2) to c#.
>>>>> As this is c#, it can be used nativly from any .net language.
>>>>>
>>>>> When finished, it will be freely availble under the existing VTL 
>>>>> lisence.
>>>>>
>>>>> My question is this:
>>>>>
>>>>> The c++ version of VTK uses length 3 arrays to represent a vector 
>>>>> in 3 space.
>>>>> This is fine in c++ because you can create arrays on the stack.
>>>>>
>>>>> It is not possible to create a managed array in c# on the stack, 
>>>>> they are allways
>>>>> heap allocated and garbage collected. So using a large number of 
>>>>> managed arrays, or
>>>>> creating large numbers of transitory arrays is very inefficient.
>>>>>
>>>>> The use of a 'value type' or a 'struct' in other words is far more 
>>>>> effcient when
>>>>> large numbers of objects are involved as they are created on the 
>>>>> stack and are not
>>>>> garbage collected.
>>>>>
>>>>> I have thought about using a raw double pointer (double*) instead 
>>>>> of an managed array
>>>>> for all functions that use a vector (double[3]). This has the 
>>>>> advantage of being very
>>>>> fast, but on the other hand, it is highly error prone, and a user 
>>>>> of one of these functions
>>>>> must declare thier method 'unsafe'. I would suspsct that this would 
>>>>> discourage many users.
>>>>>
>>>>> There are many good vector and matrix classes avaible for .net, 
>>>>> such as the standard vector and
>>>>> matrix types that ship with directx 9.
>>>>>
>>>>> So my question to any perspective vtk.net users is would you prefer 
>>>>> all existing methods
>>>>> that currently accept a c++ style array (double[3]) accept the 
>>>>> following in the new
>>>>> c# port:
>>>>>
>>>>> 1: managed array (new double[3])
>>>>>    advantages:
>>>>>    1.1 farmiliar syntax
>>>>>    1.2 do not have to declare 'unsafe' code
>>>>>    disadvanteges:
>>>>>    1.2 very ineffcient both in terms of size and performance
>>>>>
>>>>> 2: unmanaged pointer (double*)
>>>>>    advanteges:
>>>>>    2.1 very effecient
>>>>>    disadvantes:
>>>>>    2.2 error prone
>>>>>    2.3 need to pin a managed array or use 'stackalloc'
>>>>>
>>>>> 3: use a 'Vector3' value type
>>>>>    advanteges
>>>>>    3.1 very effcient
>>>>>    3.2 very safe
>>>>>    3.3 easy to convert to and from a 'double*'
>>>>>    disadvantes:
>>>>>    3.3 introduces unfarmiliair syntax
>>>>>
>>>>> Any ides or oppinions would be greatly appcieated
>>>>>
>>>>> thanks
>>>>>
>>
>>
> 
> _______________________________________________
> This is the private VTK discussion list. Please keep messages on-topic. 
> Check the FAQ at: <http://public.kitware.com/cgi-bin/vtkfaq>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
> 



More information about the vtkusers mailing list