Sign in to follow this  

[C#] Boxing problem

This topic is 4134 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello, I have a boxing issue and I don't know how to avoid it, maybe you will be able to give my some hints ! Here is the current situation :

public class VtxGroupe<VertexType>
{
    VertexType[] _MyVertices

    RenderVertices(MyVertices);

}


...
public void RenderVertices(Array VerticesArray)
{
...
      GraphicsStream.write(VerticesArray); // It seems that the graphicstream is doing a boxing, while I was running Nprof profiler. Is there a way to avoid it ?
...
}


Share this post


Link to post
Share on other sites
Hello !

Tx you for your help, but the GraphicsStream param type is "Array", and the strongle type List is not considered as an array.

The other way VertexType[], will not work either because, this type is not know in RenderVertices ...

I'm really stuck here ...

Share this post


Link to post
Share on other sites
Quote:
// It seems that the graphicstream is doing a boxing, while I was running Nprof profiler. Is there a way to avoid it ?

Do you mean that boxing seems to be performed within the GraphicsStream.Write() method? If so, I don't think there is any good method exist to change that. I am unable to figure out why boxing would be needed in there in the first place though...

In case you forgot to check; the MDX documentation has some GraphicsStream.Write() examples, but as it does not seem to be available online you need to look at it in the docs that come with the SDK. You might find some inspiration in there.

[Edited by - Enselic on August 18, 2006 3:31:06 AM]

Share this post


Link to post
Share on other sites
As Array is a base class for all arrays. The boxing could be necessary because GraphicsStream handles multiple types of Vertices.

Just because it's asking for an Array, doesn't mean you can't give it a desendant of Array. I've just quickly fished out this example from the documentation that comes with MDX. You'll see that it doesn't bother passing around Array, it just passes it a PositionNormalTexVertex

[quote] From DirectX Managed Documentation, April 2005 release
Read and Write VertexBuffer and IndexBuffer Data With GraphicsStreams

--------------------------------------------------------------------------------

[This topic is pre-release documentation and is subject to change in future releases. Blank topics are included as placeholders.]
This example demonstrates how to use GraphicsStream objects to fill and retrieve data from a VertexBuffer and IndexBuffer objects.

[C#]

In the following C# code example, a VertexBuffer object is created using a flexible vertex format (FVF) type defined by the PositionNormalTexVertex structure. The vertex buffer data is then locked using its offset and size in bytes. A GraphicsStream object is returned which is derived from Stream and can be used in a similar fashon. In the code example, the Write method is used to copy data into the stream from an array of vertex data.

The second part of the method shows use of GraphicsStream using unsafe data access. The InternalDataPointerGraphicsStream.InternalData property returns a void pointer to the vertex buffer data. In this code example, the data is cast to an array of PositionNormalTexVertex structures which makes data manipulation more readable.


using System;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

public struct PositionNormalTexVertex
{
public Vector3 Position;
public Vector3 Normal;
public float Tu0, Tv0;
public static readonly VertexFormats FVF = VertexFormats.Position | VertexFormats.Texture1;
}
public class Example
{
public unsafe void GraphicsStreamReadWrite()
{
//Create a vertex buffer in the managed pool
VertexBuffer vb = new VertexBuffer(typeof(PositionNormalTexVertex), 100, device, Usage.None, PositionNormalTexVertex.FVF, Pool.Managed);

//First, fill an array of PositionNormalTexVertex elements with data.
PositionNormalTexVertex[] vertices = new PositionNormalTexVertex[50];
for(int i=0; i<50; i++)
{
//fill the vertices with some data...
vertices[i].Position = new Vector3(3f,4f,5f);
}

//The size of the verticies are 32-bytes each (float3 (12) + float3 (12) + float(4) + float(4))
//To lock 50 verticies, the size of the lock would be 1600 (32 * 50)
GraphicsStream vbData = vb.Lock(0,1600, LockFlags.None);

//copy the vertex data into the vertex buffer
vbData.Write(vertices);

//Unlock the VB
vb.Unlock();


//This time, lock the entire VertexBuffer
vbData = vb.Lock(0, 3200, LockFlags.None);

//Cast the InternalDataPointer (a void pointer) to an array of verticies
PositionNormalTexVertex* vbArray = (PositionNormalTexVertex*) vbData.InternalDataPointer;

for(int i=0; i<100; i++)
{
//perform some operations on the data
vbArray[i].Tu0 = i;
vbArray[i].Tv0 = vbArray[i].Tu0 * 2;

Console.WriteLine(vbArray[i].Tv0.ToString());
}

//Unlock the buffer
vb.Unlock();
vb.Dispose();
}
}




Related Topics
Read and Write VertexBuffer Data With Arrays

--------------------------------------------------------------------------------

Send comments about this topic to Microsoft. © Microsoft Corporation. All rights reserved.

Feedback? Please provide us with your comments on this topic.
For more help, visit the DirectX Developer Center

[/quote]

Share this post


Link to post
Share on other sites

This topic is 4134 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this