スキップしてメイン コンテンツに移動

投稿

6月, 2022の投稿を表示しています

全画面表示されずにアスペクト比が正しくない状態で、横に黒い帯が表示される問題の解決法

Intel HD Graphics 530を搭載したDellのパソコンをHDMIでつないで、古めのディスプレイ(iiyamaのProLite 2607WS)につないだのですが、アスペクト比が正しくない状態で、全画面表示されずに横に黒い帯が表示されるという問題が発生しました。下図のような感じです。 ディスプレイ側には1920x1200の解像度で出力したかったのですが、グラフィックの解像度の設定で1920x1080しか選べませんでした。 とりあえず解決した方法 Intel Graphics Control Panel (すでにMicrosoft Storeからの提供は終了)または Intel Graphics Command Center をインストールして、カスタム解像度を設定する。 自分の場合は1920x1200で55Hzとかに設定してうまく行きました。 Intel Graphics Control Panel Intel Graphics Command Center 解決するまでの道のり Intel HD Graphicsでは、カスタム解像度を設定できるという情報を見つける。 ↓ 設定しようにも、今度はIntel Graphics Command Centerが起動しないという問題に遭遇。 ↓ WindowsのEvent Viewerで調べると、下記のエラーログが見つかったが、原因わからず。 Faulting application name: IGCCTray.exe, version: 1.100.3408.0, time stamp: 0x62341a86 Faulting module name: opencl.dll, version: 2.2.8.0, time stamp: 0x5f32b21f Exception code: 0xc0000005 Fault offset: 0x0000000000005c98 Faulting process id: 0x1de4 Faulting application start time: 0x01d87e2b5fc12771 Faulting application path: C:\Program Files\WindowsApps\AppUp.IntelGraphi...

C#でMarshalクラスを使ってbyte配列から構造体を生成する方法

C#の通信プログラムでbyte配列を読み込んで、構造体(struct)を生成したいときにサンプルコードの紹介です。 Genericsを使って任意の構造体をbyte配列から生成できるようにしています。 public static T ReadAsStruct < T > ( this byte [ ] bytes , int startIndex ) where T : struct { // GCHandle.Allocクラスを使ってメモリ上のデータがガーベッジコレクタの対象にならないようにする。 var handle = GCHandle . Alloc ( bytes , GCHandleType . Pinned ) ; try { // Marshalクラスのメソッドを使って、byte配列のIntPtr(ポインタ)を取得。 var ptr = Marshal . UnsafeAddrOfPinnedArrayElement ( bytes , startIndex ) ; // IntPtrで指定した位置のbyte配列から構造体を生成。 return ( T ) Marshal . PtrToStructure ( ptr , typeof ( T ) ) ; } finally { // 重要!!必ずGCHandleを開放して、再びbyte配列がガーベッジコレクタの対象になるようにする。 handle . Free ( ) ; } } ちょっと考察 ■ パフォーマンス 毎回GCHandle.Alloc, Freeを行う分、パフォーマンスのオーバーヘッドが発生します。パフォーマンスが気になる場合は、GCHandle.Alloc, Freeの間に、複数の構造体を生成するようにするとよいかもしれません。 ■ 他の書き方 startIndexがいつもゼロの場合、下記の部分は、 var ptr = Marshal . UnsafeAddrOfPinnedArrayElem...

C#でbyte orderを反転する方法

UDPパケットの受信時に受信したデータのbyte orderを反転する必要がある場合があります。そんな場合に使えるbyte orderを反転するC#のコードの紹介です。 処理の流れは下記になります。 BitConverter.GetBytesメソッドを使って、値のbyte配列表現を取得。 Array.Reverseメソッドでbyte配列の順番を反転する。 BitConverter.ToXXXメソッドで元の値の型に戻す。 ushort, uint, int, ulong, float, doubleなどの型についてコードを示します。 public static void ReverseBytes ( this ref ushort value ) { var source = BitConverter . GetBytes ( value ) ; Array . Reverse ( source ) ; value = BitConverter . ToUInt16 ( source , 0 ) ; } public static void ReverseBytes ( this ref uint value ) { var source = BitConverter . GetBytes ( value ) ; Array . Reverse ( source ) ; value = BitConverter . ToUInt32 ( source , 0 ) ; } public static void ReverseBytes ( this ref int value ) { var source = BitConverter . GetBytes ( value ) ; Array . Reverse ( source ) ; value = BitConverter . ToInt32 ( source , 0 ) ; } public static void ReverseBytes ( this ref ulong value ) { v...