游戏引擎如何有效地处理和绘制给定显示器中的像素?
作为一个个人项目/练习,我已经开始开发一个用Java编写的简单的游戏引擎,但是遇到了一个问题,那就是如何高效、快速地更新游戏窗口中的像素。
自从我决定在NES‘(如果我没记错的话,在60 the保持256×240的分辨率)的基础上对这个引擎建模,我很快就创建了一个像素阵列。
虽然已经认为循环遍历数组并在该循环中绘制像素不是处理此任务的最佳方法,但它的性能比我所想的还要糟糕。
我的方法只能在CPU使用率为30%和GPU为40%的情况下每秒产生100帧。
鉴于当时系统的功率有限,NES / 6502芯片的早期程序员是如何完成绘制显示器的任务的,还是说这真的是解决这个问题的最有效方法?
发布于 2019-01-05 13:00:37
现代发动机中的大部分二维图形实际上都是伪装的三维图形。现代GPU是为3D绘制而优化的,但从直角观看的三维矩形只是2D透视图中的一幅图片。
最后,大多数引擎将二维精灵视为无深度的三维物体,并使用无深度坐标的GPU (正交投影 )绘制。这意味着像素艺术品作为纹理加载在GPU的内存中,然后在屏幕上绘制为纹理化的四角体。绘制到显示器的所有艰苦工作都由GPU处理。
大多数框架(例如Monogame)或引擎(Unity)抽象了这个3D翻译,因此程序员只需要在2D空间中工作。
即使在旧的系统中,如NES或C64,内存中也有一个叫做“视频内存”的区域。在内存空间中写入将导致屏幕上的直接结果。NES有自己的GPU (理光RP2C07),它提供了NES的图形功能--所以不仅仅是MOS6502在做图形。同样,C64在MOS6510旁边有一个维克-II芯片。
这些芯片还增加了特殊的图形功能--例如硬件精灵;可以放置在屏幕上任何地方的小图形,但有一些限制(通常是大小、颜色和总数或每y坐标中的精灵数)。其他系统有特定的硬件将内存块移动到视频存储器(如闪蒸)- -软件精灵。
因此,即使是在“旧”电脑/控制台中,也有一些东西可以绘制图形。
https://gamedev.stackexchange.com/questions/166817
复制相似问题