■ 処理速度を上げるには

[Visual C++ Q & A 掲示板] [過去ログの一覧]


TOYAMA [E-Mail] 2008/02/15(金) 14:27:48 <中級者>
遠山といいます。
Win32Applicationのメッセージループでの処理速度を上げる方法が知りたいのですが
VisualC++6.0StandardからVisualC++6.0Professional Editionに変更し最適化を選んで
コンパイル実行すると処理速度は上がるのですが、もう少しメッセージループでの速度を
上げたいのでが、なければ諦めたいと思います。宜しくお願いします。
現在メッセージループでPeekMessageを2000回に1回の割合で処理するようにしています。

keichan 2008/02/15(金) 17:06:58
>もう少しメッセージループでの速度を上げたいので
もし可能であれば、メッセージループ部のコードを提示されてみては如何でしょうか。
抽象的な質問かと思われますので、回答も抽象的なものしかできないと思います。

TOYAMA [E-Mail] 2008/02/15(金) 17:58:38 <中級者>
遠山です。あまり参考になるようなコードではないのですがとりあえず書いておきます。
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];
}

ダンク 2008/02/15(金) 18:26:29
ゲーム作りとかで使われる手法だけど、全速で動かしたいなら以下のようにすればいい。ただしこれだと早すぎるので、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();
 }
}

TOYAMA [E-Mail] 2008/02/16(土) 14:57:00
[[解決]]

遠山です。他の方法で高速化が考えられるかどうか検討したいと思います。ソースも見直したいと思います。どうも有り難うございました。

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library