void updateTimer_Tick(object sender, EventArgs e) { if (m_updateCount++ % 100 == 0) { Console.WriteLine("updateTimer_Tick() - {0}", m_updateCount); } if (mame.mame_machine_manager.instance() == null) { return; // mame's not ready to update yet } osd_interface_WinForms osd = (osd_interface_WinForms)mame.mame_machine_manager.instance().osd(); mame.RawBufferPointer framedata = osd.screenbufferptr; if (framedata == null) { return; } #if true lock (osd.osdlock) { m_bitmapHelper.Lock(); //int stride = 640; int stride = 400; Random r = new System.Random(); for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 100 * stride, (UInt32)(r.Next() % 16000000)); } for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 110 * stride, mame.rgb_t.white()); } #if false for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 120 * stride, mame.rgb_t.red); } for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 130 * stride, mame.rgb_t.green); } for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 140 * stride, mame.rgb_t.blue); } for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 150 * stride, mame.rgb_t.pink); } for (int i = 0; i < 10; i++) { framedata.set_uint32(i + 200 + 160 * stride, mame.rgb_t.greenyellow); } #endif BitmapHelper.SetPixelRawFunc setPixelFunc = m_bitmapHelper.IsAlphaBitmap ? m_bitmapHelper.SetPixelRawAlpha : (BitmapHelper.SetPixelRawFunc)m_bitmapHelper.SetPixelRawNoAlpha; int destPixelSize = m_bitmapHelper.GetRawPixelSize(); const int scale = 3; for (int y = 0; y < 400; y++) { int sourceArrayIndex = y * stride; for (int j = 0; j < scale; j++) { int destArrayIndex = m_bitmapHelper.GetRawYIndex((y * scale) + j); for (int x = 0; x < 400; x++) { UInt32 color = framedata.get_uint32(sourceArrayIndex + x); for (int i = 0; i < scale; i++) { setPixelFunc(destArrayIndex, color); destArrayIndex += destPixelSize; } } } } m_bitmapHelper.Unlock(true); } #endif if (m_graphics != null) { m_graphics.DrawImage(m_bitmap, m_bitmapXOffset, m_bitmapYOffset); if (mame.mame_machine_manager.instance().machine() == null || mame.mame_machine_manager.instance().machine().phase() != mame.machine_phase.RUNNING) { return; } var video = mame.mame_machine_manager.instance().machine().video(); osd_ticks_t tps = mame.osdcore_global.m_osdcore.osd_ticks_per_second(); double final_real_time = tps == 0 ? 0 : (double)video.overall_real_seconds + (double)video.overall_real_ticks / (double)tps; double final_emu_time = video.overall_emutime.as_double(); double average_speed_percentage = final_real_time == 0 ? 0 : 100 * final_emu_time / final_real_time; string total_time = (video.overall_emutime + new mame.attotime(0, mame.attotime.ATTOSECONDS_PER_SECOND / 2)).as_string(2); this.Text = string.Format("Emulator running... Avg Speed: {0:f2}% ({1} seconds) - speed_text: {2}", average_speed_percentage, total_time, video.speed_text()); } }
void updateTimer_Tick(object sender, EventArgs e) { if (m_updateCount++ % 100 == 0) { Console.WriteLine("updateTimer_Tick() - {0}", m_updateCount); } if (mame.mame_machine_manager.instance() == null) { return; // mame's not ready to update yet } osd_interface_WinForms osd = (osd_interface_WinForms)mame.mame_machine_manager.instance().osd(); mame.Pointer <byte> framedata = osd.screenbufferptr; ConcurrentDictionary <int, int> frameDataCopyThreadIds = new ConcurrentDictionary <int, int>(); if (framedata == null) { return; } #if true lock (osd.osdlock) { //if (Width != m_bitmap.Width || Height != m_bitmap.Height || // Width != osd.get_width() || Height != osd.get_height()) //{ // m_bitmap = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb); // m_bitmapHelper = new BitmapHelper(m_bitmap); // // osd.set_bounds(Width, Height); // // framedata = osd.screenbufferptr; //} // right now the source and target bitmaps are different sizes, so detect resizes differently for each if (Width - (m_bitmapXOffset * 2) != m_bitmap.Width || Height - (m_bitmapYOffset * 2) != m_bitmap.Height) { m_bitmap = new Bitmap(Width - (m_bitmapXOffset * 2), Height - (m_bitmapYOffset * 2), System.Drawing.Imaging.PixelFormat.Format32bppRgb); m_bitmapHelper = new BitmapHelper(m_bitmap); m_graphics = CreateGraphics(); } if (osd.get_width() != 600 || osd.get_height() != 600) { osd.set_bounds(600, 600); framedata = osd.screenbufferptr; } m_bitmapHelper.Lock(); #if false { // random dots to make sure things are working, and not frozen int stride = osd.get_width(); int x = 200; int y = 100; Random r = new System.Random(); if (x + 10 < osd.get_width() && y + 60 < osd.get_height()) { for (int i = 0; i < 10; i++) { framedata.set_uint32(x + (y * stride) + i, (UInt32)(r.Next() % 16000000)); } for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 10) * stride) + i, mame.rgb_t.white()); } #if false for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 20) * stride) + i, mame.rgb_t.red); } for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 30) * stride) + i, mame.rgb_t.green); } for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 40) * stride) + i, mame.rgb_t.blue); } for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 50) * stride) + i, mame.rgb_t.pink); } for (int i = 0; i < 10; i++) { framedata.set_uint32(x + ((y + 60) * stride) + i, mame.rgb_t.greenyellow); } #endif } } #endif { // copy whole line at once int sourceWidth = osd.get_width(); int sourceHeight = osd.get_height(); int sourceBytesPerPix = 4; // TODO query this int sourceStride = sourceWidth * sourceBytesPerPix; int destWidth = m_bitmapHelper.Width; int destHeight = m_bitmapHelper.Height; int destBytesPerPix = 4; // TODO fix funcs in BitmapHelper and query this int destStride = destWidth * destBytesPerPix; // if dest is smaller than source, clamp sourceHeight = Math.Min(sourceHeight, destHeight); int copyLength = Math.Min(sourceStride, destStride); System.Threading.Tasks.Parallel.For(0, sourceHeight, y => //for (int y = 0; y < sourceHeight; y++) { frameDataCopyThreadIds.TryAdd(System.Threading.Thread.CurrentThread.ManagedThreadId, 0); // count how many threads are in use when using Parallel.For() version framedata.CopyTo(y * sourceStride, m_bitmapHelper.GetBitmapData(y * destStride, copyLength), copyLength); }); } #if false // copy pixel by pixel BitmapHelper.SetPixelRawFunc setPixelFunc = m_bitmapHelper.IsAlphaBitmap ? m_bitmapHelper.SetPixelRawAlpha : (BitmapHelper.SetPixelRawFunc)m_bitmapHelper.SetPixelRawNoAlpha; int destPixelSize = m_bitmapHelper.GetRawPixelSize(); const int scale = 1; for (int y = 0; y < osd.get_height(); y++) { int sourceArrayIndex = y * osd.get_height(); for (int j = 0; j < scale; j++) { int destArrayIndex = m_bitmapHelper.GetRawYIndex((y * scale) + j); for (int x = 0; x < osd.get_width(); x++) { UInt32 color = framedata.get_uint32(sourceArrayIndex + x); for (int i = 0; i < scale; i++) { setPixelFunc(destArrayIndex, color); destArrayIndex += destPixelSize; } } } } #endif m_bitmapHelper.Unlock(true); } #endif if (m_graphics != null) { m_graphics.DrawImageUnscaled(m_bitmap, m_bitmapXOffset, m_bitmapYOffset); //m_graphics.DrawImage(m_bitmap, m_bitmapXOffset, m_bitmapYOffset, Width - (m_bitmapXOffset * 3), Height - (m_bitmapYOffset * 3)); if (mame.mame_machine_manager.instance().machine() == null || mame.mame_machine_manager.instance().machine().phase() != mame.machine_phase.RUNNING) { return; } var video = mame.mame_machine_manager.instance().machine().video(); osd_ticks_t tps = mame.osdcore_global.m_osdcore.osd_ticks_per_second(); double final_real_time = tps == 0 ? 0 : (double)video.m_overall_real_seconds + (double)video.m_overall_real_ticks / (double)tps; double final_emu_time = video.m_overall_emutime.as_double(); double average_speed_percentage = final_real_time == 0 ? 0 : 100 * final_emu_time / final_real_time; string total_time = (video.m_overall_emutime + new mame.attotime(0, mame.attotime_global.ATTOSECONDS_PER_SECOND / 2)).as_string(2); this.Text = string.Format("Emulator running... Avg Speed: {0:f2}% ({1} seconds) Framedata_Copy_Threads: {2} - speed_text: {3}", average_speed_percentage, total_time, frameDataCopyThreadIds.Count, video.speed_text()); } }