遠山といいます。
Win32Applicationのメッセージループでの処理速度を上げる方法が知りたいのですが
VisualC++6.0StandardからVisualC++6.0Professional Editionに変更し最適化を選んで
コンパイル実行すると処理速度は上がるのですが、もう少しメッセージループでの速度を
上げたいのでが、なければ諦めたいと思います。宜しくお願いします。
現在メッセージループでPeekMessageを2000回に1回の割合で処理するようにしています。
>もう少しメッセージループでの速度を上げたいので
もし可能であれば、メッセージループ部のコードを提示されてみては如何でしょうか。
抽象的な質問かと思われますので、回答も抽象的なものしかできないと思います。
遠山です。あまり参考になるようなコードではないのですがとりあえず書いておきます。
wiile文がメッセージループになります。C++で書いていますがPC9801.ExecCmdがメインで98の命令を実行しています。
SetHsync,SetVsyncはただフラグをセット、リセットしているだけです。
VC++6.0のProfessional Editionで最適化すると速度が倍近く上がりました。意味はわかりませんが
Windowsライブラリが最適化されたのだと思います。
while(1){
if ( LoopCnt >= 2000 ){
if ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ){
if ( !GetMessage( &msg, ( HWND )NULL, 0, 0 ) ) { break; };
TranslateMessage( &msg );
DispatchMessage( &msg );
}
LoopCnt = 0;
}
LoopCnt++;
PC9801.ExecCmd();
if ( HsyncCnt >= 125 ){
if ( hsync == FALSE ){
PC9801.SetHsync();
hsync = TRUE;
}
else{
PC9801.ResetHsync();
hsync = FALSE;
}
HsyncCnt = 0;
}
if ( VsyncCnt >= 50000 ){
if ( vsync == FALSE ){
PC9801.SetVsync();
vsync = TRUE;
}
else{
PC9801.ResetVsync();
vsync = FALSE;
}
VsyncCnt = 0;
}
for(i=0;i<WaitTable[0];i++) // この部分はウェイトは入っていません
WaitTable[29] = WaitTable[0];
}
ゲーム作りとかで使われる手法だけど、全速で動かしたいなら以下のようにすればいい。ただしこれだと早すぎるので、PC9801.ExecCmd()の中でSleep()とかでウェイトが必要。
この手法は採用できないなら別だけど。
while(1){
if( PeekMessage( &msg, 0, 0, 0, PM_NOREMOVE ) ){
if( !GetMessage( &msg, NULL, 0, 0 ) )
break;
TranslateMessage( &msg );
DispatchMessage( &msg );
}else if( appActive ){
if( !PC9801.ExecCmd() )
break;
}else{
WaitMessage();
}
}
遠山です。他の方法で高速化が考えられるかどうか検討したいと思います。ソースも見直したいと思います。どうも有り難うございました。
ツイート | ![]() |