首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C#比Console.Write()更快的东西?

C#比Console.Write()更快的东西?
EN

Stack Overflow用户
提问于 2015-04-28 04:52:02
回答 3查看 10.2K关注 0票数 19

我正在制作一个游戏,并重新绘制游戏场,难道Console.Write()不是很好吗?我可以在不让它看起来“滞后”的情况下更快地重写整个字段吗?游戏场中几乎所有的东西都在移动,但是只有在与0不同的元素上才有对象。(您可以检查这里的完整代码,http://pastebin.com/TkPd37xD,看看我在说什么,如果我的描述不够)

代码语言:javascript
运行
AI代码解释
复制
for (int Y = 0; Y < playfield.GetLength(0); Y++)
{
    for (int X = 0; X < playfield.GetLength(1); X++)
    {
        //destroying the row when it reaches the top
        if (playfield[0, X] != 0)
        {
            for (int i = 0; i < playfield.GetLength(1); i++)
            {
                playfield[0, X] = 0;
                Console.SetCursorPosition(X, 0);
                Console.Write(" ");
            }
        }
        if (playfield[Y, X] == 3)
        {
            playfield[Y - 1, X] = 3;
            playfield[Y, X] = 0;
        }
        else if (playfield[Y, X] == 1)
        {
            Console.SetCursorPosition(X, Y - 1);
            Console.Write("=");
            playfield[Y - 1, X] = 1;
            Console.SetCursorPosition(X, Y);
            Console.Write(" ");
            playfield[Y, X] = 0;
        }
        else if (playfield[Y, X] == 0)
        {
            Console.SetCursorPosition(X, Y);
            Console.Write(" ");
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-04-30 06:08:11

基本上有两种方法:渲染更少,渲染更快。

渲染更少通常更棘手,但也倾向于不那么密集。经典的例子是Carmack的热衷游戏-- PC机没有勇气一次改变整个屏幕,所以Carmack确保只有屏幕上真正改变的部分才能重新绘制。在您的例子中,这可以很简单,就像检查新屏幕与旧屏幕一样(当然,不使用Console方法)--当然,这取决于您正在编写的游戏类型,这可以为您节省大量的工作。

渲染得更快通常更容易。在过去,通常的方法是直接访问输出缓冲区--而不是把游戏场放在单独的内存中,而是直接放在显卡中--当然,这样就可以根据需要重新绘制整个屏幕,因为否则你在CRT屏幕上就看不到太多了。该选项仍然可以作为向后兼容性进行访问,因此,如果您使用Turbo编写应用程序,您仍然可以使用它,但在C#中并不是那么容易访问。首先在StringBuilder中呈现整个屏幕,然后在Console.Write中同时呈现整个屏幕,有一个选项。它会更快一些,但它并不完全是恒星。char[]将为您提供一个额外的性能点--您可以将您的运动场直接表示为char[][],然后不必每次更改时都重新创建StringBuilder --您只需为每个运动场线路重新创建一次Console.Write即可。

当然,您可以在更改发生时立即写出它们;根据您正在编写的游戏的不同,这可以从“小而好的结果”到“非常难且看起来不太好”。由于控制台的缓冲区可能大于窗口大小,您甚至可以将其绘制到缓冲区的一个隐藏部分,然后使用Console.MoveBufferArea立即绘制整个更改--这通常称为“回退缓冲”。不过,我不确定它是否好看--现在的控制台窗口允许您在缓冲区中滚动,这对您的用例可能是有害的。

仍然有一些方法可以更快地访问控制台缓冲区,但在完全停留在.NET时却不是这样--您将需要使用P/调用。关于这个话题的一个很好的答案是在这里- How can I write fast colored output to Console?。在现代系统中,这几乎等同于一次使用后台缓冲区并“绘制”它--它非常快。再一次,你可以直接对你的游戏数据使用后台缓冲区--它在20-30年前就开始工作了,现在仍然有效;这是在使用有限的资源时的良好实践。你能不能写一个游戏,真正使用控制台文本缓冲区的一切,或至少几乎所有?玩这样的东西很有趣,你可以写很多这样的游戏,包括俄罗斯方块或者Lode。当然,这只会在Windows上工作,所以如果您想支持其他系统,就会遇到更棘手的问题。

最后,您可以编写自己的控制台(或者更好地使用已经编写和测试过的人)。这是一个很好的实践,如果您想要继续更大的挑战,随着时间的推移,它将允许您使用更强大的技术。典型的例子是像Dwarf堡垒这样的游戏--仍然是基于文本的,仍然是控制台的,但是实际上是用SDL这样的技术绘制的。这不仅大大加快了现代系统(因为你没有容易的方式来直接访问文本缓冲区),它还打开了选择,切换到图形平铺游戏相当容易。这是楼梯上的又一个踏脚石,用来冷却东西:)

票数 21
EN

Stack Overflow用户

发布于 2021-10-28 21:52:55

This incomplete answer to How can I write fast colored output to Console? (没有实现颜色)对于全窗口更新非常快,对于标准的120x30大小的System.Console窗口,只需要0.8ms:

代码语言:javascript
运行
AI代码解释
复制
int cols = Console.WindowWidth, rows = Console.WindowHeight;
//some sample text
byte[] buffer = Enumerable.Repeat((byte)'=', cols * rows).ToArray();
//because output appends, ensure the window is reset
Console.SetCursorPosition(0, 0);
using (Stream stdout = Console.OpenStandardOutput(cols * rows)) {
    stdout.Write(buffer, 0, buffer.Length);
}

下面是我1000次调用Write的性能:

如果您愿意进行p调用,那么可以通过使用this other answerWriteConsoleOutput来实现颜色(如CharInfoWriteConsoleOutput对相同问题的演示)。

这两种方法都适用于“反向缓冲”(即构建整个场景,然后显示它)。

更新:下面是我为处理颜色(also see)而提出的内容:

代码语言:javascript
运行
AI代码解释
复制
[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Unicode)]
public struct CharUnion {
    [FieldOffset(0)] public char UnicodeChar;
    [FieldOffset(0)] public byte AsciiChar;
}

[StructLayout(LayoutKind.Explicit, CharSet=CharSet.Unicode)]
public struct CharInfo{
    [FieldOffset(0)] public CharUnion Char;
    [FieldOffset(2)] public ushort Attributes;

public ConsoleColor ForegroundColor => (ConsoleColor)((this.Attributes & 0x0F));
public ConsoleColor BackgroundColor => (ConsoleColor)((this.Attributes & 0xF0) >> 4)

    public CharInfo(char character, ConsoleColor? foreground = null, ConsoleColor? background = null) {
        this.Char = new CharUnion() { UnicodeChar = character };
        this.Attributes = (ushort)((int)(foreground ?? 0) | (((ushort)(background ?? 0)) << 4));
    }
    public CharInfo(byte character, ConsoleColor? foreground = null, ConsoleColor? background = null) {
        this.Char = new CharUnion() { AsciiChar = character };
        this.Attributes = (ushort) ((int)(foreground ?? 0) | (((ushort)(background ?? 0)) << 4));
    }

    public static bool Equals(CharInfo first, CharInfo second) {
        return first.Char.UnicodeChar == second.Char.UnicodeChar
            && first.Char.AsciiChar == second.Char.AsciiChar
            && first.Attributes == second.Attributes;
    }
}
票数 3
EN

Stack Overflow用户

发布于 2015-04-30 04:31:36

另一种方法是使用链接https://msdn.microsoft.com/en-gb/library/windows/desktop/aa363362%28v=vs.85%29.aspx中指定的API调用。

代码语言:javascript
运行
AI代码解释
复制
[DllImport("kernel32.dll")]
static extern void OutputDebugString(string lpOutputString);

您还可以通过将for循环中的输出缓冲到StringBuilder中并在每个for循环之后输出,从而获得轻微的性能。这可能并不是必要的,这取决于您想要实现您的程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29920056

复制
相关文章
比pandas更快的库
是否发现pandas库在处理大量数据时速度较慢,并且希望程序运行得更快?当然,有一些使用pandas的最佳实践(如矢量化等)。本文讨论的内容将代码运行得更快,甚至超过采用最佳实践。
fanjy
2022/11/16
1.5K0
比读写锁更快的 StampedLock
我们先回顾上一篇 ReentrantReadWriteLock 读写锁,为什么有了 ReentrantReadWriteLock,还要引入 StampLock?
码哥字节
2020/03/24
9160
更快学会任何东西的终极指南
  如何缩短学习曲线这个课题已经被研究了几十年。其中讨论到的一些加速学习进程的核心原则这份指南都会讨论到。利用好这些原则,无论你学的是语言、乐器等等,都可以学得更快。 在当今我们生活的这个时代,如果你想过上一段非凡的人生,就得掌握快速学习这项本领。 —Anthony Robbins 不做重复工   我们学东西有个倾向是试图自己掌握,但是有个学会的人帮助可以节省你很多的时间和精力。   想想自己以前是怎么学语言或技能的。是不是一开始走了很多弯路?有了你的帮助,后面的人再学是不是就可以避免很多你犯过的错
Java学习123
2018/05/16
7510
PySpark|比RDD更快的DataFrame
DataFrame是一种不可变的分布式数据集,这种数据集被组织成指定的列,类似于关系数据库中的表。如果你了解过pandas中的DataFrame,千万不要把二者混为一谈,二者从工作方式到内存缓存都是不同的。
数据山谷
2020/11/09
2.2K0
PySpark|比RDD更快的DataFrame
比 SpringBoot 更快,更轻,更小!
Spring Boot总体来说,搭建还是比较容易的,特别是Spring Cloud全家桶,简称亲民微服务,但在发展趋势中,容器化技术已经成熟,面对巨耗内存的Spring Boot,小公司表示用不起。如今,很多刚诞生的JAVA微服务框架大多主打“轻量级”,主要还是因为Spring Boot太重。
民工哥
2022/10/27
1.1K0
比 SpringBoot更快,更轻,更小!
Spring Boot总体来说,搭建还是比较容易的,特别是Spring Cloud全家桶,简称亲民微服务,但在发展趋势中,容器化技术已经成熟,面对巨耗内存的Spring Boot,小公司表示用不起。如今,很多刚诞生的JAVA微服务框架大多主打“轻量级”,主要还是因为Spring Boot太重。
搜云库技术团队
2022/02/17
8110
比 SpringBoot更快,更轻,更小!
ag 比 grep 更快的搜索工具
1) unix https://github.com/ggreer/the_silver_searcher
lukachen
2023/10/22
1840
Java比优化的Rust程序更快
_________ Danyal Mh 嗨,起初,我是一个Rust程序员,并为它写了一些项目和一个框架,在听说动态编译技术后,JVM对我有吸引力,我用Rust写了一个程序,为编译器设置了许多优化标志以获得最佳性能,并在java中写了实例。 在热身时间过后,我看到JVM的表现令人惊讶,它是一头野兽,在性能上可以击败Rust。 Rust结果:10,648 _ 6,678 _ 8,274 Java结果: 8,661 _ 9,608 _ 6,302 平均12次的基准。 Rust: 9,948Java:8,693
IT大咖说
2022/03/04
7610
为什么 Promis 比setTimeout()更快?
先做一个实验:来看看立即解决的 Promis 和立即超时( 0 毫秒的超时)哪个执行的更快?
疯狂的技术宅
2021/01/28
7480
比 Bert 体积更小速度更快的 TinyBERT
本文作者:chenchenliu&winsechang,腾讯 PCG 内容挖掘工程师 TinyBERT 是华为不久前提出的一种蒸馏 BERT 的方法,本文梳理了 TinyBERT 的模型结构,探索了其在不同业务上的表现,证明了 TinyBERT 对复杂的语义匹配任务来说是一种行之有效的压缩手段。 一、简介 在 NLP 领域,BERT 的强大毫无疑问,但由于模型过于庞大,单个样本计算一次的开销动辄上百毫秒,很难应用到实际生产中。TinyBERT 是华为、华科联合提出的一种为基于 transforme
腾讯技术工程官方号
2019/12/03
1.7K0
比 Bert 体积更小速度更快的 TinyBERT
比快更快,Elasticsearch 8.0 正式发布!
Elastic 官方宣告:从此 Elastic 进入速度、规模、相关性和简单性的新时代!
铭毅天下
2022/04/06
3.8K1
比快更快,Elasticsearch 8.0 正式发布!
[译] 预览 C# 10 的新东西
本周早些时候(译注:原文发表于5月1日),我关注了 Mads Torgersen[5] 在DotNet SouthWest[6] 大会上的演讲[7],他是微软的 C# 语言的首席设计师。他概述了 C# 10 即将包含的很酷的一些新东西。让我们来快速浏览一下。
zls365
2021/10/19
4150
比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!
首先介绍下RedisMod这个东西,它是一系列Redis的增强模块。有了RedisMod的支持,Redis的功能将变得非常强大。目前RedisMod中包含了如下增强模块:
macrozheng
2022/04/12
1.5K0
比 Elasticsearch 更快!RediSearch + RedisJSON = 王炸!
Python可以比C++更快,你不信?
Python 是一个用途非常广泛的编程语言,拥有成千上万的第三方库,在人工智能、机器学习、自动化等方面有着广泛的应用,众所周知,Python 是动态语言,有全局解释器锁,比其他静态语言要慢,也正是这个原因,你也许会转向其他语言如 Java、C++,不过先等等,今天分享一个可以让 Python 比 C++ 还要快的技术,看完再决定要不要转吧。
somenzz
2021/04/16
9740
用CUDA写出比Numpy更快的规约求和函数
在前面的几篇博客中我们介绍了在Python中使用Numba来写CUDA程序的一些基本操作和方法,并且展示了GPU加速的实际效果。在可并行化的算法中,比如计算两个矢量的加和,或者是在分子动力学模拟领域中的查找近邻表等等,都是可以直接并行的算法,而且实现起来难度不大。而有一种情况是,如果我们要计算的内容的线程之间互相存在依赖,比方说最常见的,计算一个矩阵所有元素的和。
DechinPhy
2021/09/08
9430
StampedLock,一种比读写锁更快的锁!
最近公司的事情比较多,拖了很久的书稿终于和猫大人一起在这个周末写完了,总体就一个字:累。剩下的就是对稿件的修修补补了,后面的进度就应该会很快了。前段时间原本想着续更【精通高并发系列】专题,一直没时间,所以,这个事情也被一直搁浅着。现在,书稿写完了,就有一些时间续更这个专题了。之前,我把【精通高并发系列】专题的文章整理成了一本电子书——《深入理解高并发编程》,全书内容如下所示。
冰河
2021/07/20
5840
Google 开源的依赖注入库,比 Spring 更小更快!
Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。
芋道源码
2021/01/25
9650
Google 开源的依赖注入库,比 Spring 更小更快!
Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快。Elasticsearch大量使用了Guice,本文简单的介绍下Guice的基本概念和使用方式。
良月柒
2020/02/21
1.1K0
什么东西比地球上的沙子还要多?
很多人都听过科学家说宇宙中的星球比地球上的沙子还多,宇宙中有多少星球呢?根据美国国家科学院数据可知,目前宇宙中恒星数量为3*10^22,恒星只是众多星球类别中的一种。
边缘计算
2019/11/29
8870
点击加载更多

相似问题

Phonegap:比touchstart()函数更快的东西?

14

比get_headers()更快的东西

23

比std::nth_element更快的东西

24

Python -比2嵌套的循环更快的东西

23

比simplexml_load_file() PHP更快的东西

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档