小编jed*_*iah的帖子

用于在基于着色器的游戏中渲染的OO架构

在构建我的类看起来像这样的游戏引擎时,我一直在遇到这个问题:

interface Entity {
  draw();
}

class World {
  draw() {
    for (e in entities)
      e.draw();
  }
}
Run Code Online (Sandbox Code Playgroud)

这只是伪代码,大致显示绘图是如何发生的.每个实体子类都实现自己的绘图.世界以无特定顺序循环遍历所有实体,并告诉他们逐个绘制自己.

但是使用基于着色器的图形,这往往是非常低效或甚至是不可行的.每个实体类型可能都有自己的着色器程序.为了最小化程序更改,需要将每种特定类型的所有实体绘制在一起.简单类型的实体(如粒子)也可能希望以其他方式聚合其绘图,例如共享一个大的顶点数组.并且它通过混合变得非常毛茸茸,并且某些实体类型需要在某些时间相对于其他实体类型呈现,或者甚至在不同时间通过多次实现.

我通常最终得到的是每个实体类的某种渲染器单例,它保存所有实例的列表并一次性绘制它们.这并不是那么糟糕,因为它将绘图与游戏逻辑分开.但是渲染器需要确定要绘制的实体子集,并且需要访问图形管道的多个不同部分.这是我的对象模型往往变得混乱,有许多重复的代码,紧密耦合和其他坏事.

所以我的问题是:这种高效,多功能,模块化的游戏绘图的优秀架构是什么?

opengl oop graphics shader

11
推荐指数
2
解决办法
2717
查看次数

如何在Ruby中创建IO的自定义子类?

如何创建我自己的可替代IO的类,以便为某些接受IO类参数的代码重定向/捕获输入/输出?IO本身似乎与OS文件描述符耦合,我所知道的唯一一个模仿它的类没有子类化它是StringIO,它似乎只是重新实现了整个接口.

我认为该语言将提供一种直接的方式来做到这一点,但我找不到有关该主题的任何信息.是否有一个mixin在几个原语之上实现接口,就像Enumerable一样?

ruby

9
推荐指数
1
解决办法
1588
查看次数

C++函数用于整数除法,具有良好定义的舍入策略

我想要一些C++中的东西,它允许我使用指定的舍入行为进行有效的整数除法,如下所示:

div_down(-4,3)        ==> -2
div_up(4,3)           ==> 2
div_to_zero(-4,3)     ==> -1
div_to_nearest(5,3)   ==> 2
Run Code Online (Sandbox Code Playgroud)

我希望它能够在编译时检测目标机器的行为并生成适当的最佳实现.类似于模数的东西也会很好,在编译时抽象出负操作数的未定义行为.

这存在吗?

如果没有,有什么好办法呢?我可以想到几种可能的方法:

  • 尝试将它们实现为静态优化的单个表达式
  • 使用常量表达式来检测目标行为并从多个实现中进行选择,使用模板进行选择(但具体如何?)

c++ c++11

8
推荐指数
3
解决办法
3167
查看次数

这个Ruby方法调用最终可以不用**{}吗?

我有一个像这样定义的方法:

def woot(a = nil, b: nil)
  ...
end
Run Code Online (Sandbox Code Playgroud)

Hash实例传递给awhen 的最简单方法b是什么?

我试过了

woot(x: 1)
woot({x: 1})
h = {x: 1}
woot(h)
Run Code Online (Sandbox Code Playgroud)

但他们都提高了

ArgumentError: unknown keyword: x
Run Code Online (Sandbox Code Playgroud)

打电话的唯一方法是我弄清楚了

woot({x: 1}, **{})
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

ruby argument-passing

5
推荐指数
1
解决办法
102
查看次数

标签 统计

ruby ×2

argument-passing ×1

c++ ×1

c++11 ×1

graphics ×1

oop ×1

opengl ×1

shader ×1