gpt4 book ai didi

c# - cosmos 中奇怪的 GUI 问题

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:17 24 4
gpt4 key购买 nike

当我执行 display.init() 时,我得到了这些白线和其他一些不同的像素。接下来发生的事情是它们一次消失一行,这会阻止我的 VGA 启动。

我将发布我的内核代码和显示驱动程序。

显示驱动 C#

using Cosmos.HAL;
using Sys = Cosmos.System;
namespace Display
{
public class DisplayDriver
{

protected VGAScreen screen;
private int width, height;

public DisplayDriver()
{
screen = new VGAScreen();
}

public void init()
{
screen.SetGraphicsMode(VGAScreen.ScreenSize.Size320x200, VGAScreen.ColorDepth.BitDepth8);
screen.Clear(0);
width = screen.PixelWidth;
height = screen.PixelHeight;
}

public virtual void setPixel(int x, int y, int c)
{
if (screen.GetPixel320x200x8((uint)x, (uint)y) != (uint)c)
setPixelRaw(x, y, c);
}

public virtual byte getPixel(int x, int y)
{
return (byte)screen.GetPixel320x200x8((uint)x, (uint)y);
}

public virtual void clear()
{
clear(0);
}

public virtual void clear(int c)
{
screen.Clear(c);
}

public virtual void step() { }

public int getWidth()
{
return width;
}

public int getHeight()
{
return height;
}

public void setPixelRaw(int x, int y, int c)
{

screen.SetPixel320x200x8((uint)x, (uint)y, (uint)c);

}
}
}

内核:

using System;
using Sys = Cosmos.System;
using Display;
using Cosmos.Core;
using Cosmos.HAL;
using Cosmos.Common;
using Cosmos.Debug;
using Cosmos.IL2CPU;





namespace CosmosKernel3
{
public class Kernel : Sys.Kernel
{
protected override void BeforeRun()
{
Console.WriteLine("Booting VGADriver.");
try
{
var display = new DisplayDriver();
Console.WriteLine("ATTEMPTING");
display.init(); //init display
display.clear();
display.setPixel((int)40, 50, 60);



}
catch (Exception)
{
Console.WriteLine("Booting VGA failed. Booting into DOS mode.");
dosemergency();


}
}

protected override void Run()
{
boot();
while (true) ;
}
public static void boot()
{

}
public static void dosemergency()
{
Console.WriteLine("XENA DOS EMERGENCY MODE.");
Console.WriteLine("COMMANDS:");
Console.WriteLine("graphics -r (Graphics retry)");
String meow = Console.ReadLine();
if (meow == "graphics -r") ;
Console.WriteLine("Booting VGADriver.");
try
{
var display = new DisplayDriver();
display.init(); //init display
boot(); //boot
}
catch (Exception)
{
Console.WriteLine("Booting VGA failed. Booting into DOS mode.");
dosemergency();


}



}
}
}

截图:

enter image description here

无论如何,这已经发生了一段时间,我似乎无法弄清楚为什么会这样。帮助!

最佳答案

我不知道是不是太晚了,但是这个问题在 Cosmos 中很受欢迎,所以 future 的读者可能会找到这个答案。

您的代码是正确的。在与其中一位开发人员交谈后,他告诉我他们已经意识到了这个问题,它的发生是因为

current code [of Cosmos] uses delegates for pixelputting

如果您等待 1-2 分钟,屏幕将最终加载。

编辑:

我找到了一个大大加快这个过程的方法:从不打电话

Screen.clear()

函数

改为创建以下函数:

public void DrawFilledRectangle(uint x0, uint y0, int Width, int Height, int color)
{
for (uint i = 0; i < Width; i++)
{
for (uint h = 0; h < Height; h++)
{
setPixel((int)(x0 + i), (int)(y0 + h), color);
}
}
}

并替换

public virtual void clear(int c)
{
screen.Clear(c);
}

函数通过:

        public virtual void clear(int c)
{
//screen.Clear(c);
DrawFilledRectangle(0, 0, width, height, c);
}

还将 init 函数替换为:

public void init()
{
screen.SetGraphicsMode(VGAScreen.ScreenSize.Size320x200, VGAScreen.ColorDepth.BitDepth8);
width = screen.PixelWidth;
height = screen.PixelHeight;
clear(0);
}

哪个更快。祝你在创建操作系统时好运 :)

关于c# - cosmos 中奇怪的 GUI 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35446981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com