処理速度を上げるには

解決


TOYAMA  2008-02-15 23:27:48  No: 67510

遠山といいます。
Win32Applicationのメッセージループでの処理速度を上げる方法が知りたいのですが
VisualC++6.0StandardからVisualC++6.0Professional Editionに変更し最適化を選んで
コンパイル実行すると処理速度は上がるのですが、もう少しメッセージループでの速度を
上げたいのでが、なければ諦めたいと思います。宜しくお願いします。
現在メッセージループでPeekMessageを2000回に1回の割合で処理するようにしています。


keichan  2008-02-16 02:06:58  No: 67511

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


TOYAMA  2008-02-16 02:58:38  No: 67512

遠山です。あまり参考になるようなコードではないのですがとりあえず書いておきます。
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-16 03:26:29  No: 67513

ゲーム作りとかで使われる手法だけど、全速で動かしたいなら以下のようにすればいい。ただしこれだと早すぎるので、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  2008-02-16 23:57:00  No: 67514

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加