这有点困难,我感到有些困惑.我已经查看了stackoverflow,但没有解决方案似乎对我来说很好.
我想做的事:
val file = checkcache(fileName)
file match
{
case Some(_) => {println(s"File $file found!"); file.get}
case None => createFile(fileName)
}
Run Code Online (Sandbox Code Playgroud)
现在,这对于名为"blubb"的文件来说非常合适,该文件已经存在于缓存中
找到blubb文件
并返回文件.
现在我希望这样
文件"blubb"找到了
所以我尝试这样做:
case Some(_) => { println(s"File \" $file \" found!"); file.get}
Run Code Online (Sandbox Code Playgroud)
编译器抛出
')'期望但字符串文字被发现.
为什么这样,我如何正确地逃避双引号,并且最好在$ file-variable之后或之前没有空格?
据我所知:VAO代表某种状态.如果我绑定一个VAO,添加一些VBO和元素缓冲区用于指示和东西我可以保存我想要绘制和激活的对象的某个状态,并在我想要渲染内容时稍后在路上绘制它们.对?
因此,VBO保存实际数据,而VAO只是一个"包装器对象",它保存指向我为其定义的所有缓冲区的指针?
改变VAO是昂贵的(正如改变VBO一样?!).目前我加载Meshes并将它们组合到模型中.每个模型使用它自己的VAO并且具有VBO(带有顶点)和带有索引的元素缓冲区.
现在我理解这一点,这是废话,因为我的世界中的每个对象(有一个模型)都使用它自己的VAO.对于我这个世界中的~30个对象来说不是问题,但是我想要做到这一点,并且将来可能会有数百或数千个对象,然后性能会大幅下降.
因此,就其模型而言,许多对象是"相同的".我的意思是,例如,如果你在世界上有某种树型,你可能会多次使用相同的模型,只是在不同的位置.
现在我该怎么做呢?我应该手动跟踪我的VAO,如:(伪代码跟随!)
treesVAOId = 1;
rabbitsVAOId = 2;
Run Code Online (Sandbox Code Playgroud)
然后,如果我加载一个模型,只需检查ID是否已被绑定(如何?)并在那里添加另一组VBO(甚至添加到正确的VBO?如果是这样,怎么样?)
我在想这里的大型比赛.让我们假设游戏中有数千个角色.当然不是所有这些都是同时渲染的,但我无法为它们中的每一个创建VAO和VBO,是吗?
我觉得有更多的部分缺失...就像实例化和再次使用(或多或少)相同的数据为不同的目的有效.
这是我缺少的一步,如何在现实世界中真正优化VAO和VBO的使用.
我已经手动构建了一个方法,该方法需要2个数组,并将它们组合为1个,如下所示:
a0,a1,a2,b0,b1,a3,a4,a5,b2,b3,a6,...
Run Code Online (Sandbox Code Playgroud)
因此,我总是采用第一个数组的3个元素,然后选择第二个数组的2个元素。如我所说,我是手动构建该函数的。
现在,我想我可以在的帮助下将其变成单线zip。问题在于,仅凭zip是不够的,因为zip会构建类似的元组(a0, b0)。
我当然可以flatMap这个,但仍然不是我想要的:
val zippedArray: List[Float] = data1.zip(data2).toList.flatMap(t => List(t._1, t._2))
Run Code Online (Sandbox Code Playgroud)
这样,我会得到一个List(a0, b0, a1, b1,...),仍然不是我想要的。(然后我将toArray用于列表...现在更方便地使用List)
我考虑过使用take,drop但是它们返回的是新的数据结构,而不是修改旧的数据结构,因此并不是我真正想要的。
可以想象,我还没有真正从事函数式编程。我确实使用它,并且看到了巨大的好处,但是有些事情与我习惯的有很大不同。
请考虑以下代码:
case class Vector3(var x: Float, var y: Float, var z: Float)
{
def add(v: Vector3): Unit =
{
this.x += v.x
this.y += v.y
this.z += v.z
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,case class持有可变状态.这样做是非常沮丧的,通常我同意并且绝对坚持这个"规则",但这里讲的是整个故事.
我正在使用Scala 从头开始编写一个小型3D游戏引擎.所以首先我考虑使用(更多)功能样式,但垃圾收集器会过于频繁.
想一想:我在测试游戏中有几十个实体.所有这些都有一个位置(Vector3),一个方向(Vector3),一个比例(Vector3)和一大堆矩阵.如果我要在这些类(Vector3和Matrix4)中运行并使它们不可变,我会每帧返回数百个新对象,导致巨大的fps损失,因为,让我们面对它,GC有其用途,但在游戏引擎和OpenGL ......不是那么多.
Vector3之前是一个类,但它现在是一个case类,因为代码中的某个地方我需要模式匹配.
那么,使用保持可变状态的案例类真的那么糟糕吗?
请不要不把它变成一个关于讨论"为什么你甚至可以使用Scala开发等项目吗?" 我知道可能有更好的替代方案,但我对用C++编写(又一个)引擎不感兴趣,我也不太愿意潜入Rust(还).
考虑以下代表"邻居"的循环
for(x <- -1 to 1; y <- -1 to 1)
{
// If we are in the current field, just get the one above
if((x == 0) && (y == 0)) y = 1 // Problem: Reassignment to val
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我将重新分配val编译错误.在Java中我会"继续"跳过它.
对此有什么优雅的解决方案?
val size: Int = o.getSize
size match
{
case MyObject.Size.small.id => println("Small")
case MyObject.Size.medium.id => println("Medium")
case _ => throw ne UnknownSizeException
}
Run Code Online (Sandbox Code Playgroud)
不会编译,我的IDE中出现了奇怪的错误,但这是因为我正在使用gradle和许多遗留Java代码我要逐步更新.
我仍然不确定,为什么这不起作用.小的id为1,Medium为2.
现在如果我像这样匹配:
case s: MyObject.Size.small.id => println("Small")
Run Code Online (Sandbox Code Playgroud)
符号id无法解析.
这是为什么?
如果我手动添加1和2,一切都像魅力.
编辑
我认为一个问题是.id从零开始,而我的大小从1开始(这里有意义,因为它是实际大小)
但仅此一点不可能是问题,可以吗?因为我无论如何都要匹配_.
但是我怎么能克服这个呢?
case MyObject.Size.small.id + 1 => println("Won't work!")
Run Code Online (Sandbox Code Playgroud)
编辑:我的实际解决方案,感谢Sascha Kolberg
MyObject.Size(size+1) match
{
case MyObject.Size.SMALL => ...
...
}
Run Code Online (Sandbox Code Playgroud) 所以我关注:http://slick.typesafe.com/doc/3.0.2/gettingstarted.html现在我想使用案例类而不是将每个模型定义为元组.
所以我有:
case class Character(id: Long, foreName: String, middleNames: String, lastName: String, age: Int)
//class Characters(tag: Tag) extends Table[(Int, String, String, String, Int)](tag, "characters")
class Characters(tag: Tag) extends Table[Characters](tag, "characters")
{
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def foreName = column[String]("forename")
def middleNames = column[String]("middlenames")
def lastName = column[String]("lastname")
def age = column[Int]("age")
// def * = (id, foreName, middleNames, lastName, age)
def * = (id, foreName, middleNames, lastName, age) <> (Character.tupled, Character.unapply _)
}
Run Code Online (Sandbox Code Playgroud)
但我得到: …
我的sbt中有多个子项目,一个是服务器(基于playframework),另一个是clientside(scala.js),第三个是protobuf(scalapb)形式的两者之间的通信.
现在,这是我的build.sbt:
lazy val generalSettings = Seq(
organization := "tld.awesomeness",
version := "0.0.1",
scalaVersion := "2.12.1"
)
val CrossDependencies = new
{
val scalaTest = "org.scalatest" %% "scalatest" % "3.0.1" % "test"
val scalactic = "org.scalactic" %% "scalactic" % "3.0.1"
val scalaTags = "com.lihaoyi" %% "scalatags" % "0.6.2"
}
lazy val proto = (project in file("modules/proto"))
.settings(generalSettings: _*)
.settings(
PB.targets in Compile := Seq(
scalapb.gen() -> (sourceManaged in Compile).value
),
// If you need scalapb/scalapb.proto or anything from …Run Code Online (Sandbox Code Playgroud) 我有一个"接口"作为.h文件,有一个像这样的虚拟方法:
class ISomeInterface {
public:
virtual std::shared_ptr<Parent> getX() = 0;
}
Run Code Online (Sandbox Code Playgroud)
既然父是"抽象"的,在接口的实现者中我使用的是实际的类.所以我想这样做:
class Implementor : public ISomeInterface {
public:
std::shared_ptr<Child> getX() = { return this->x; }
}
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
无法将'((Implementor*)this' - > Implementor :: parent'从'std :: shared_ptr'转换为'std :: shared_ptr'
因此,基本上在std :: shared_ptr的是一个包装和编译器不知道如何来自wrapper<apple>于wrapper<fruit>,即使苹果延伸水果.
我该如何规避这种行为?
编辑:看起来这在c ++中仍然不可能,因为协变类型只适用于指针/引用,而不是像std :: shared_ptr这样的包装器...一个耻辱:(
基本上,我要实现的是以下各项的组合:
Slick 3.0.0数据库不可知论 和 Slick 3可重用的通用存储库
实际上,我做了很多尝试,但是根本无法使用。
abstract class BaseModel[T <: slick.lifted.AbstractTable[_]](query: TableQuery[T], val driver: JdbcProfile, val dbTableName: String)
{
lazy val all: TableQuery[T] = TableQuery[T]
import driver.api._
def createTable = all.schema.create
def dropTable = all.schema.create
abstract class BaseTable[B](val tag: Tag) extends Table[B](tag, dbTableName)
{
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这里已经有一个问题:
def createTable = all.schema.create和dropTable...-> 相同,schema在这里无法解决,尽管我之前已导入驱动程序。
但是,当我将其子类化时,会出现一个更大的问题:
这是代码
class NodeModel(driver: JdbcProfile, dbTableName: String) extends BaseModel[NodeTable](TableQuery[NodeTable], driver, dbTableName) {
val dbDriver = driver …Run Code Online (Sandbox Code Playgroud)