Implement D3DXMatrixStack_Push

David Adam david.adam.cnrs at gmail.com
Wed Apr 9 03:54:37 CDT 2008


On 08/04/2008, David Adam <david.adam.cnrs at gmail.com
<http://www.winehq.org/mailman/listinfo/wine-patches>> wrote:
>* +    This->current = This->current +1;
*>* +    HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->matrix,
(This->current +1) * sizeof(D3DXMATRIX) );
*>* +    if ( This->matrix == NULL ) return E_OUTOFMEMORY;
*
> Aside from being a bit suboptimal (doing a realloc on every push),
> this probably doesn't do what you want. Consider what happens to the
> size of the array when you do something like push/pop/push/pop/...etc.
>
> It would be better to keep track of the current stack size, and then
> grow it by a factor (eg. 2 or 1.5) if a push would overflow the
> current stack.
> You could also consider shrinking the array again if a
> pop would make it use less than a certain percentage of the current
> size (eg. a third).

This would increase the size of the stack exponentially. Would it be
better to do this:
Take a stack_size_reference (for instance 32 items)
When This->current =32, then increase the size of the stack of
stack_size_reference (that is 64 items now)
Then when This->current is =64, again increase the size of the stack
of stack_size_reference (that is 98 items now), and so on....

This would increase the size of the stack linearly instead of exponentially.

In the opposite, for MatrixStack_Pop, assume that the size of the
stack is 98 and This->current is 64.
Then one could shrink the size of the stack from 98 to
98-size_stack_reference that is 64.


> You should also assign the result of HeapReAlloc() to This->matrix
> again.

*I thought that

 HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->matrix, ..........);**
*
do exactly what you say


Although it's quite possible for HeapReAlloc to just grow the
> current block without changing its location, there's no guarantee it
> will. The NULL check is useless this way.

Thanks for your very useful feedback.

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.winehq.org/pipermail/wine-devel/attachments/20080409/b9f859ed/attachment.htm 


More information about the wine-devel mailing list