看了那麼多文章,感覺到大家學習遊戲程式設計的熱情.經常看到很多人提出關於openGL directX,和computer graphics的問題. 但是我個人人為, 遊戲程式設計,最最最重要的還是C C++語言的基本功. 如何編寫高效率,整潔,和儘可能少的Bug的代碼,是成為一個遊戲程式設計員的關鍵. 所以我開拉這個小系列,來幫C或C++語言基礎不牢靠的人補補基礎知識,希望能夠對大家有所協助.
至於內容嘛,我想起來什麼就寫什麼,不一定有什麼邏輯關係.畢竟我工作也很忙,只有在每個milestone完了以後才有時間幹點別的. 所以這裡先道歉啦.
今天就講講最基本的迴圈.
int i;
for(i = 0; i < 100; i++)
{
// do something
}
也許很多人覺得這個代碼是最簡潔的了.其實不然, 還有更快速的寫法.
i = 100;
do
{
// do something
}while(--j);
以下是visual studio .net 2003編譯過的彙編代碼.
================while loop================
j = 10;
00411A32 mov dword ptr [j],0Ah
do
{
}while(--j);
00411A39 mov eax,dword ptr [j]
00411A3C sub eax,1
00411A3F mov dword ptr [j],eax
00411A42 jne main+29h (411A39h)
================for loop================
for(i = 0; i < 10; i++)
00413656 mov dword ptr [i],0
0041365D jmp main+58h (413668h)
0041365F mov eax,dword ptr [i]
00413662 add eax,1
00413665 mov dword ptr [i],eax
00413668 cmp dword ptr [i],0Ah
0041366C jge main+60h (413670h)
{
}
0041366E jmp main+4Fh (41365Fh)
仔細分析就會發現while迴圈比for迴圈在每次的迴圈中都少一條彙編語句. 主要是因為while迴圈是從大到小的順序迴圈,不需要和10進行比較就可以跳轉.而且可以直接利用--j語句設定的符號標誌進行條件判斷.
同樣是迴圈10次,但是少一條語句還很多關鍵的時候很有用哦.
以上是第一章,如果有不同意見,錯誤或者遺漏,請諒解哦.
這個,上邊是debug version的代碼。偷懶被人看出來,下面給出release版本經過編譯器最佳化的代碼,最佳化參數 /02 /0t:
============for loop=============
:00401029 xor eax, eax
:0040102b jmp 00401030
......
:00401030 .......
:00401035 inc eax
:00401036 cmp eax, 000000064
:00401039 jl 00401030
===========while loop============
:00401029 mov eax, 000000064
:00401030 ..........
.....
:00401035 dec eax;
:00401036 jne 00401030
----------------------------------------------------
http://data.gameres.com/document.asp?TopicID=65354