Compare commits
2 Commits
5b5da2767e
...
dc9963a431
Author | SHA1 | Date | |
---|---|---|---|
dc9963a431 | |||
29f231a3be |
@ -57,8 +57,8 @@ namespace AxibugEmuOnline.Client
|
|||||||
public unsafe void SetDrawData(uint* screenData)
|
public unsafe void SetDrawData(uint* screenData)
|
||||||
{
|
{
|
||||||
PrepareUI(screenData);
|
PrepareUI(screenData);
|
||||||
if (GPUTurbo) PrepareForGPU(screenData);
|
if (GPUTurbo) PrepareForGPU(screenData);//判断使用GPU还是CPU
|
||||||
else PrepareForCPU(screenData);
|
else PrepareForCPU(screenData);//使用CPU
|
||||||
|
|
||||||
if (GPUTurbo)
|
if (GPUTurbo)
|
||||||
{
|
{
|
||||||
@ -144,6 +144,7 @@ namespace AxibugEmuOnline.Client
|
|||||||
|
|
||||||
for (int line = 0; line < PPU.SCREEN_HEIGHT; line++)
|
for (int line = 0; line < PPU.SCREEN_HEIGHT; line++)
|
||||||
{
|
{
|
||||||
|
//PS:如果是CPU计算,宽度减少16的不必要部分,才能对齐
|
||||||
width = PPU.SCREEN_WIDTH - 16;
|
width = PPU.SCREEN_WIDTH - 16;
|
||||||
|
|
||||||
while (width > 0)
|
while (width > 0)
|
||||||
@ -151,14 +152,17 @@ namespace AxibugEmuOnline.Client
|
|||||||
var edx = screenData[pScn + 8];
|
var edx = screenData[pScn + 8];
|
||||||
|
|
||||||
uint index = edx & 0xFF;
|
uint index = edx & 0xFF;
|
||||||
|
//按下标颜色查找表中真实颜色
|
||||||
var colorData = palRaw[index];
|
var colorData = palRaw[index];
|
||||||
//dst中颜色排列为abgr,而colorData排列为argb
|
//dst中颜色排列为abgr,而colorData排列为argb
|
||||||
uint r = (colorData & 0x00FF0000) >> 16; // 提取Red通道
|
uint r = (colorData & 0x00FF0000) >> 16; // 提取Red通道
|
||||||
uint g = (colorData & 0x0000FF00) >> 8; // 提取Green通道
|
uint g = (colorData & 0x0000FF00) >> 8; // 提取Green通道
|
||||||
uint b = (colorData & 0x000000FF); // 提取Blue通道
|
uint b = (colorData & 0x000000FF); // 提取Blue通道
|
||||||
|
|
||||||
|
//用rgb构建颜色对象(如果非unity 可以用这个rgb 构建System.Drawing.Color 单个颜色对象)
|
||||||
uint abgr = 0xFF000000 | (b << 16) | (g << 8) | (r << 0);
|
uint abgr = 0xFF000000 | (b << 16) | (g << 8) | (r << 0);
|
||||||
|
|
||||||
|
//放进颜色矩阵
|
||||||
Dst[pDst] = abgr;
|
Dst[pDst] = abgr;
|
||||||
|
|
||||||
pScn += 1;
|
pScn += 1;
|
||||||
|
26
README.md
26
README.md
@ -1,5 +1,7 @@
|
|||||||
# AxibugEmuOnline
|
# AxibugEmuOnline
|
||||||
|
|
||||||
|
### 一个跨平台的、自动化联机的、纯C#实现的、开源的模拟器项目
|
||||||
|
|
||||||
用于游戏模拟器同步的联机纯C#实现
|
用于游戏模拟器同步的联机纯C#实现
|
||||||
|
|
||||||
AxibugEmuOnline.Server 是服务端 .Net8
|
AxibugEmuOnline.Server 是服务端 .Net8
|
||||||
@ -10,7 +12,7 @@
|
|||||||
|
|
||||||
- NES EmuCore NES模拟器核心
|
- NES EmuCore NES模拟器核心
|
||||||
|
|
||||||
VirtualNes (C++手动翻译到C#)
|
VirtualNes (C++手动翻译到C#,并收纳民间各种扩展Mapper实现,接近于最全的游戏支持。实测,高倍速加速游戏的同时(几百fps),且进行网络同步,性能一致,完全同步)
|
||||||
|
|
||||||
~~My Nes~~ (功能全,但是性能局限,不作为主要使用,但已经移植纯.Net Standard2.0归档)
|
~~My Nes~~ (功能全,但是性能局限,不作为主要使用,但已经移植纯.Net Standard2.0归档)
|
||||||
|
|
||||||
@ -30,11 +32,25 @@
|
|||||||
|
|
||||||
目前其他跨平台联机,仅限于电脑和手机
|
目前其他跨平台联机,仅限于电脑和手机
|
||||||
|
|
||||||
#### 2.良好体验为目标
|
#### 2.自动化联机
|
||||||
|
|
||||||
以现代化联机方式作为基本方向
|
玩家不用关心任何诸如IP或者任何联机配置,直接玩。服务器是直接提供的,玩家无感知。
|
||||||
|
|
||||||
#### 3.各种有意义的探索(作为额外功能)
|
甚至不用手动创建房间,游玩就是房间。加入放也不用专门下载,直接选择房间之后,自动化下载完成游戏并进入游戏。
|
||||||
|
|
||||||
|
#### 3.柔性网络架构
|
||||||
|
|
||||||
|
最终效果,不会出现延迟高时的卡顿和暂停等待,也不会出现房间创建者和加入者之间 因网络状况差异造成体验差异,保证公平。
|
||||||
|
|
||||||
|
柔性指:根据网络延迟和木桶效应动态调整帧同步提前量。作为被动推帧。
|
||||||
|
|
||||||
|
核心原理是用刚好无限趋近于物理延迟本身的缓冲作,来抵消中间等待。
|
||||||
|
|
||||||
|
本来玩家的地理位置带来的物理延迟是不可抗因素,但我们把这部分拿利用起来对冲,任何耗时操作,队列,堆栈处理都在这部分完成。没有多余。
|
||||||
|
|
||||||
|
最终达到了除了物理延迟之外,没有任何浪费,并即便是网络状况极差时,仅表现为操作延迟,而不是其他一些模拟器的顿帧卡顿。且同步一致性得以保证。
|
||||||
|
|
||||||
|
#### 4.各种有意义的探索(作为额外功能,和联机无关)
|
||||||
|
|
||||||
应该是Unity引擎中对于模拟器内核的画面接入良好的范例
|
应该是Unity引擎中对于模拟器内核的画面接入良好的范例
|
||||||
|
|
||||||
@ -131,5 +147,3 @@ Mapper支持越多,通俗讲就是支持更多卡带。
|
|||||||
最终会继承到本项目中
|
最终会继承到本项目中
|
||||||
|
|
||||||
http://git.axibug.com/sin365/MAME.Core
|
http://git.axibug.com/sin365/MAME.Core
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user