我本来打算写一篇长篇大论的文章,但我会在这里总结一下:
我正在尝试通过 XNA 模仿 NES 的图形老式风格。但是,我的 FPS 很慢,试图修改每帧 65K 像素。如果我只是循环遍历所有 65K 像素并将它们设置为任意颜色,我会得到 64FPS。我为查找应该将哪些颜色放置在哪里而编写的代码,我得到了 1FPS。
我认为这是因为我的面向对象代码。
现在,我将事物分为大约六个类,包括 getter/setter。我猜我至少每帧调用 360K getter,我认为这是很多开销。每个类都包含包含自定义枚举、int、Color 或 Vector2D 字节的非/和-或一维或二维数组。
如果我将所有类组合成一个类,并直接访问每个数组的内容会怎样?代码看起来很乱,并抛弃了面向对象编码的概念,但速度可能会快得多。
我也不担心访问冲突,因为任何获取/设置数组中数据的尝试都将在块中完成。例如,所有对数组的写入都将发生在从它们访问任何数据之前。
至于强制转换,我说我使用的是自定义枚举、int、Color 和 Vector2D、字节。 在 .net Framework、XNA、XBox、C# 中使用和访问哪些数据类型最快?我认为不断铸造可能是这里放缓的原因。
此外,我没有使用数学来确定应该放置哪些索引数据,而是使用预先计算的查找表,因此我不必使用常数乘法、加法、减法、除法每帧。:)