Win32 threads: Sleep(0)
No God, NO!
Use SwitchToThread to yield (supported since Win XP)
Sleep( 0 ) is a terrible way of yielding. If you're looking to avoid consuming CPU cycles (i.e. lower power usage) prefer Sleep( 1 ) over Sleep( 0 )
Male
Matias Goldberg hasn't added any contacts yet.
Posted by Matias Goldberg
on 18 May 2013 - 10:14 AM
Win32 threads: Sleep(0)
No God, NO!
Use SwitchToThread to yield (supported since Win XP)
Sleep( 0 ) is a terrible way of yielding. If you're looking to avoid consuming CPU cycles (i.e. lower power usage) prefer Sleep( 1 ) over Sleep( 0 )
Posted by Matias Goldberg
on 13 May 2013 - 01:09 PM
Hi everybody.
I'm writting a simple reliability layer on top of UDP. Not that I want to reinvent the wheel, just most of the data I'll be sending can be sent unreliable but there are bits of data every now and then that need to be sent reliably; and mixing tcp & udp gets even more troublesome.
For establishing a connection, I'm well aware of the 3-way handshake that TCP uses "SYN; SYN-ACK; ACK"
However, what I don't get, is why the third ACK is needed. Yes, I know it's the ultimate proof that the connection has been acknoledged by both parties; but I don't believe it's absolutely necessary.
This question has already been raised in StackOverflow, however the answers there don't satisfy me:
Let's see a communication without the 3rd ack:
Case: Client didn't get SYN-ACK
In this case, Server thinks the connection is established, Client think it's not. Just send another SYN from client until the SYN-ACK is received
Server may start sending data to client because it doesn't know the SYN-ACK got through. Client won't ACK that data because his connection isn't yet established, so server will continue to keep sending data over & over again until timeout. When the Client successfully gets the syn-ack; it will ack that data, hopefully before the timeout. If timed out, server-side it will just look like one connection timed out, and another came in. It's important that server doesn't use the SYNs from client as proof of heartbeat.
Typical view on this: The server needs to allocate resources (for tcp). More SYNs received -> more resources. However I send a random ID generated client-side with the SYN. That way the server identifies the SYN & IP with associated resources using that ID (and deals with client reconnecting and starting a new session as they'll change their ID; or with another client getting the same IP)
ACKs from normal messages always send the ID along the sequence number. So that if client reconnects (or new client got the same IP & port old client had) the server won't think an ack received from an old session is acknowledging packets sent from the current session.
A connection could be hijacked only if a machine gets the same IP address (and port), happens to use the same ID the other client has been using, and all happens before timeout (or there is a man in the middle that can see all data, spoof the IP, and still read the answers from server because he can see all data going to that spoofed IP).
But it's not like TCP is foolproof to hijacking either. Granted, this method is a lot easier to hijack because the ID, IP & port is repeated in every ack. Furthermore I'm interested in preventing "accidental" hijacking, not directed attacks.
The only disadvantage I can see: Potentially much higher bandwidth consumption (because the server may start sending data while client won't acknoledge it), while TCP needs to account for congestion control (which I don't care).
In TCP, everything is silent until SYN-SYN-ACK-ACK has been performed.
Bigger ACKs as a disadvantage could also be mentioned, but TCP overhead is already much bigger than UDP, and again, most of the data I'll be sending is unreliable (no need for ack), while every now and then I send some reliable data (needs guaranteed delivery, guaranteed to arrive in order)
Am I missing something? Why is the third ACK needed?
Thanks!
Posted by Matias Goldberg
on 09 May 2013 - 10:45 AM
60fps in milliseconds stored as 'long' truncates to 16 from 16.666 which is highly inaccurate
Also, long(16/16.666) = 0
Anything above 60fps wouldn't be able to move (bug), anything between 58.82fps and 29.41fps would be multiplied against '1', which means the fast machine running at 58.82fps would move almost twice as fast as the machine running at 29.41fps (bug)
That time scaling code is completely broken.
Also, fix your timestep, and represent your time delta as a 32-bit long in microseconds, not milliseconds, and once you're multiplying/dividing, keep it as a float, not as integer.
Posted by Matias Goldberg
on 06 May 2013 - 10:44 PM
I'd recommend using floor() rather than casting to int back and forth. The casting can be several times slower (if performance is an issue)
Note that floor( -3.3 ) = -4; while (int)-3.3 = -3; but floor's behavior is usually how you want snapping to work if negative numbers are possible.
Posted by Matias Goldberg
on 12 April 2013 - 09:31 PM
Yeah, no way PS 2.0 can run 15 light equations. There's not enough instruction slots.
I'm not sure if it's available in XNA, but try [unroll] and [branch] in your loops and see which one is faster. What GPU do you have?
Posted by Matias Goldberg
on 09 April 2013 - 10:22 AM
Somehow I'm not surprised. I'm sick of going through GDC/SIGGRAPH slides and even independent academic papers where they present a formula/equation without (or with incomplete) footnotes that clarifies the meaning of each coefficient and variable. Half of them you have to guess, or dig through all the referenced bibliography to find out.We both had assumed that F0 was the Fresnel term and Fspec was the specular color.
Posted by Matias Goldberg
on 08 April 2013 - 08:43 PM
Don't forget about YUV format. Y is for luminance, and contains the luminance at the given pixel. YUV (and it's variants YUV422, YV42, etc) is the preferred choice when dealing with JPEG, MPEG-2, MPEG-4 & H264 compression, also when broadcasting TV.The only term however I heard about it being used practically was for HDR and tonemapping, where you would calculate the average logarythmic luminance of your entire scene from the cameras viewport, for the HDR equation.
Posted by Matias Goldberg
on 08 April 2013 - 03:15 PM
The 2nd option already knows the input is a parameter and there's no doubt it can't be part of the command in the statement, so SQL injection is not possible.
In the 1st option, you would have to properly escape the string, and there's the risk that you're not escaping it properly.
Posted by Matias Goldberg
on 08 April 2013 - 02:18 PM
To check if your formula is energy conserving, you have to do the integral of your formula just like Fabian Giesen did in this blog (check comments, quick link: http://www.farbrausch.de/~fg/stuff/phong.pdf).
That's a looooot of math and has the risk of making your head explode, but it will make you be 100% sure.
Posted by Matias Goldberg
on 03 April 2013 - 08:58 AM
Posted by Matias Goldberg
on 01 April 2013 - 09:39 PM
Posted by Matias Goldberg
on 31 March 2013 - 08:28 AM
Posted by Matias Goldberg
on 29 March 2013 - 06:24 PM
There are two possibilities:If we know the position of the pixel and the light, can't we just do this in the lighting pass:
float shadowFactor = pixelDepth < length(LightPosition - pixelPosition) / FarClip;I'm sure if this worked someone would have figured it out already, but I can't see why it wouldn't and it's bugging me.
Posted by Matias Goldberg
on 28 March 2013 - 11:24 PM
Posted by Matias Goldberg
on 28 March 2013 - 01:21 PM
Find content