Use Direct2D for CEF testing

This commit is contained in:
sardelka9515
2022-11-13 12:41:26 +08:00
parent 71195e93c2
commit 23e4151b2e
10 changed files with 211 additions and 47 deletions

View File

@ -6,6 +6,7 @@ using System.IO.MemoryMappedFiles;
using System.Runtime.Remoting; using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Ipc; using System.Runtime.Remoting.Channels.Ipc;
using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using CefSharp; using CefSharp;
using CefSharp.OffScreen; using CefSharp.OffScreen;
@ -35,16 +36,23 @@ namespace RageCoop.Client.CefHost
private static ActivatedClientTypeEntry _controllerEntry; private static ActivatedClientTypeEntry _controllerEntry;
private static IpcChannel _adapterChannel; private static IpcChannel _adapterChannel;
public static Action<string> OnCefMessage; public static Action<string> OnCefMessage;
private object _browser; private ChromiumWebBrowser _browser;
private MemoryMappedFile _mmf; private MemoryMappedFile _mmf;
private string _mmfName; private string _mmfName;
private CefProcessor _processor;
private SafeMemoryMappedViewHandle _mmfView; private SafeMemoryMappedViewHandle _mmfView;
private BufferMode _mode; private BufferMode _mode;
public IntPtr PtrBuffer { get; private set; } public IntPtr PtrBuffer { get; private set; }
public int FrameRate
{
get => _browser.GetBrowserHost().WindowlessFrameRate;
set => _browser.GetBrowserHost().WindowlessFrameRate = value;
}
public void Dispose() public void Dispose()
{ {
(_browser as ChromiumWebBrowser)?.Dispose(); _browser?.Dispose();
_mmf?.Dispose(); _mmf?.Dispose();
if (PtrBuffer != IntPtr.Zero) _mmfView?.ReleasePointer(); if (PtrBuffer != IntPtr.Zero) _mmfView?.ReleasePointer();
@ -153,28 +161,34 @@ namespace RageCoop.Client.CefHost
var adapter = new CefAdapter(); var adapter = new CefAdapter();
adapter.Register(id, mode, _mmfName); adapter.Register(id, mode, _mmfName);
_browser = new ChromiumWebBrowser(); _browser = new ChromiumWebBrowser();
((ChromiumWebBrowser)_browser).RenderHandler = new CefProcessor(size, adapter, PtrBuffer, mode); _browser.RenderHandler = _processor = new CefProcessor(size, adapter, PtrBuffer, mode);
while (_browser.GetBrowserHost() == null) Thread.Sleep(20); // Wait till the browser is actually created
Console.WriteLine("CefController created: " + size); Console.WriteLine("CefController created: " + size);
} }
public void LoadUrl(string url) public void LoadUrl(string url)
{ {
((ChromiumWebBrowser)_browser).LoadUrl(url); _browser.LoadUrl(url);
}
public void Resize(Size size)
{
_browser.Size = size;
_processor.Size = size;
} }
public void SendMouseClick(int x, int y, int modifiers, MouseButton button, bool mouseUp, int clicks) public void SendMouseClick(int x, int y, int modifiers, MouseButton button, bool mouseUp, int clicks)
{ {
var e = new MouseEvent(x, y, (CefEventFlags)modifiers); var e = new MouseEvent(x, y, (CefEventFlags)modifiers);
((ChromiumWebBrowser)_browser).GetBrowserHost() _browser.GetBrowserHost()
?.SendMouseClickEvent(e, (MouseButtonType)button, mouseUp, clicks); ?.SendMouseClickEvent(e, (MouseButtonType)button, mouseUp, clicks);
} }
public void SendMouseMove() public void SendMouseMove(int x, int y,bool leave=false)
{ {
// _browser.GetBrowserHost() ?.SendMouseMoveEvent(,); var e = new MouseEvent(x, y, 0);
_browser.GetBrowserHost()?.SendMouseMoveEvent(e,leave);
} }
public DateTime Ping() public DateTime Ping()
@ -203,7 +217,7 @@ namespace RageCoop.Client.CefHost
private MemoryMappedFile _mmf; private MemoryMappedFile _mmf;
private SafeMemoryMappedViewHandle _mmfView; private SafeMemoryMappedViewHandle _mmfView;
public int Id; public int Id;
public Size Size; public Size Size { get; private set; }
public CefAdapter() public CefAdapter()
{ {

View File

@ -10,6 +10,13 @@
</AllowedReferenceRelatedFileExtensions> </AllowedReferenceRelatedFileExtensions>
<Configurations>Debug;Release</Configurations> <Configurations>Debug;Release</Configurations>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Remove="Resources\**" />
<EmbeddedResource Remove="Resources\**" />
<None Remove="Resources\**" />
<Page Remove="Resources\**" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="bg.png" /> <None Remove="bg.png" />
</ItemGroup> </ItemGroup>
@ -51,10 +58,6 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Resources\" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Costura.Fody" Version="5.7.0"> <PackageReference Include="Costura.Fody" Version="5.7.0">
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>

View File

@ -16,7 +16,7 @@ using System.Resources;
// Version informationr( // Version informationr(
[assembly: AssemblyVersion("1.5.7.351")] [assembly: AssemblyVersion("1.5.7.356")]
[assembly: AssemblyFileVersion("1.5.7.351")] [assembly: AssemblyFileVersion("1.5.7.356")]
[assembly: NeutralResourcesLanguageAttribute( "en-US" )] [assembly: NeutralResourcesLanguageAttribute( "en-US" )]

View File

@ -15,7 +15,7 @@ using System.Resources;
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
// Version information // Version information
[assembly: AssemblyVersion("1.5.8.32")] [assembly: AssemblyVersion("1.5.8.34")]
[assembly: AssemblyFileVersion("1.5.8.32")] [assembly: AssemblyFileVersion("1.5.8.34")]
[assembly: NeutralResourcesLanguageAttribute( "en-US" )] [assembly: NeutralResourcesLanguageAttribute( "en-US" )]

View File

@ -38,13 +38,53 @@
<Reference Include="BitmapUtil"> <Reference Include="BitmapUtil">
<HintPath>..\libs\BitmapUtil.dll</HintPath> <HintPath>..\libs\BitmapUtil.dll</HintPath>
</Reference> </Reference>
<Reference Include="PInvoke.Kernel32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\packages\PInvoke.Kernel32.0.7.124\lib\net46\PInvoke.Kernel32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.User32, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\packages\PInvoke.User32.0.7.124\lib\net45\PInvoke.User32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.Core, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\packages\PInvoke.Windows.Core.0.7.124\lib\net45\PInvoke.Windows.Core.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.ShellScalingApi, Version=0.7.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\packages\PInvoke.Windows.ShellScalingApi.0.7.124\lib\net45\PInvoke.Windows.ShellScalingApi.dll</HintPath>
</Reference>
<Reference Include="SharpD2D, Version=0.1.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\SharpD2D.0.1.1\lib\netstandard2.0\SharpD2D.dll</HintPath>
</Reference>
<Reference Include="SharpDX, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
<HintPath>..\..\packages\SharpDX.4.2.0\lib\net45\SharpDX.dll</HintPath>
</Reference>
<Reference Include="SharpDX.Direct2D1, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
<HintPath>..\..\packages\SharpDX.Direct2D1.4.2.0\lib\net45\SharpDX.Direct2D1.dll</HintPath>
</Reference>
<Reference Include="SharpDX.DXGI, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b4dcf0f35e5521f1, processorArchitecture=MSIL">
<HintPath>..\..\packages\SharpDX.DXGI.4.2.0\lib\net45\SharpDX.DXGI.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
<Reference Include="System.Drawing.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL"> <Reference Include="System.Drawing.Common, Version=4.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Drawing.Common.4.5.0\lib\net461\System.Drawing.Common.dll</HintPath> <HintPath>..\packages\System.Drawing.Common.4.5.0\lib\net461\System.Drawing.Common.dll</HintPath>
</Reference> </Reference>
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.Remoting" /> <Reference Include="System.Runtime.Remoting" />
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" /> <Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" /> <Reference Include="System.Data.DataSetExtensions" />
@ -52,8 +92,14 @@
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Validation, Version=2.4.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
<HintPath>..\..\packages\Validation.2.4.15\lib\net45\Validation.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="D2DWindow.cs">
<SubType>Component</SubType>
</Compile>
<Compile Include="Program.cs" /> <Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>

View File

@ -0,0 +1,45 @@
using System;
using SharpD2D.Drawing;
using SharpD2D.Windows;
using System.Windows.Forms;
using SharpDX.Direct2D1;
using Image = SharpD2D.Drawing.Image;
namespace CefTest
{
public class D2DMedia:Control
{
private Canvas _canvas;
private Image _img;
public D2DMedia()
{
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
Console.WriteLine("Initialize");
_canvas = new Canvas(Handle);
_canvas.SetupGraphics += _canvas_SetupGraphics;
_canvas.Initialize();
_canvas.DrawGraphics += _canvas_DrawGraphics;
}
private void _canvas_DrawGraphics(object sender, DrawGraphicsEventArgs e)
{
e.Graphics.BeginScene();
e.Graphics.DrawImage(_img,default(PointF));
e.Graphics.EndScene();
}
public void UpdateAndPaint(int width,int height,int pitch,IntPtr scan0,PixelFormat format)
{
_img.Update(width,height,pitch,scan0,format);
_canvas.SafeDraw();
}
private void _canvas_SetupGraphics(object sender, SetupGraphicsEventArgs e)
{
_img = e.Graphics.CreateImage();
}
}
}

View File

@ -1,9 +1,15 @@
using System.Drawing; using System;
using System.Drawing;
using System.Drawing.Imaging; using System.Drawing.Imaging;
using System.Security.Permissions; using System.Security.Permissions;
using System.Threading; using System.Threading;
using System.Windows.Forms; using System.Windows.Forms;
using RageCoop.Client.CefHost; using RageCoop.Client.CefHost;
using SharpDX.DXGI;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using AlphaMode = SharpDX.Direct2D1.AlphaMode;
using SharpD2D;
using SharpD2D.Windows;
namespace CefTest namespace CefTest
{ {
@ -12,36 +18,58 @@ namespace CefTest
[SecurityPermission(SecurityAction.Demand)] [SecurityPermission(SecurityAction.Demand)]
private static void Main(string[] args) private static void Main(string[] args)
{ {
CefController.Initialize(); WindowHelper.DisableScalingGlobal();
var thread = new Thread(() => TimerService.EnableHighPrecisionTimers();
{ CefController.Initialize(@"M:\SandBox-Shared\repos\RAGECOOP\RAGECOOP-V\bin\Debug\Client\SubProcess\RageCoop.Client.CefHost.exe");
var controller = CefController.Create(0, new Size(800, 600), out var adapter, BufferMode.Dirty); CefController.OnCefMessage += s => Console.WriteLine(s);
Application.Run(new Test(adapter, controller)); Test2();
}); }
thread.SetApartmentState(ApartmentState.STA);
thread.Start(); static void Test1()
var controller2 = CefController.Create(1, new Size(800, 600), out var adapter2, BufferMode.Full); {
Application.Run(new Test2(adapter2, controller2));
var controller2 = CefController.Create(1, new Size(1920, 1080), out var adapter2, BufferMode.Dirty);
Application.Run(new Test(adapter2, controller2));
}
private static void Test2()
{
var controller = CefController.Create(0, new Size(1920, 1080), out var adapter, BufferMode.Full);
controller.FrameRate = 60;
Application.Run(new Test2(adapter, controller));
} }
} }
internal class Test2 : Test internal class Test2 : Test
{ {
private D2DMedia _con;
public Test2(CefAdapter adapter, CefController controller) : base(adapter, controller) public Test2(CefAdapter adapter, CefController controller) : base(adapter, controller)
{ {
Text = "test2: full update"; Text = "test2: d2d";
_con = new D2DMedia { Size = Size };
Controls.Add(_con);
SizeChanged += (s, e) =>
{
_con.Size = Size;
};
_con.KeyDown += CefKeyDown;
_con.MouseDown += (s, e) => MouseKey(e, false);
_con.MouseUp += (s, e) => MouseKey(e, true);
_con.MouseMove += (s, e) => controller?.SendMouseMove(Cursor.Position.X, Cursor.Position.Y - (Height - ClientRectangle.Height));
} }
protected override void CefPaint(int bufferSize, Rectangle dirtyRect) protected override void CefPaint(int bufferSize, Rectangle dirtyRect)
{ {
lock (_adapter) try
{ {
var size = _adapter.Size;
var draw = new Bitmap(size.Width, size.Height, size.Width * 4, PixelFormat.Format32bppArgb, lock (_adapter)
_adapter.PtrBuffer); {
_graphics.DrawImage(draw, Point.Empty); var size = _adapter.Size;
draw.Dispose(); _con.UpdateAndPaint(size.Width, size.Height, size.Width * 4, _adapter.PtrBuffer, new SharpDX.Direct2D1.PixelFormat(Format.B8G8R8A8_UNorm, AlphaMode.Premultiplied));
}
} }
catch (Exception ex) { Console.WriteLine(ex); }
} }
} }
@ -54,23 +82,24 @@ namespace CefTest
public Test(CefAdapter adapter, CefController controller) public Test(CefAdapter adapter, CefController controller)
{ {
Text = "test1: partial update"; Text = "test1: partial update";
AutoScaleMode = AutoScaleMode.None;
Application.EnableVisualStyles();
Size = adapter.Size; Size = adapter.Size;
_adapter = adapter; _adapter = adapter;
_controller = controller; _controller = controller;
_adapter.OnPaint += CefPaint; _adapter.OnPaint += CefPaint;
controller.LoadUrl("https://www.youtube.com/watch?v=w3rQ3328Tok"); controller.LoadUrl("https://www.youtube.com/watch?v=LXb3EKWsInQ");
KeyDown += TestForm_KeyDown; KeyDown += CefKeyDown;
MouseClick += TestForm_MouseClick; MouseDown += (s, e) => MouseKey(e, false);
MouseUp += (s, e) => MouseKey(e, true);
MouseMove += (s, e) => controller?.SendMouseMove(Cursor.Position.X, Cursor.Position.Y - (Height - ClientRectangle.Height));
BackColor = Color.AliceBlue; BackColor = Color.AliceBlue;
_graphics = CreateGraphics(); _graphics = CreateGraphics();
AutoScaleMode = AutoScaleMode.None;
SizeChanged += (s, e) => _controller.Resize(ClientRectangle.Size);
} }
private void TestForm_MouseClick(object sender, MouseEventArgs e) public void MouseKey(MouseEventArgs e, bool up)
{ {
_controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), false, 1); _controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), up, 1);
_controller?.SendMouseClick(e.X, e.Y, 0, GetFrom(e.Button), true, 1);
} }
public static MouseButton GetFrom(MouseButtons b) public static MouseButton GetFrom(MouseButtons b)
@ -85,9 +114,23 @@ namespace CefTest
} }
} }
private void TestForm_KeyDown(object sender, KeyEventArgs e) public void CefKeyDown(object sender, KeyEventArgs e)
{ {
if (e.KeyCode == Keys.R) _controller.LoadUrl("https://www.youtube.com/watch?v=x53lfkuP044/"); if (e.KeyCode == Keys.R) _controller.LoadUrl("https://www.youtube.com/watch?v=x53lfkuP044/");
else if (e.KeyCode == Keys.F11)
{
if (WindowState != FormWindowState.Maximized)
{
FormBorderStyle = FormBorderStyle.None;
WindowState = FormWindowState.Maximized;
}
else
{
FormBorderStyle = FormBorderStyle.Sizable;
WindowState = FormWindowState.Normal;
}
}
} }
protected virtual void CefPaint(int bufferSize, Rectangle dirtyRect) protected virtual void CefPaint(int bufferSize, Rectangle dirtyRect)

View File

@ -1,5 +1,18 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="System.Drawing.Common" version="4.5.0" targetFramework="net48" /> <package id="PInvoke.Kernel32" version="0.7.124" targetFramework="net48" />
<package id="PInvoke.User32" version="0.7.124" targetFramework="net48" />
<package id="PInvoke.Windows.Core" version="0.7.124" targetFramework="net48" />
<package id="PInvoke.Windows.ShellScalingApi" version="0.7.124" targetFramework="net48" />
<package id="SharpD2D" version="0.1.1" targetFramework="net48" />
<package id="SharpDX" version="4.2.0" targetFramework="net48" />
<package id="SharpDX.Direct2D1" version="4.2.0" targetFramework="net48" />
<package id="SharpDX.DXGI" version="4.2.0" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Drawing.Common" version="4.5.0" targetFramework="net48" />
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="Validation" version="2.4.15" targetFramework="net48" />
</packages> </packages>

Binary file not shown.

Binary file not shown.