diff --git a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs index 1dee7cf..44d8a0f 100644 --- a/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs +++ b/AxibugEmuOnline.Client/Assets/Plugins/AxiReplay/NetReplay.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using UnityEngine; namespace AxiReplay { @@ -110,7 +111,7 @@ namespace AxiReplay public int GetSkipFrameCount() { var frameGap = mDiffFrameCount; - if (frameGap > 10000) return 0; + if (frameGap <= 0) return 0; int skip = 0; diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppSettings/BgColorSettings.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppSettings/BgColorSettings.cs index 8d0ac3f..4055080 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppSettings/BgColorSettings.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppSettings/BgColorSettings.cs @@ -5,6 +5,7 @@ using UnityEngine; namespace AxibugEmuOnline.Client { + /// 颜色设置 public class BgColorSettings { public delegate void OnColorChangedHandle(XMBColor color); diff --git a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/CoreSupporter.cs b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/CoreSupporter.cs index 1d325f0..bd6fc1d 100644 --- a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/CoreSupporter.cs +++ b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/CoreSupporter.cs @@ -112,21 +112,17 @@ namespace AxibugEmuOnline.Client } m_sampledState = FromNet(replayData); - var localState = NesControllerMapper.Get().CreateState(); - var rawData = ToNet(localState); - if (LastTestInput != rawData) - { - LastTestInput = rawData; - App.log.Debug($"{DateTime.Now.ToString("hh:mm:ss.fff")} Input F:{App.roomMgr.netReplay.mCurrClientFrameIdx} | I:{rawData}"); - } - App.roomMgr.SendRoomSingelPlayerInput(frameIndex, rawData); } - else + else m_sampledState = default; + + var localState = NesControllerMapper.Get().CreateState(); + var rawData = ToNet(localState); + if (LastTestInput != rawData) { - //App.log.Error($"Server Lag remoteFrame->{App.roomMgr.netReplay.mRemoteFrameIdx} diff->{frameDiff} " + - // $"frame=>{replayData.FrameStartID} InPut=>{replayData.InPut}"); - m_sampledState = default; + LastTestInput = rawData; + App.log.Debug($"{DateTime.Now.ToString("hh:mm:ss.fff")} Input F:{App.roomMgr.netReplay.mCurrClientFrameIdx} | I:{rawData}"); } + App.roomMgr.SendRoomSingelPlayerInput(frameIndex, rawData); } else { diff --git a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs index c329c7b..1b15bff 100644 --- a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs +++ b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/NesEmulator.cs @@ -62,8 +62,7 @@ namespace AxibugEmuOnline.Client FixEmulatorFrame(); var screenBuffer = NesCore.ppu.GetScreenPtr(); - var lineColorMode = NesCore.ppu.GetLineColorMode(); - VideoProvider.SetDrawData(screenBuffer, lineColorMode, 277, 240); + VideoProvider.SetDrawData(screenBuffer); } } diff --git a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/VideoProvider.cs b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/VideoProvider.cs index 6d4196f..72de272 100644 --- a/AxibugEmuOnline.Client/Assets/Script/NesEmulator/VideoProvider.cs +++ b/AxibugEmuOnline.Client/Assets/Script/NesEmulator/VideoProvider.cs @@ -1,5 +1,7 @@ +using AxibugEmuOnline.Client.Common; using System; using System.Runtime.InteropServices; +using System.Text; using UnityEngine; using UnityEngine.UI; @@ -23,11 +25,10 @@ namespace AxibugEmuOnline.Client DrawCanvas.worldCamera = Camera.main; } - public unsafe void SetDrawData(uint* screenData, byte[] lineColorMode, int screenWidth, int screenHeight) + public unsafe void SetDrawData(uint* screenData) { if (wrapTex == null) { - //wrapTex = new Texture2D(272, 240, TextureFormat.BGRA32, false); wrapTex = new Texture2D(272, 240, TextureFormat.RGBA32, false); wrapTex.filterMode = FilterMode.Point; @@ -36,7 +37,7 @@ namespace AxibugEmuOnline.Client Image.texture = wrapTex; Image.material.SetTexture("_MainTex", wrapTex); - TexBufferSize = screenWidth * screenHeight * 4; + TexBufferSize = wrapTex.width * wrapTex.height * 4; var palRaw = PaletteDefine.m_cnPalette[0]; pPal = new Texture2D(palRaw.Length, 1, TextureFormat.RGBA32, false); diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CoreLibs/MemoryUtility.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CoreLibs/MemoryUtility.cs index 1f9b1a1..f0bf58a 100644 --- a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CoreLibs/MemoryUtility.cs +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CoreLibs/MemoryUtility.cs @@ -41,6 +41,34 @@ namespace VirtualNes.Core } } + public unsafe static void memset(byte* ptr, int offset, byte value, int length) + { + var offsetptr = ptr + offset; + for (int i = 0; i < length; i++) + { + offsetptr[i] = value; + } + } + + public unsafe static void memset(byte* ptr, byte value, int length) + { + memset(ptr, 0, value, length); + } + + public unsafe static void memset(uint* ptr, int offset, uint value, int length) + { + var offsetptr = ptr + offset; + for (int i = 0; i < length; i++) + { + offsetptr[i] = value; + } + } + + public unsafe static void memset(uint* ptr, uint value, int length) + { + memset(ptr, 0, value, length); + } + public static void memcpy(Array dst, Array src, int length) { Array.Copy(src, dst, length); diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs index 276aa57..7303287 100644 --- a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs @@ -221,10 +221,7 @@ namespace VirtualNes.Core Debuger.Log("Allocating PPU..."); ppu = new PPU(this); - var screenBuffer = new uint[PPU.SCREEN_WIDTH * PPU.SCREEN_HEIGHT]; - var colormode = new byte[PPU.SCREEN_HEIGHT]; - - ppu.SetScreenPtr(screenBuffer, colormode); + ppu.InitBuffer(); Debuger.Log("Allocating APU..."); apu = new APU(this); @@ -766,71 +763,9 @@ namespace VirtualNes.Core } } - if (bDraw) - { - DrawPad(); - } - FrameCount++; } - private void DrawPad() - { - if (m_bMoviePlay) - { - int offset_h = 12; - int offset_v = Supporter.Config.graphics.bAllLine ? (240 - 18) : (240 - 22); - - if (Supporter.Config.movie.bPadDisplay) - { - uint dwData = pad.GetSyncData(); - for (int i = 0; i < 4; i++) - { - byte Data = (byte)(dwData >> (i * 8)); - if ((m_MovieControl & (1 << i)) != 0) - { - DrawBitmap(offset_h, offset_v, m_PadImg); - - // KEY - if ((Data & (1 << 4)) != 0) DrawBitmap(offset_h + 3, offset_v + 1, m_KeyImg0); // U - if ((Data & (1 << 5)) != 0) DrawBitmap(offset_h + 3, offset_v + 5, m_KeyImg0); // D - if ((Data & (1 << 6)) != 0) DrawBitmap(offset_h + 1, offset_v + 3, m_KeyImg0); // L - if ((Data & (1 << 7)) != 0) DrawBitmap(offset_h + 5, offset_v + 3, m_KeyImg0); // R - - // START,SELECT - if ((Data & (1 << 2)) != 0) DrawBitmap(offset_h + 9, offset_v + 5, m_KeyImg1); // SELECT - if ((Data & (1 << 3)) != 0) DrawBitmap(offset_h + 13, offset_v + 5, m_KeyImg1); // START - - // A,B - if ((Data & (1 << 0)) != 0) DrawBitmap(offset_h + 23, offset_v + 3, m_KeyImg2); // A - if ((Data & (1 << 1)) != 0) DrawBitmap(offset_h + 18, offset_v + 3, m_KeyImg2); // B - - offset_h += 30; - } - } - } - - if (Supporter.Config.movie.bTimeDisplay) - { - // Time display - int t = m_MovieStep; - int h = t / 216000; - t -= h * 216000; - int m = t / 3600; - t -= m * 3600; - int s = t / 60; - t -= s * 60; - - string szTemp = $"{h:00}:{m:00}:{s:00}.{t * 100 / 60:00}"; - DrawString(256 - 80 + 0, offset_v - 1, szTemp, 0x1F); - DrawString(256 - 80 + 0, offset_v + 1, szTemp, 0x1F); - DrawString(256 - 80 - 1, offset_v + 0, szTemp, 0x1F); - DrawString(256 - 80 + 1, offset_v + 0, szTemp, 0x1F); - DrawString(256 - 80, offset_v, szTemp, 0x30); - } - } - } - internal void DrawString(int x, int y, string str, byte col) { foreach (var @char in str) @@ -866,33 +801,6 @@ namespace VirtualNes.Core } } - private unsafe void DrawBitmap(int x, int y, byte[] bitMap) - { - int i, j; - int h, v; - var Scn = ppu.GetScreenPtr(); - int pScn = 8 + (256 + 16) * y + x; - int pPtr; - - int lpBitmap = 0; - h = bitMap[lpBitmap++]; - v = bitMap[lpBitmap++]; - - for (j = 0; j < v; j++) - { - pPtr = pScn; - for (i = 0; i < h; i++) - { - if (bitMap[lpBitmap] != 0xFF) - { - Scn[pPtr] = bitMap[lpBitmap]; - } - lpBitmap++; - pPtr++; - } - pScn += 256 + 16; - } - } int CPU_CALL_COUNT = 0; internal void EmulationCPU(int basecycles) diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs index 3c7ca00..c26f10c 100644 --- a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs @@ -386,7 +386,7 @@ namespace VirtualNes.Core loopy_shift = 0; if (lpScreen != null) - Unsafe.InitBlockUnaligned(lpScreen, 0, SCREEN_WIDTH * SCREEN_HEIGHT); + MemoryUtility.memset(lpScreen, 0, 0, SCREEN_WIDTH * SCREEN_HEIGHT); if (lpColormode != null) MemoryUtility.memset(lpColormode, 0, SCREEN_HEIGHT); } @@ -402,7 +402,7 @@ namespace VirtualNes.Core if (lpScreen != null) { - Unsafe.InitBlockUnaligned(lpScreen, 0x3F, SCREEN_WIDTH); + MemoryUtility.memset(lpScreen, 0, 0x3f, SCREEN_WIDTH); } if (lpColormode != null) { @@ -457,8 +457,8 @@ namespace VirtualNes.Core { byte chr_h = 0, chr_l = 0, attr = 0; - Unsafe.InitBlockUnaligned(BGwrite, 0, 34); - Unsafe.InitBlockUnaligned(BGmono, 0, 34); + MemoryUtility.memset(BGwrite, 0, 34); + MemoryUtility.memset(BGmono, 0, 34); // Linecolor mode lpColormode[scanline] = (byte)(((MMU.PPUREG[1] & PPU_BGCOLOR_BIT) >> 5) | ((MMU.PPUREG[1] & PPU_COLORMODE_BIT) << 7)); @@ -466,7 +466,7 @@ namespace VirtualNes.Core // Render BG if ((MMU.PPUREG[1] & PPU_BGDISP_BIT) == 0) { - Unsafe.InitBlockUnaligned(lpScanline, MMU.BGPAL[0], SCREEN_WIDTH); + MemoryUtility.memset(lpScanline, MMU.BGPAL[0], SCREEN_WIDTH); if (nes.GetRenderMethod() == EnumRenderMethod.TILE_RENDER) { nes.EmulationCPU(NES.FETCH_CYCLES * 4 * 32); @@ -869,7 +869,7 @@ namespace VirtualNes.Core { byte* pBGw = BGwrite; byte* pSPw = SPwrite; - Unsafe.InitBlockUnaligned(pSPw, 0, 34); + MemoryUtility.memset(pSPw, 0, 34); spmax = 0; Sprite sp = new Sprite(MMU.SPRAM, 0); @@ -1092,8 +1092,11 @@ namespace VirtualNes.Core return lpColormode; } - internal void SetScreenPtr(uint[] screenBuffer, byte[] colormode) + internal void InitBuffer() { + var screenBuffer = new uint[SCREEN_WIDTH * SCREEN_HEIGHT]; + var colormode = new byte[SCREEN_HEIGHT]; + lpScreenGCH = GCHandle.Alloc(screenBuffer, GCHandleType.Pinned); lpScreen = (uint*)lpScreenGCH.AddrOfPinnedObject(); lpColormode = colormode; @@ -1180,11 +1183,16 @@ namespace VirtualNes.Core } } + [StructLayout(LayoutKind.Explicit, Size = 16)] public struct UInt128 { + [FieldOffset(0)] public UInt32 a; + [FieldOffset(4)] public UInt32 b; + [FieldOffset(8)] public UInt32 c; + [FieldOffset(12)] public UInt32 d; } }